Python代码求满足条件的和

7
任务如下:对列表中的偶数索引元素求和,然后将结果乘以该列表的最后一个元素。我在Python中有这样一行解决方案代码。
array = [-37,-36,-19,-99,29,20,3,-7,-64,84,36,62,26,-76,55,-24,84,49,-65,41] 
print sum(i for i in array if array.index(i) % 2 == 0)*array[-1] if array != [] else 0

我的结果是-1476(计算公式为:41*(-37-19+29+3-64+36+26+55+84-65))

正确的结果是1968。

我无法理解为什么在这种情况下这段代码不能正常工作。

3个回答

9
这就是你要找的内容:
array[-1] * sum(array[::2])

array[::2]会以步长为2从第一个索引遍历数组,也就是说,每隔一个数取一个。而sum(array[::2])可以得到原始列表中所有间隔数的总和。

只有当你确定列表没有重复时,使用index才能正常工作,这就是为什么你的代码无法给出正确结果的原因。


这是一种优雅的解决方案。 - beistvan

6

列表中有重复元素84,因此array.index的工作方式不符合您的预期。此外,您的代码具有二次复杂度,这是不必要的。

要以最小的编辑量修复您的代码,它将类似于以下内容:

array = [-37,-36,-19,-99,29,20,3,-7,-64,84,36,62,26,-76,55,-24,84,49,-65,41] 
print sum(array[i] for i in range(len(array)) if i % 2 == 0)*array[-1] if array != [] else 0

是的,那就是原因。 - laike9m
从文档中:array.index(i) 返回最小的i,使得i是数组中第一次出现x的索引 - laike9m
我明白了。这就是导致错误的重复元素_84_。谢谢! - beistvan

5
>>> sum(x for i, x in enumerate(array) if not i % 2)*array[-1] 
1968

使用内置的enumerate函数,因为列表中有重复元素,list.index(x)返回第一个等于x的元素的索引(如文档中所述)。还要查看enumerate的文档。

1
你太快了。你可以用if not i % 2,这更符合Python的风格。 - anon582847382
1
我会认为array[::2]更符合Python的风格 :) - shaktimaan
@traceur,我认为这是一个有趣的解决方案,它使用了带条件的for循环。 - beistvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接