用于求和的Python代码

时间:2014-04-06 15:08:13

标签: python list sum conditional-statements slice

任务如下:将列表元素与偶数索引相加,并将结果乘以最后一个列表的elemet。 我在Python中有这个oneliner解决方案代码。

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 个答案:

答案 0 :(得分:7)

这就是你要找的东西:

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

array[::2]以2为步长遍历从第一个索引到最后一个索引的数组,即每个备用数字。 sum(array[::2])从原始列表中获取备用数字的总和。

仅当您确定列表没有重复项时,使用index才会按预期工作,这就是您的代码无法提供正确结果的原因。

答案 1 :(得分:5)

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

使用内置的enumerate函数,因为列表中有重复的元素,而list.index(x)会返回 first 元素的索引,等于{{1 (如the documentation中所述)。另请查看enumerate上的文档。

答案 2 :(得分:3)

列表中有一个重复的元素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