我有一个列表列表,如下所示:
[
[
[a,b],
[c,d]
],
[
[e,f],
[g,h]
]
]
基本上,这是一个价值观的立方体。
我想要的是同一个多维数据集中不同的项目顺序,如下所示:
[
[
[a,e],
[b,f]
],
[
[c,g],
[d,h]
]
]
并且,最好是在单行中(是的,我知道这不是最好的做法)。
我知道map(list, *zip(a))
诀窍,但我无法弄清楚如何在这里应用它。可能是lambda和地图的东西?
答案 0 :(得分:1)
如果我理解正确,您需要先转置所有子列表,然后转置新转置的组:
print([list(zip(*sub)) for sub in zip(*l)])
输出:
In [69]: [list(zip(*sub)) for sub in zip(*l)]
Out[69]: [[('a', 'e'), ('b', 'f')], [('c', 'g'), ('d', 'h')]]
如果你想要一个带有lambda的地图foo:
In [70]: list(map(list, map(lambda x: zip(*x), zip(*l))))
Out[70]: [[('a', 'e'), ('b', 'f')], [('c', 'g'), ('d', 'h'
对于python2,您不需要额外的地图调用,但我会使用itertools.izip
进行初始转置。:
In [9]: from itertools import izip
In [10]: map(lambda x: zip(*x), izip(*l))
Out[10]: [[('a', 'e'), ('b', 'f')], [('c', 'g'), ('d', 'h')]]