在Python中,我能找到连接两个列表的唯一方法是list.extend,它修改了第一个列表。有没有任何连接函数可以返回其结果而不修改其参数?
list.extend
是:list1 + list2。这给出了一个新的列表,它是list1和list2的串联。
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.chain可能是你最好的选择:
itertools.chain
>>> import itertools >>> a = [1, 2, 3] >>> b = [4, 5, 6] >>> c = itertools.chain(a, b)
这将为组合列表中的项目创建一个生成器,其优点是不需要创建新列表,但您仍然可以使用c,就好像它是两个列表的连接:
c
>>> for i in c: ... print i 1 2 3 4 5 6
如果您的列表很大并且效率是一个问题,那么itertools模块中的这个和其他方法非常方便。
itertools
请注意,此示例使用了c中的项目,因此您需要重新初始化它才能重用它。当然,您可以使用list(c)来创建完整列表,但这将在内存中创建一个新列表。
list(c)
只是想让你知道:
当您编写list1 + list2时,您正在调用list1的__add__方法,它返回一个新列表。通过这种方式,您还可以通过将__add__方法添加到您的个人类来处理myobject + list1。
__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,那就太好了。
*args
你也可以使用sum,如果你给它一个start参数:
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]