在Python中,我唯一能找到的连接两个列表的方法是使用
list.extend
,这会修改第一个列表。是否有任何连接函数可以返回其结果而不修改其参数?list.extend
,这会修改第一个列表。是否有任何连接函数可以返回其结果而不修改其参数?是的: list1 + list2
。这将返回一个新列表,其中包括list1
和list2
的连接部分。
最简单的方法就是使用 +
操作符,它返回列表的连接结果:
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)
来创建完整的列表,但这会在内存中创建一个新列表。concatenated_list = list_1 + list_2
如果你给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]
sum
函数的文档中写道:“此函数专门用于处理数字类型的值,可能会拒绝非数字类型的参数”。因此,我不确定是否应该像这样使用sum
函数。 - Robie Basak您可以始终创建一个新列表,该列表是两个列表相加的结果。
>>> k = [1,2,3] + [4,7,9]
>>> k
[1, 2, 3, 4, 7, 9]
列表是可变序列,因此我认为通过extend或append来修改原始列表是有意义的。
如果你有两个以上的列表需要连接起来:
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
,这很方便。
仅供参考:
当你写 list1 + list2
时,你调用了 list1
的 __add__
方法,它返回一个新的列表。通过在你自己的类中添加 __add__
方法,也可以处理 myobject + list1
。
numpy.concatenate((a,b), axis=0)
进行拼接。 - Akshay