"移调" (旋转?)嵌套列表

时间:2016-02-06 12:22:44

标签: python lambda

我有一个列表列表,如下所示:

[
 [
  [a,b],
  [c,d]
 ],
 [
  [e,f],
  [g,h]
 ]
]

基本上,这是一个价值观的立方体。

我想要的是同一个多维数据集中不同的项目顺序,如下所示:

[
 [
  [a,e],
  [b,f]
 ],
 [
  [c,g],
  [d,h]
 ]
]

并且,最好是在单行中(是的,我知道这不是最好的做法)。

我知道map(list, *zip(a))诀窍,但我无法弄清楚如何在这里应用它。可能是lambda和地图的东西?

UPD:至于我需要它 - 我已经对不同排序算法的速度进行了一些测试;每个最深的列表都有值 - 我测试的排序算法所用的时间。这些列表位于列表中,表示不同类型的测试,外部列表对于不同的测试大小具有相同的重复性。在这样的轮换之后,我将列出(测试类型)列表(排序类型)项目(时间)的列表(测试大小),这对绘图来说更方便。

1 个答案:

答案 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')]]