我有一个整数列表,我想以连续的顺序互相减除。我希望能够对任意大小的整数列表使用代码,即使我不知道整数的数量。
我到目前为止所做的:
a = [10, 9, 8] # Example list with 3 integers
sub = 0
for i, n in enumerate(a):
sub = a[i] - a[i+1]
print(sub)我期待的答案是-7因为:
10-9=1
然后1-8= -7
10和9分别是列表a的第一个和第二个元素。我减去它们得到1,然后取1,然后减去8 --列表中的第三个元素--从它得到-7。
相反,我得到一个错误,即列表索引超出了范围。我知道为什么要这样做:因为当i点击2时,i+1变成3,列表中没有a[3]元素。
然而,对于如此简单的事情,我似乎不知道如何获得这样的连续索引,特别是对于一个我不知道元素数量的列表。
我怎么才能解决这个问题?当我得到try-except时,我是否应该在循环中使用一个IndexError子句和break
发布于 2018-08-15 22:24:44
根据您预期的-7输出,您需要在当前使用的元素之前减去运行中的差异,而不是a[i] - a[i+1]。
就索引问题而言,可以通过添加一个逻辑检查来解决它,通过将端点设为len(a) - 1来确保数组中有剩余的元素。
a = [10, 9, 8] # Example list with 3 integers
sub = a[0]
for i, n in enumerate(a):
if i < (len(a) - 1):
sub = sub - a[i + 1]
print(sub)发布于 2018-08-15 23:41:03
比显式循环或reduce更简单、更快的解决方案:认识到a - b - c - ... - n等同于a - (b + c + ... + n),因此您可以使用sum函数(在C层对适合于C long的和进行优化,只有在超出Clong时才会返回到更昂贵的Python级别int)。
a = [10, 9, 8] # Example list with 3 integers
sub = a[0] - sum(a[1:])
print(sub)注意:这使得大多数a的浅表副本,并且需要一个序列类型(以支持索引/切片),而不是任何可迭代的。您可以用稍微长一点的代码来解决这两个问题:
a = [10, 9, 8] # Example list with 3 integers
aiter = iter(a) # Make iterator from any iterable
sub = next(aiter) - sum(aiter) # Pull first item from iterator, then pass rest to sum
print(sub)对于小输入list来说,这将是非常慢的( iter/next的固定开销略大于索引/切片的固定开销,尽管切片具有iter/next所缺乏的越来越大的复制开销),但更长的输入节省的费用将足以弥补这一不足。
发布于 2018-08-15 22:16:36
您可以使用functools.reduce和operator.sub
from operator import sub
from functools import reduce
a = [10, 9, 8]
reduce(sub, a)
# -7这大致相当于
a = [10, 9, 8]
accumulator = a[0]
for x in a[1:]:
accumulator -= x
print(accumulator)
# -7https://stackoverflow.com/questions/51867153
复制相似问题