首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减除列表元素

减除列表元素
EN

Stack Overflow用户
提问于 2018-08-15 22:12:25
回答 5查看 3.3K关注 0票数 0

我有一个整数列表,我想以连续的顺序互相减除。我希望能够对任意大小的整数列表使用代码,即使我不知道整数的数量。

我到目前为止所做的:

代码语言:javascript
复制
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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-08-15 22:24:44

根据您预期的-7输出,您需要在当前使用的元素之前减去运行中的差异,而不是a[i] - a[i+1]

就索引问题而言,可以通过添加一个逻辑检查来解决它,通过将端点设为len(a) - 1来确保数组中有剩余的元素。

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2018-08-15 23:41:03

比显式循环或reduce更简单、更快的解决方案:认识到a - b - c - ... - n等同于a - (b + c + ... + n),因此您可以使用sum函数(在C层对适合于C long的和进行优化,只有在超出Clong时才会返回到更昂贵的Python级别int)。

代码语言:javascript
复制
a = [10, 9, 8]  # Example list with 3 integers
sub = a[0] - sum(a[1:])
print(sub)

注意:这使得大多数a的浅表副本,并且需要一个序列类型(以支持索引/切片),而不是任何可迭代的。您可以用稍微长一点的代码来解决这两个问题:

代码语言:javascript
复制
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所缺乏的越来越大的复制开销),但更长的输入节省的费用将足以弥补这一不足。

票数 4
EN

Stack Overflow用户

发布于 2018-08-15 22:16:36

您可以使用functools.reduceoperator.sub

代码语言:javascript
复制
from operator import sub
from functools import reduce

a = [10, 9, 8]

reduce(sub, a)
# -7

这大致相当于

代码语言:javascript
复制
a = [10, 9, 8]

accumulator = a[0]
for x in a[1:]:
    accumulator -= x

print(accumulator)
# -7
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51867153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档