Python 减去列表中的元素
我有一个整数列表,我想按连续的顺序相互减去。我希望能够将代码用于任何大小的整数列表,即使我不知道整数的数量 到目前为止我所做的:Python 减去列表中的元素,python,python-3.x,list,loops,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,从中
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
跳出循环
这大致相当于
a = [10, 9, 8]
accumulator = a[0]
for x in a[1:]:
accumulator -= x
print(accumulator)
# -7
你可以和我一起使用
这大致相当于
a = [10, 9, 8]
accumulator = a[0]
for x in a[1:]:
accumulator -= x
print(accumulator)
# -7
根据预期的-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)
a=[10,9,8]#带有3个整数的示例列表
sub=a[0]
对于枚举(a)中的i,n:
如果i<(len(a)-1):
sub=sub-a[i+1]
打印(sub)
根据您的预期输出-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)
a=[10,9,8]#带有3个整数的示例列表
sub=a[0]
对于枚举(a)中的i,n:
如果i<(len(a)-1):
sub=sub-a[i+1]
打印(sub)
比显式循环或reduce更简单、更快的解决方案:认识到a-b-c-n
相当于a-(b+c+…+n)
,因此您可以使用sum
函数(该函数在c层针对适合clong
的和进行了优化,如果溢出clong
,则只会返回到更昂贵的Python级别int
s)
注意:这将创建大部分a
的浅拷贝,并且需要序列类型(以支持索引/切片),而不是任何iterable。您可以使用稍长的代码解决这两个问题:
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)
对于较小的输入列表
s(iter
/next
的固定开销略大于索引/切片的固定开销,尽管切片的复制开销越来越大,而iter
/next
缺少此开销),但是在更长的输入上的节省将远远弥补它。比显式循环或reduce更简单、更快的解决方案:认识到a-b-c-n
相当于a-(b+c+…+n)
,因此您可以使用sum
函数(该函数在c层针对适合clong
的和进行了优化,如果溢出clong
,则只会返回到更昂贵的Python级别int
s)
注意:这将创建大部分a
的浅拷贝,并且需要序列类型(以支持索引/切片),而不是任何iterable。您可以使用稍长的代码解决这两个问题:
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)
对于较小的输入列表
s(iter
/next
的固定开销略大于索引/切片的固定开销,尽管切片的复制开销越来越大,而iter
/next
缺少此开销),但是,在更长的投入上节省下来的钱将远远弥补它。非常简洁!我听说过reduce()
,但以前从未使用过!谢谢分享。非常简洁!我听说过reduce()
,但以前从未使用过!谢谢分享。是的,我在发帖子后意识到我的逻辑是错误的;我应该保持跑步的差异,而不是连续的差异。你写的if
语句也是我要找的!谢谢注意:在每个循环上测试i
是以牺牲常见情况为代价优化不常见情况。将a[1:]:sub-=x
中的x的循环更改为,或将范围(1,len(a))中的i的循环更改为:sub-=a[i]
,甚至只是将循环包装为try/except indexer:pass
将以更低的开销实现相同的效果(对除第一个值以外的所有值进行操作)(Python级别的数学、len
检查和索引都比您预期的有更高的开销)。是的,我在发布后意识到我的逻辑是错误的;我应该保留运行的差异,而不是连续的差异。您的if
语句行也是我搜索的!谢谢!注意:测试I
以牺牲常见情况为代价,针对不常见情况进行优化。将a[1:]:sub-=x
中的x的循环更改为,或范围(1,len(a)):sub-=a[i]
中的i的循环更改为,甚至仅将循环包装为try/except indexer:pass
,都会达到相同的效果(操作除第一个以外的所有值)的开销要低得多(Python级别的数学、len
检查和索引都比您预期的要高)。我看到了您关于a-(b+c+…+n)
的逻辑,这肯定是我做的