按轴合并多个二维列表

7 投票
3 回答
8527 浏览
提问于 2025-04-18 08:00

我的目的是把多个二维列表按顺序合并,比如:

a = [[1,2],[3,1]]
b= [[3,6],[2,9]]
c = [[5,1],[8,10]]
Expected: [[1,2,3,6,5,1],[3,1,2,9,8,10]]

根据这个网站上其他人的建议,我尝试使用collections模块,像下面的代码一样:

from collections import Counter
a = [[1,2],[3,1]]
b= [[3,6],[2,9]]
c = [[5,1],[8,10]]
d = [[k,v] for k,v in (Counter(dict(a)) + Counter(dict(b))+ Counter(dict(c))).items()]
print d

但是,结果是 [[1, 2], [3, 1], [3, 6], [2, 9]],这并不是我想要的结果。

你们有没有什么想法可以解决这个问题?也许可以有一个函数或模块来考虑合并列表时的轴。

3 个回答

3

这可能是另一种使用numpy的方法,但速度会慢很多。

import numpy as np

a = [[1,2],[3,1]]
b = [[3,6],[2,9]]
c = [[5,1],[8,10]]

print np.hstack((np.hstack((a,b)),c))

# [[ 1  2  3  6  5  1]
# [ 3  1  2  9  8 10]]

如果你想要它以列表的格式显示,可以使用

np.hstack((np.hstack((a,b)),c)).tolist()
7

你可以使用 itertools.chain.from_iterable() 这个方法:

>>> a = [[1, 2], [3, 1]]
>>> b = [[3, 6], [2, 9]]
>>> c = [[5, 1], [8, 10]]
>>> from itertools import chain
>>> [list(chain.from_iterable(x)) for x in zip(a, b, c)]
[[1, 2, 3, 6, 5, 1], [3, 1, 2, 9, 8, 10]]

这个方法在你有多个二维列表的时候会很有用,比如说:

>>> list_of_lists = [
...     [[1, 2], [3, 1]],
...     [[3, 6], [2, 9]],
...     [[5, 1], [8, 10]],
...     # ...
...     [[4, 7], [11, 12]]
... ]
>>> [list(chain.from_iterable(x)) for x in zip(*list_of_lists)]
[[1, 2, 3, 6, 5, 1, ..., 4, 7], [3, 1, 2, 9, 8, 10, ..., 11, 12]]

注意在最后一个例子中,list_of_lists 前面的 * 符号,这个是 参数解包 的一个例子。

14

你可以使用 zip 函数和一个 列表推导式

>>> a = [[1,2],[3,1]]
>>> b = [[3,6],[2,9]]
>>> c = [[5,1],[8,10]]
>>> [x+y+z for x,y,z in zip(a, b, c)]
[[1, 2, 3, 6, 5, 1], [3, 1, 2, 9, 8, 10]]
>>>

撰写回答