如何在不修改任何一个的情况下在 Python 中获取两个列表的串联?[复制]

How can I get the concatenation of two lists in Python without modifying either one? [duplicate]

提问人:Ryan C. Thompson 提问时间:12/3/2010 更新时间:5/15/2020 访问量:914469

问:

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

Python 串联 序列 列表操作

评论


答:

1151赞 NPE 12/3/2010 #1

是的:。这将给出一个新列表,该列表是 和 的串联。list1 + list2list1list2

评论

34赞 Bite code 4/13/2011
实际上,您可以使用非隐藏函数来执行此操作:import 运算符 operator.add(list1, list2)
18赞 Paul Hollingsworth 9/26/2014
reduce(operator.add, [[1,2], [3,4], [5,6]]) == [1,2,3,4,5,6]。或者你可以使用 itertools.chain 而不是 operator.add
3赞 Akshay 3/9/2016
您还可以使用numpy.concatenate((a,b),axis=0)
2赞 ColinMac 8/29/2019
也可以使用 list1.extend(list2)
117赞 Johan Kotlinski 12/3/2010 #2

concatenated_list = list_1 + list_2

45赞 pyfunc 12/3/2010 #3

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

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

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

评论

2赞 Scott Griffiths 12/3/2010
只有当您不再需要未修改的列表时,修改原始列表才有意义,因此在这种情况下,它没有意义。
174赞 Scott Griffiths 12/3/2010 #4

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

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

请注意,此示例用完了 中的项,因此您需要先重新初始化它,然后才能重用它。当然,您可以只用于创建完整列表,但这会在内存中创建一个新列表。clist(c)

评论

11赞 Ant 12/3/2010
只要说 itertools.chain 返回一个生成器......
16赞 Ant 12/3/2010 #5

只是为了让您知道:

当你写 时,你正在调用 的方法,它返回一个新列表。通过这种方式,您还可以通过将方法添加到您的个人类中来处理。list1 + list2__add__list1myobject + list1__add__

24赞 Jake Biesinger 8/27/2013 #6

如果您有两个以上的列表要连接:

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

102赞 Thomas Ahle 2/12/2014 #7

如果你给它一个参数,你也可以使用 ,:sumstart

>>> 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赞 Robie Basak 7/27/2017
在 Python 3.5.2 上,记录为“此函数专门用于数值,可能会拒绝非数值类型”。所以我不确定是否应该这样使用。sumsum