两个嵌套列表的总和

时间:2016-11-07 05:32:57

标签: python list nested

我有两个嵌套列表:

a = [[1, 1, 1], [1, 1, 1]]
b = [[2, 2, 2], [2, 2, 2]]

我想:

c = [[3, 3, 3], [3, 3, 3]]

我一直在引用zip文档,并研究其他帖子,但我们并不了解它们的工作原理。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

您可以将列表理解zip()一起使用为:

>>> a = [[1, 1, 1], [1, 1, 1]]
>>> b = [[2, 2, 2], [2, 2, 2]]
>>> [[i1+j1 for i1, j1 in zip(i,j)] for i, j in zip(a, b)]
[[3, 3, 3], [3, 3, 3]]

更通用的方法是创建一个函数:

def my_sum(*nested_lists):
    return [[sum(items) for items in zip(*zipped_list)] for zipped_list in zip(*nested_lists)]

可以接受任意数量的列表。样品运行:

>>> a = [[1, 1, 1], [1, 1, 1]]
>>> b = [[2, 2, 2], [2, 2, 2]]
>>> c = [[3, 3, 3], [3, 3, 3]]
>>> my_sum(a, b, c)
[[6, 6, 6], [6, 6, 6]]

答案 1 :(得分:1)

如果您要完成这一切,那么您最好使用numpy

import numpy as np
a = [[1, 1, 1], [1, 1, 1]]
b = [[2, 2, 2], [2, 2, 2]]

aa = np.array(a)
bb = np.array(b)
c = aa + bb

使用numpy数组比在列表上重复使用zip要有效得多。最重要的是,numpy允许您更加明确地使用数组,因此生成的代码通常很多更容易阅读。

如果您不想要第三方依赖,那么您需要做一些不同的事情:

c = []
for a_sublist, b_sublist in zip(a, b):
    c.append([a_sublist_item + b_sublist_item for a_sublist_item, b_sublist_item in zip(a_sublist, b_sublist)])

希望变量名称能够清楚地说明它在这里发生了什么,但基本上,每个zip接受输入并将它们组合起来(每个输入中有一个元素)。我们这里需要2个拉链 - zip最外面的a对列表来自b的列表,而内部zip配对已经配对的子列表中的各个元素。

答案 2 :(得分:0)

我使用python内置函数 map()来执行此操作。

如果我有简单的列表a和b,我就这样总结:

>>> a = [1,1,1]
>>> b = [2,2,2]
>>> map(lambda x, y: x + y, a, b)
[3, 3, 3]

如果我有嵌套列表a和b,我会以类似的方式对它们求和:

>>> a = [[1, 1, 1], [1, 1, 1]]
>>> b = [[2, 2, 2], [2, 2, 2]]
>>> map(lambda x, y: map(lambda i, j: i + j, x, y), a, b)
[[3, 3, 3], [3, 3, 3]]