我怎样才能得到在Python中的两个列表的连接而不修改任何一个?
在Python中,我可以find连接两个列表的唯一方法是list.extend
,它修改第一个列表。 有没有任何连接函数返回其结果而不修改其参数?
是: list1+list2
。 这给出了一个新的列表,即list1
和list2
的连接。
根据你创builditertools.chain
来使用它可能是你最好的select:
>>> import itertools >>> a = [1, 2, 3] >>> b = [4, 5, 6] >>> c = itertools.chain(a, b)
这为组合列表中的项目创build了一个生成器,其优点是不需要创build新列表,但是仍然可以像使用两个列表的连接一样使用c
:
>>> for i in c: ... print i 1 2 3 4 5 6
如果你的列表很大,效率是一个问题,那么itertools
模块的这个和其他方法是非常方便的知道。
请注意,这个例子使用了c
的项目,所以你需要重新初始化它,然后才能重用它。 当然你可以使用list(c)
来创build完整的列表,但是这会在内存中创build一个新的列表。
你也可以使用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
除了string的明显例外:
>>> 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]
怎么样list1 + list2
?
你总是可以创build一个新的列表,这是添加两个列表的结果。
>>> k = [1,2,3] + [4,7,9] >>> k [1, 2, 3, 4, 7, 9]
列表是可变序列,所以我想通过扩展或附加来修改原始列表是有意义的。
只是让你知道:
当你写list1 + list2
,你正在调用list1
的__add__
方法,它返回一个新的列表。 这样你也可以通过将__add__
方法添加到你的个人类来处理myobject + list1
。
如果你有两个以上的列表来连接:
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)
它实际上并没有节省任何时间(中间列表仍然被创build),但是如果你有一个可变数量的列表来扁平化,例如*args
,那么这个列表很好。