总结python中的列表 - 有更好的方法吗?

Fak*_*DIY 5 python sum list

有更明智的方法吗?我想通过总结许多其他列表的索引来创建一个新列表.我对编程很新,这看起来像一个非常笨重的方法!

list1 = [1,2,3,4,5]
list2 = [1,1,1,4,1]
list3 = [1,22,3,1,5]
list4 = [1,2,5,4,5]
...
list100 = [4,5,6,7,8]

i = 0
while i < len(list1):
    mynewlist[i] = list1[i]+list2[i]+list3[i]+list4[i]+...list100[i]
    i = i+1
Run Code Online (Sandbox Code Playgroud)

Sha*_*hin 17

这是一个非常好的用例zip.

>>> list1 = [1,2,3,4,5]
>>> list2 = [1,1,1,4,1]
>>> list3 = [1,22,3,1,5]
>>> list4 = [1,2,5,4,5]
>>> [sum(x) for x in zip(list1, list2, list3, list4)]
[4, 27, 12, 13, 16]
Run Code Online (Sandbox Code Playgroud)

或者如果您将数据作为列表列表而不是单独的列表:

>>> data = [[1,2,3,4,5], [1,1,1,4,1], [1,22,3,1,5], [1,2,5,4,5]]
>>> [sum(x) for x in zip(*data)]
[4, 27, 12, 13, 16]
Run Code Online (Sandbox Code Playgroud)

同样,如果将数据存储dict为列表,则可以使用dict.itervalues()dict.values()检索列表值并以类似的方式使用它:

>>> data = {"a":[1,2,3], "b":[3,4,4]}
>>> [sum(x) for x in zip(*data.itervalues())]
[4, 6, 7]
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的列表长度不等,zip则可以使用最短列表长度.例如:

>>> data = [[1,2,3,4,5], [1,1], [1,22], [1,2,5]]
>>> [sum(x) for x in zip(*data)]
[4, 27]
Run Code Online (Sandbox Code Playgroud)

如果您希望获得包含所有数据的结果,您可以使用itertools.izip_longest(使用适当的fillvalue).例:

>>> data = [[1,2,3,4,5], [1,1], [1,22], [1,2,5]]
>>> [sum(x) for x in izip_longest(*data, fillvalue=0)]
[4, 27, 8, 4, 5]
Run Code Online (Sandbox Code Playgroud)


Nol*_*lty 6

虽然@ Shawn的答案是正确的,但我认为这map可能比列表理解更优雅:

>>> list1 = [1,2,3,4,5]
>>> list2 = [1,1,1,4,1]
>>> list3 = [1,22,3,1,5]
>>> list4 = [1,2,5,4,5]
>>> map(sum, zip(list1, list2, list3, list4))
[4, 27, 12, 13, 16]
Run Code Online (Sandbox Code Playgroud)