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

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

本问题已经有最佳答案,请猛点这里访问。

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


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


根据创建后您将如何使用它,itertools.chain可能是您的最佳选择:

1
2
3
4
>>> import itertools
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = itertools.chain(a, b)

这样就为组合列表中的项目创建了一个生成器,其优点是不需要创建新的列表,但是您仍然可以使用c,就像它是两个列表的串联:

1
2
3
4
5
6
7
8
>>> for i in c:
...     print i
1
2
3
4
5
6

如果您的列表很大,并且效率是一个问题,那么来自itertools模块的这种方法和其他方法非常容易知道。

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


concatenated_list = list_1 + list_2


你也可以使用sum,如果你给它一个start的论点:

1
2
3
4
>>> 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]

这通常适用于任何具有+运算符的对象:

1
2
3
4
5
6
7
8
>>> 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

除了弦乐之外:

1
2
3
4
>>> 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]


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

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

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


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

1
2
3
4
5
6
7
import operator
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