如何在Python中获取两个列表的串联而不修改它们任何一个?

709
在Python中,我唯一能找到的连接两个列表的方法是使用list.extend,这会修改第一个列表。是否有任何连接函数可以返回其结果而不修改其参数?
7个回答

1151

是的: list1 + list2。这将返回一个新列表,其中包括list1list2的连接部分。


34
实际上,您可以通过使用一个非隐藏函数来完成这个操作:import operator, operator.add(list1, list2)。 - Bite code
18
reduce(operator.add, [[1,2], [3,4], [5,6]]) 的结果是 [1,2,3,4,5,6]。你也可以使用 itertools.chain 来代替 operator.add。 - Paul Hollingsworth
3
你还可以使用 numpy.concatenate((a,b), axis=0) 进行拼接。 - Akshay
2
你也可以使用list1.extend(list2)。 - ColinMac

174

最简单的方法就是使用 + 操作符,它返回列表的连接结果:

concat = first_list + second_list

这种方法的缺点是现在使用了两倍的内存。对于非常大的列表,取决于创建后如何使用,itertools.chain 可能是您的最佳选择:

>>> 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)来创建完整的列表,但这会在内存中创建一个新列表。

11
itertools.chain 返回一个生成器,就这么说。 - Ant

117

concatenated_list = list_1 + list_2


102

如果你给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]

4
在Python 3.5.2中,sum函数的文档中写道:“此函数专门用于处理数字类型的值,可能会拒绝非数字类型的参数”。因此,我不确定是否应该像这样使用sum函数。 - Robie Basak

45

您可以始终创建一个新列表,该列表是两个列表相加的结果。

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

列表是可变序列,因此我认为通过extend或append来修改原始列表是有意义的。


2
只有在您不再需要未修改的列表时,修改原始列表才有意义,因此在这种情况下是没有意义的。 - Scott Griffiths

24

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

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,这很方便。


16

仅供参考:

当你写 list1 + list2 时,你调用了 list1__add__ 方法,它返回一个新的列表。通过在你自己的类中添加 __add__ 方法,也可以处理 myobject + list1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接