如何在Python中连接两个列表?

例子:

listone = [1, 2, 3]
listtwo = [4, 5, 6]

预期结果:

>>> joinedlist
[1, 2, 3, 4, 5, 6]

当前回答

值得注意的是,itertools.chain函数接受可变数量的参数:

>>> l1 = ['a']; l2 = ['b', 'c']; l3 = ['d', 'e', 'f']
>>> [i for i in itertools.chain(l1, l2)]
['a', 'b', 'c']
>>> [i for i in itertools.chain(l1, l2, l3)]
['a', 'b', 'c', 'd', 'e', 'f']

如果输入是可迭代的(元组、列表、生成器等),则可以使用from_iteable类方法:

>>> il = [['a'], ['b', 'c'], ['d', 'e', 'f']]
>>> [i for i in itertools.chain.from_iterable(il)]
['a', 'b', 'c', 'd', 'e', 'f']

其他回答

对于列表数量较少的情况,您可以简单地将列表添加到一起或使用就地解包(Python-3.5+版本中提供):

In [1]: listone = [1, 2, 3] 
   ...: listtwo = [4, 5, 6]                                                                                                                                                                                 

In [2]: listone + listtwo                                                                                                                                                                                   
Out[2]: [1, 2, 3, 4, 5, 6]
                                                                                                                                                                                     
In [3]: [*listone, *listtwo]                                                                                                                                                                                
Out[3]: [1, 2, 3, 4, 5, 6]

对于列表数量较多的情况,可以使用itertools模块中的chain.from_iterable()1函数,这是一种更通用的方法。此外,根据这个答案,这个函数是最好的;或者至少是一种非常好的方式来展开嵌套列表。

>>> l=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> import itertools
>>> list(itertools.chain.from_iterable(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

1.注意,“chain.from_iterable()”在Python 2.6及更高版本中可用。在其他版本中,使用“chain(*l)”。

你也可以使用sum。

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> sum([a, b], [])
[1, 2, 3, 4, 5, 6]
>>>

这适用于任何长度和任何元素类型的列表:

>>> a = ['a', 'b', 'c', 'd']
>>> b = [1, 2, 3, 4]
>>> c = [1, 2]
>>> sum([a, b, c], [])
['a', 'b', 'c', 'd', 1, 2, 3, 4, 1, 2]
>>>

我添加[]的原因是,start参数默认设置为0,因此它在列表中循环并添加到start,但0+[1,2,3]会产生错误,因此如果我们将start设置为[]。它将添加到[],并且[]+[1,2,3]将按预期工作。

如何在Python中连接两个列表?

截至3.9,这些是在Python中连接两个(或更多)列表的最流行的stdlib方法。

Version Restrictions In-Place? Generalize to N lists?
a+b - No sum([a, b, c], [])1
list(chain(a,b))2 >=2.3 No list(chain(a, b, c))
[*a, *b]3 >=3.5 No [*a, *b, *c]
a += b - Yes No
a.extend(b) - Yes No

脚注这是一个巧妙的解决方案,因为它简洁。但sum以成对的方式执行连接,这意味着这是一个必须为每个步骤分配作为存储器的二次运算。做如果您的列表很大,请不要使用。参见链条和链接from_iteable从文档中。您需要首先从itertools导入链。级联在内存中是线性的,因此在性能和版本兼容性。chain.from_iteable在2.6中引入。此方法使用附加解包泛化(PEP 448),但不能归纳为N个列表,除非您自己手动打开每个列表。a+=b和a.extend(b)在所有实际用途中或多或少是等效的。+=当在列表中调用时,将在内部调用列表__iadd_,它将第一个列表扩展第二个列表。


表演

2-列表连接1

这些方法之间没有太大区别,但这是有意义的,因为它们都具有相同的复杂性(线性)。除了风格上的问题外,没有特别的理由更喜欢一个而不是另一个。

N-列表连接

已使用perfplot模块生成绘图。代码,供您参考。

1.iadd(+=)和extend方法在适当的地方运行,因此每次测试前都必须生成一个副本。为了保持公平,所有方法都有左侧列表的预复制步骤,可以忽略。


对其他解决方案的评论

不要使用DUNDER方法列表__以任何方式、形状或形式直接添加__。事实上,请不要使用dunder方法,并像设计的那样使用运算符和运算符函数。Python有精心设计的语义,这些语义比直接调用dunder更复杂。这里有一个例子。综上所述,a.__add__(b)=>BAD;a+b=>良好。这里的一些答案为成对串联提供了reduce(operator.add,[a,b])——这与sum([a,b],[])相同,只是更加冗长。任何使用set的方法都会删除重复项并丢失排序。小心使用。对于b中的i:a.append(i)比a.extend(b)更冗长,也更慢,后者是单函数调用,更惯用。由于为列表分配和增长内存的语义,append速度较慢。有关类似的讨论,请参见此处。heapq.mmerge可以工作,但它的用例是在线性时间内合并排序列表。在任何其他情况下使用它都是一种反模式。从函数中生成列表元素是一种可以接受的方法,但chain可以更快更好地实现这一点(它有一个C语言的代码路径,所以速度很快)。operator.add(a,b)是一个可接受的等价于a+b的函数。它的用例主要用于动态方法调度。否则,在我看来,更喜欢a+b,它更简短,更易读。YMMV。

组合列表列表的一种非常简洁的方法是

list_of_lists = [[1,2,3], [4,5,6], [7,8,9]]
reduce(list.__add__, list_of_lists)

这给了我们

[1, 2, 3, 4, 5, 6, 7, 8, 9]

用于连接列表的最常见方法是加号运算符和内置方法append,例如:

list = [1,2]

list = list + [3]
# list = [1,2,3]

list.append(3)
# list = [1,2,3]

list.append([3,4])
# list = [1,2,[3,4]]

对于大多数情况,这都会起作用,但如果添加了列表,append函数将不会扩展列表。因为这是不期望的,所以可以使用另一个名为extend的方法。它应适用于以下结构:

list = [1,2]
list.extend([3,4])
# list = [1,2,3,4]