695

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

4

7 回答 7

1146

是的:list1 + list2。这给出了一个新列表,它是 和 的list1串联list2

于 2010-12-03T09:17:48.827 回答
170

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

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

于 2010-12-03T10:41:59.093 回答
116

concatenated_list = list_1 + list_2

于 2010-12-03T09:18:15.787 回答
101

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]
于 2014-02-12T13:06:15.157 回答
45

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

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

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

于 2010-12-03T09:18:16.213 回答
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.

于 2013-08-27T08:41:42.023 回答
16

只是让你知道:

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

于 2010-12-03T12:50:22.360 回答