有更明智的方法吗?我想通过总结许多其他列表的索引来创建一个新列表。我对编程很新,这看起来像一个非常笨重的方法!
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
答案 0 :(得分: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]
或者如果您将数据作为列表列表而不是单独的列表:
>>> 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]
同样,如果您将数据存储为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]
请注意,如果您的列表长度不等,zip
将一直工作到最短列表长度。例如:
>>> data = [[1,2,3,4,5], [1,1], [1,22], [1,2,5]]
>>> [sum(x) for x in zip(*data)]
[4, 27]
如果您希望获得包含所有数据的结果,可以使用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]
答案 1 :(得分: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]
答案 2 :(得分:1)
问题首先在于:您应该从不在代码中包含100个变量。
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]
相反,你应该有像
这样的东西list_of_lists = []
list_of_lists.append([1,2,3,4,5])
list_of_lists.append([1,1,1,4,1])
list_of_lists.append([1,22,3,1,5])
list_of_lists.append([1,2,5,4,5])
...
然后你会像这样计算出所需的结果:
[sum(x) for x in zip(*list_of_lists)]
答案 3 :(得分:0)
你真的需要阅读python教程。
sum(list1)
将为您提供该列表的总和。for
循环轮换列表集合的方法是使用zip
:
list1 = [1,2,3,4,5]
list2 = [1,1,1,4,1]
list3 = [1,22,3,1,5]
zip(list1,list2,list3)
# matches up element n of each list with element n of the other lists
#=> [(1, 1, 1), (2, 1, 22), (3, 1, 3), (4, 4, 1), (5, 1, 5)]
# now you want to add up each of those tuples:
[sum(t) for t in zip(list1,list2,list3)]
#=> [3, 25, 7, 9, 11]
要使用zip
处理此类列表,请查看itertools
模块,或了解*args
语法。