带条件求和的Python代码

7 投票
3 回答
39311 浏览
提问于 2025-04-18 01:36

这个任务是这样的:把列表中所有偶数位置的元素加起来,然后把这个结果乘以列表最后一个元素。我在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 个回答

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

使用内置的 enumerate 函数,因为你的列表中有重复的元素,而 list.index(x) 只会返回第一个等于 x 的元素的索引(就像在文档中提到的)。另外,也可以看看关于 enumerate 的文档。

9

这就是你想要的内容:

array[-1] * sum(array[::2])

array[::2] 是从数组的第一个位置开始,每隔一个位置取一个数,也就是每隔一个数字取一次。sum(array[::2]) 就是把原始列表中这些每隔一个取到的数字加起来。

使用 index 这个方法只有在你确定列表里没有重复数字的时候才会正常工作,这就是你代码无法得到正确结果的原因。

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

撰写回答