按列表中的每2个元素优化sum

时间:2017-03-04 19:42:48

标签: python

我有一个清单:

mylist = [0.01, 0.09, 0.04, 0.16]

我想每两个元素取总和,所以我的结果是: [0.1, 0.2]

我想到了这个解决方案:

chunks = [mylist[i:i + 2] for i in range(0, len(mylist), 2)]

temp = []
for i in chunks:
    s = 0
    for j in i:
        s += j
    temp.append(s)

print(temp)

[0.1, 0.2]

但我想知道是否有更好的解决方案,避免使用2 for循环。

5 个答案:

答案 0 :(得分:8)

为什么不简单地使用sum(..)内置:

temp = [sum(mylist[i:i+2]) for i in range(0, len(mylist), 2)]

这是一个单行,显然更像Pythonic。此外,它可能更有效,因为在这里你不会先将所有切片存储到内存中,等等,但你直接计算总和。

答案 1 :(得分:1)

map(sum, zip(mylist[::2], mylist[1::2]))

对于奇数长度的列表,请改用zip_longest

from itertools import zip_longest as zipl
map(sum, zipl(mylist[::2], mylist[1::2], fillvalue=0))

答案 2 :(得分:1)

有些人可能认为这是一种矫枉过正,但是一旦你对数字数组进行计算,numpy就是你的朋友。它使您能够以可读且高效的方式进行此类计算。

import numpy as np
x = np.array([0.01, 0.09, 0.04, 0.16])
# reshaping the array to a 2D array, and summing over the columns
x.reshape((x.shape[0]/2,2)).sum(axis=1)

答案 3 :(得分:1)

你可以尝试这个(对偶数和奇数都有效):

import itertools as it    
[sum(r) for r in it.izip_longest(mylist [::2], mylist [1::2], fillvalue=0)]

答案 4 :(得分:1)

使用iteration_utilities.grouper

$(postcodeLinks[33]).html()
// or..
$(postcodeLinks[33]).text()

第一个值不是0.1是因为浮点运算,这里的其他解决方案同样受到影响。

这应该和其他方法一样快,甚至可能更快(除了numpy-solution)。