5

有没有更明智的方法来做到这一点?我想通过对许多其他列表的索引求和来制作一个新列表。我对编程相当陌生,这似乎是一种非常笨拙的方法!

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
4

4 回答 4

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]
于 2012-05-23T15:58:58.623 回答
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]
于 2012-05-23T16:03:45.007 回答
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)]
于 2012-05-23T16:11:47.290 回答
0

你真的需要阅读 python 教程。

  1. sum(list1)将为您提供该列表的总和。
  2. 你需要了解for循环
  3. 您的列表本身应该存储在列表中
  4. 旋转列表集合的方法是使用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语法。

于 2012-05-23T16:09:04.833 回答