将三个列表合并为一个列表[重复]

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))

【讨论】:

以上是关于将三个列表合并为一个列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在线性时间内将小的排序列表合并为更大的排序列表的算法,没有重复项

如何将多个返回的列表合并为一个[重复]

如何将三个列表合并为一个并保持相同的键

Python:如何将具有相同变量类型的多个列表合并到一个列表列表中?

合并包含在一个大列表中的重复项目的列表

将 3 个链表合并为 1 个(Java)