合并多个2d列表,按顺序考虑轴

时间:2014-05-30 01:15:33

标签: python merge axis

我的目的是按顺序组合多个2d列表,例如:

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]]

根据本网站的其他建议,我尝试使用收集模块,如下面的代码:

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 个答案:

答案 0 :(得分:11)

您可以使用ziplist comprehension

>>> 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]]
>>>

答案 1 :(得分:6)

您可以使用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]]

如果您有任意数量的2D列表,这可能会很方便 - 例如:

>>> 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,这是argument unpacking的示例。

答案 2 :(得分:2)

这可能是使用numpy的另一种解决方案,但速度要慢得多。

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

如果您希望它具有列表格式,请使用

{{1}}