在Python中,我能找到的连接两个列表的唯一方法是list。扩展,它修改第一个列表。是否有任何连接函数返回其结果而不修改其参数?


是:list1 + list2。这将给出一个新列表,该列表是list1和list2的连接。


Concatenated_list = list_1 + list_2


你总是可以创建一个新的列表,这是添加两个列表的结果。

>>> k = [1,2,3] + [4,7,9]
>>> k
[1, 2, 3, 4, 7, 9]

列表是可变序列,所以我认为通过扩展或追加来修改原始列表是有意义的。


最简单的方法是使用+运算符,它返回列表的连接:

Concat = first_list + second_list

这种方法的一个缺点是现在使用的内存是原来的两倍。对于非常大的列表,取决于创建后你将如何使用它,itertools。链条可能是你最好的选择:

>>> import itertools
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = itertools.chain(a, b)

这将为组合列表中的项创建一个生成器,这样做的好处是不需要创建新的列表,但你仍然可以使用c,就像它是两个列表的连接一样:

>>> for i in c:
...     print i
1
2
3
4
5
6

如果你的列表很大,而且效率很重要,那么这个方法和itertools模块中的其他方法都非常方便。

注意,这个例子用完了c中的项,所以在重用它之前,你需要重新初始化它。当然,您可以只使用list(c)来创建完整的列表,但这将在内存中创建一个新的列表。


只是想让你知道:

当你写list1 + list2时,你是在调用list1的__add__方法,它会返回一个新的列表。这样你也可以通过在你的个人类中添加__add__方法来处理myobject + list1。


如果你有两个以上的列表要连接:

import operator
from functools import reduce  # For Python 3
list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
reduce(operator.add, [list1, list2, list3])

# or with an existing list
all_lists = [list1, list2, list3]
reduce(operator.add, all_lists)

它实际上并没有为你节省任何时间(仍然创建中间列表),但如果你有一个可变数量的列表要扁平化,例如,*args。


你也可以使用sum,如果你给它一个start参数:

>>> list1, list2, list3 = [1,2,3], ['a','b','c'], [7,8,9]
>>> all_lists = sum([list1, list2, list3], [])
>>> all_lists
[1, 2, 3, 'a', 'b', 'c', 7, 8, 9]

这一般适用于任何具有+运算符的东西:

>>> sum([(1,2), (1,), ()], ())
(1, 2, 1)

>>> sum([Counter('123'), Counter('234'), Counter('345')], Counter())
Counter({'1':1, '2':2, '3':3, '4':2, '5':1})

>>> sum([True, True, False], False)
2

除了字符串之外:

>>> sum(['123', '345', '567'], '')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]