繁体   English   中英

在Python中将非对称3维列表转换为2维列表列表

[英]Turn a non-symmetric 3 dimensional list into a 2 dimensional list of lists in python

我有一个清单,形状

[[1,1],[2,2,2]],[[3,3],[4,4],[5,5,5]]

当变成一个numpy数组时

[[1 1],[2 2 2]],
[[3 3 3],[4 4],[5 5 5]]

为了清楚起见,我有一个由2个列表组成的列表,每个列表都由列表组成

我想把它放在表格中

[[1,1],[2,2,2],[3,3],[4,4],[5,5,5]]

要么

[[1,1],
[2 2 2],
[3 3],
[4 4],
[5 5 5]]

flatten不起作用,因为它只给了我每个组件的列表,但是我想将具有相同组件的列表放在一起,以便最终得到列表列表。 这将是不同大小的列表,所以我也不认为重塑功能也可以。

另一个问题是,在我给的示例中,列表由相同的数字组成,但是在我的实际代码中,它们是不同的数字,因此我不能简单地告诉它将所有确定的数字都放入每个列表中。

我希望我很清楚,如果没有,我会尽力澄清

您可以简单地使用np.concatenate

np.concatenate(input_list)

样品运行-

In [19]: input_list = [[1,1],[2,2,2]],[[3,3],[4,4],[5,5,5]]

In [20]: np.concatenate(input_list)
Out[20]: array([[1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5]], dtype=object)

您可以对list comprehension使用两个循环,它既适用于lists又适用于np.arrays

l = [[1,1],[2,2,2]],[[3,3],[4,4],[5,5,5]]
result = [i for sublist in l for i in sublist]
print(result)
[[1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5]]

如果您不熟悉list comprehension ,则可以使用常规循环(等同于列表理解解决方案):

newlist = []
for sublist in l:
    for i in sublist:
        newlist.append(i)

print(newlist)
[[1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5]]

编辑

或者您可以使用np.concatenatenp.hstack如@Divakar所建议的那样,它们更具可读性,但性能...:

In [225]: %timeit [i for sublist in l for i in sublist]
1000000 loops, best of 3: 885 ns per loop

In [227]: %timeit np.concatenate(l)
100000 loops, best of 3: 4.12 us per loop

In [226]: %timeit np.hstack(l)
100000 loops, best of 3: 13.3 us per loop

EDIT2

从@hpaulj注释中,您可以使用itertools.chain(*l) tp实现与调用list

import itertools
In [315]: list(itertools.chain(*l))
Out[315]: [[1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5]]

In [317]: %timeit list(itertools.chain(*l))
1000000 loops, best of 3: 876 ns per loop

因此,结果与list comprension几乎相同,可能会更快一些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM