将三个列表合并为一个列表[重复]
Posted
技术标签:
【中文标题】将三个列表合并为一个列表[重复]【英文标题】:Merging three lists into 1 list [duplicate] 【发布时间】:2020-04-13 01:30:50 【问题描述】:您好,我有三个这样的列表:
a = [1,2,3,4]
b = [2,3,4,5]
c = [3,4,5,6]
如何创建一个新列表,以便从所有列表中获取值。例如,它的前三个元素将是 1、2、3,因为它们是 a、b、c 的第一个元素。因此,它看起来像
d = [1,2,3,2,3,4,3,4,5,4,5,6]
【问题讨论】:
【参考方案1】:您可以使用zip
:
a = [1,2,3,4]
b = [2,3,4,5]
c = [3,4,5,6]
[item for sublist in zip(a, b, c) for item in sublist]
# [1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6]
第一个for循环:
for sublist in zip(a, b, c)
将迭代zip
提供的元组,这将是:
(1st item of a, 1st item of b, 1st item of c)
(2nd item of a, 2nd item of b, 2nd item of c)
...
第二个for循环:
for item in sublist
将迭代这些元组的每一项,构建最终列表:
[1st item of a, 1st item of b, 1st item of c, 2nd item of a, 2nd item of b, 2nd item of c ...]
要回答 @bjk116 的评论,请注意,推导式中的 for
循环的编写顺序与您在普通叠层循环中使用的顺序相同:
out = []
for sublist in zip(a, b, c):
for item in sublist:
out.append(item)
print(out)
# [1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6]
【讨论】:
您能解释一下这是如何工作的吗?我习惯于使用像[g(x) for x in mylist]
这样的单个列表来列出理解,但这让我感到困惑。这是列表理解上的列表理解吗?最右边的子列表在哪里定义?【参考方案2】:
您可以使用numpy 来实现。
import numpy as np
a = [1,2,3,4]
b = [2,3,4,5]
c = [3,4,5,6]
d = np.array([a, b, c]).flatten('F') # -> [1 2 3 2 3 4 3 4 5 4 5 6]
【讨论】:
【参考方案3】:这是 leetcode 48 旋转图像的替代版本,并添加 flatten.. 仍然很简单:
mat = [a,b,c]
mat[::] = zip(*mat)
[item for sublist in mat for item in sublist]
【讨论】:
这没有给出预期的输出【参考方案4】:正如 Thierry 所指出的,我们需要使用 zip(a,b,c)
转置列表并连接新列表。
使用内置包itertools
,这是非常快的(在性能和代码可读性方面):
from itertools import chain
result = list(chain(*zip(a,b,c)))
或者,不使用解包参数:
result = list(chain.from_iterable(zip(a,b,c)))
这是非常经典的。但是,令人惊讶的是,Python 还有一个名为more_itertools 的包,它有助于进行更高级的迭代。您需要安装并使用:
from more_itertools import interleave
result = list(interleave(a,b,c))
【讨论】:
以上是关于将三个列表合并为一个列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在线性时间内将小的排序列表合并为更大的排序列表的算法,没有重复项