我有一个整数列表,想要连续相减。我希望能够将代码用于任何大小的整数列表,即使我不知道整数的数量。
我到目前为止:
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
时,是否应该只使用break
子句和IndexError
进行循环?
答案 0 :(得分:3)
比显式循环或reduce
更简单,更快速的解决方案:意识到a - b - c - ... - n
等效于a - (b + c + ... + n)
,因此您可以使用sum
函数(在C层用于适合C long
的总和,只有在C int
溢出的情况下,才退回到更昂贵的Python级别long
。
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
所缺乏的副本的开销不断增加),但是更长的输入所节省的成本将弥补这一不足。
答案 1 :(得分:1)
您可以将functools.reduce
与operator.sub
一起使用
child_process
这大致等于
from operator import sub
from functools import reduce
a = [10, 9, 8]
reduce(sub, a)
# -7
答案 2 :(得分:1)
基于预期的-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)
答案 3 :(得分:0)
from functools import reduce
num=[100,20,30,12,15,10]
print(reduce(lambda x,y:x-y,num))
答案 4 :(得分:0)
如果您只是在整个列表的总结果之后(即 [10,9,8]
的结果是 -7
而不是 [10, 1, -7]
的结果),那么您只需要减去第一项之后所有值的总和。减法的顺序无关紧要。
import numpy as np
a = [10, 9, 8]
sub = a[0] - np.sum(a[1:])
如果您想要累积结果(即 [10, 1, -7]
的结果),请使用 cumsum
函数:
sub = np.append(a[0], a[0] - np.cumsum(a[1:]))