按轴合并多个二维列表
我的目的是把多个二维列表按顺序合并,比如:
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
前面的 *
符号,这个是 参数解包 的一个例子。