Python 两个嵌套列表的总和

Python 两个嵌套列表的总和,python,list,nested,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文档,并研究其他帖子,但并不真正了解它们是如何工作的。任何帮助都将不胜感激 如果你打算大量使用,最好使用numpy: import numpy as np a = [[1, 1, 1], [1, 1, 1]] b = [[2, 2, 2], [2, 2, 2]] aa = np.a

我有两个嵌套列表:

a = [[1, 1, 1], [1, 1, 1]]
b = [[2, 2, 2], [2, 2, 2]]
我想提出:

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

我一直在参考
zip
文档,并研究其他帖子,但并不真正了解它们是如何工作的。任何帮助都将不胜感激

如果你打算大量使用,最好使用
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
接受输入并将其组合(每个输入中有一个元素)。这里我们需要两个拉链——最外层的拉链将
a
中的列表与
b
中的列表配对,而内部的拉链将已经配对的子列表中的单个元素配对。

如果你要做一整组,最好使用
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
将已经配对的子列表中的单个元素配对。

您可以将列表理解与
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]]
您可以将列表理解与
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]]

我使用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]]

我使用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]]

谢谢你的建议!我会调查numpy的。事实上,这段代码并不容易阅读。你对这两条拉链的解释很有道理。谢谢你这么清楚的解释。谢谢你的建议!我会调查numpy的。事实上,这段代码并不容易阅读。你对这两条拉链的解释很有道理。谢谢你这么清楚的解释。