9

在 python 中,如何使用列表推导连接 3 个列表?

有:

    list1 = [1,2,3,4]
    list2 = [5,6,7,8]
    list3 = [9,10,11,12]

想:

    allList = [1,2,3,4,5,6,7,8,9,10,11,12]

我尝试使用列表理解,但我还不是很擅长它们。这些是我尝试过的:

    allList = [n for n in list1 for n in list2 for n in list3 ]

这是一个坏主意,显然并产生了 len(list1)*len(list2)*len(list3) 价值。哎呀。所以我尝试了这个:

    allList = [n for n in list1, list2, list3]

但这给了我 allList = [list1, list 2, list3] (3 个列表列表)

我知道您可以使用 + 运算符进行连接(如 x = list1 + list2 + list3),但是如何使用简单的列表推导来做到这一点?

这里有一个类似的问题:Concatenate 3 lists of words,但这是针对 C# 的。

4

3 回答 3

15

更好的解决方案是使用itertools.chain而不是添加。这样,您无需创建中间列表list1 + list2,然后创建另一个中间列表list1 + list2 + list3,而是创建没有中间列表的最终列表:

allList = [x for x in itertools.chain(list1, list2, list3)]

然而,像这样的空列表理解是非常愚蠢的;只需使用该list函数将任意可迭代对象转换为列表:

allList = list(itertools.chain(list1, list2, list3))

或者,甚至更好……如果您需要它的唯一原因是循环它,只需将其保留为迭代器:

for thing in itertools.chain(list1, list2, list3):
    do_stuff(thing)

虽然我们在这里,但您链接到的“类似问题”实际上是一个非常不同且更复杂的问题。但是,因为itertools太酷了,它仍然是 Python 中的单行代码:

itertools.product(list1, list2, list3)

或者,如果您想以该问题指定的格式打印出来:

print('\n'.join(map(' '.join, itertools.product(list1, list2, list3))))
于 2013-08-07T21:54:53.513 回答
12

以下是一些选项:

>>> sum([list1, list2, list3], [])
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

>>> list1 + list2 + list3
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

有理解:(真的没必要)

>>> [x for x in  sum([list1, list2, list3], [])]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
于 2013-08-07T22:01:26.687 回答
0

你可以做allList = list1 + list2 + list3而不是allList = [x for x in list1 + list2 + list3]

于 2013-08-07T21:52:28.230 回答