python - 将几个子列表重新排列为两个子列表

标签 python list

我有一个如下所示的主列表:

a = [ [[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]], [[13,14,15],[16,17,18]] ]

我需要重新排列它,使它看起来像这样:

b = [[1,2,3,7,8,9,13,14,15], [4,5,6,10,11,12,16,17,18]]

即:将主列表的每个子列表中的第一个子列表中的所有元素放入新列表的 0 位置的单个子列表中,然后对第二个子列表执行相同的操作子列表并将所有元素放在一个子列表中,位于这个新列表的 1 位置。

我尝试将 zipMaking a flat list out of list of lists in Python 中给出的解决方案结合使用但我无法让它工作。

最佳答案

使用zip使用 *itertools.chain.from_iterable .

>>> from itertools import chain, izip
>>> [list(chain.from_iterable(x)) for x in zip(*a)] #or `izip`
[[1, 2, 3, 7, 8, 9, 13, 14, 15], [4, 5, 6, 10, 11, 12, 16, 17, 18]]

这里 zip(*a) 返回:

[([1, 2, 3], [7, 8, 9], [13, 14, 15]), ([4, 5, 6], [10, 11, 12], [16, 17, 18])]

现在您可以使用 chain.from_iterable(x) 展平它的项目。

时序比较:

In [1]: from itertools import izip, chain
In [2]: a = [[[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]], [[13,14,15],[16,17,18]]]
In [3]: %timeit [list(chain.from_iterable(x)) for x in zip(*a)]
100000 loops, best of 3: 3.71 us per loop
In [4]: %timeit [[i for v in r for i in v] for r in zip(*a)]
100000 loops, best of 3: 2.73 us per loop

In [5]: b = a *100
In [6]: %timeit [list(chain.from_iterable(x)) for x in zip(*b)]
10000 loops, best of 3: 97.6 us per loop
In [7]: %timeit [list(chain.from_iterable(x)) for x in izip(*b)]
10000 loops, best of 3: 97.6 us per loop
In [8]: %timeit [[i for v in r for i in v] for r in zip(*b)]
10000 loops, best of 3: 144 us per loop
In [9]: %timeit [[i for v in r for i in v] for r in izip(*b)]
10000 loops, best of 3: 143 us per loop

In [10]: c = a*10000
In [11]: %timeit [list(chain.from_iterable(x)) for x in zip(*c)]
100 loops, best of 3: 12.9 ms per loop
In [12]: %timeit [list(chain.from_iterable(x)) for x in izip(*c)]
100 loops, best of 3: 12.3 ms per loop
In [13]: %timeit [[i for v in r for i in v] for r in zip(*c)]
100 loops, best of 3: 17 ms per loop
In [14]: %timeit [[i for v in r for i in v] for r in izip(*c)]
100 loops, best of 3: 17.1 ms per loop

关于python - 将几个子列表重新排列为两个子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19907694/

相关文章:

python - 将许多按钮绑定(bind)到一个函数,将每个按钮的名称作为参数传递

python 3 : clean example for inheritance & abstract methods?

python - 无法安装 "mediapipe"库

python - 计算 2 个列表之间的重复项

python - 列表推导式到 For 循环

list - Kotlin 中的函数式编程 : Counting elements in list by using fold

python - Python 中列表的 Zip/Map 列表

Python 子类看似互相编辑

python - 如何设置 igraph 图的大小?

python - 如何在python中自动创建父类的所有子对象?