如何在不修改任何一个列表的情况下在Python中实现两个列表的串联?

如何在不修改任何一个列表的情况下在Python中实现两个列表的串联?,python,concatenation,sequence,list-manipulation,Python,Concatenation,Sequence,List Manipulation,在Python中,连接两个列表的唯一方法是list.extend,它修改了第一个列表。是否有任何串联函数在不修改其参数的情况下返回其结果?是:list1+list2。这提供了一个新列表,它是list1和list2的串联。您可以通过添加两个列表来创建一个新列表 >>> k = [1,2,3] + [4,7,9] >>> k [1, 2, 3, 4, 7, 9] 列表是可变序列,因此我想通过扩展或附加来修改原始列表是有意义的。最简单的方法就是使用+运算符,它返回

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

是:
list1+list2
。这提供了一个新列表,它是
list1
list2
的串联。您可以通过添加两个列表来创建一个新列表

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

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

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

concat=第一个列表+第二个列表

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

>>> 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
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法,该方法返回一个新列表。通过这种方式,您还可以通过将
\uu add\uuu
方法添加到您的个人类来处理
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
如果您给它一个
开始
参数,您也可以使用
求和

>>> 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]
总和(['123','345','567'],'') 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:sum()无法对字符串求和[改用''连接(seq)]
只有当您不再需要未修改的列表时,才有必要修改原始列表,因此在这种情况下就没有意义了。只需说itertools.chain返回一个生成器……这就解释了。我在寻找一个函数名,而不是运算符(是的,我知道运算符是由隐藏函数实现的)。实际上,您可以通过使用非隐藏函数:导入运算符,operator.add(list1,list2)reduce(operator.add,[[1,2],[3,4],[5,6]=[1,2,3,4,5,6]来实现这一点。或者您可以使用itertools.chain而不是operator.add您还可以使用
numpy.concatenate((a,b),axis=0)
您还可以在Python 3.5.2上使用list1.extend(list2),
sum
说明“此函数专门用于数值,可能会拒绝非数值类型”。因此,我不确定是否应该这样使用
sum
。对文档的理解很好。有趣的是,他们不只是拒绝非数字值,而不是将意图隐藏在文档中。@Johan,我对最短答案的投票。没有人注意到社区标记为重复的>♦ 2015年5月11日15时17分<是在2015年添加的?!2010年11月/12月,SOF搜索引擎发生了什么变化?当时它可能被标记为重复imho。用问题回答不是很自信。另一个答案值得更多的选票。