Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 减去列表中的元素_Python_Python 3.x_List_Loops - Fatal编程技术网

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层针对适合c
long
的和进行了优化,如果溢出c
long
,则只会返回到更昂贵的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层针对适合c
long
的和进行了优化,如果溢出c
long
,则只会返回到更昂贵的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)
的逻辑,这肯定是我做的