减去列表元素

时间:2018-08-15 22:12:25

标签: python python-3.x list loops

我有一个整数列表,想要连续相减。我希望能够将代码用于任何大小的整数列表,即使我不知道整数的数量。

我到目前为止:

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进行循环?

5 个答案:

答案 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.reduceoperator.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:]))