【发布时间】:2011-05-19 15:28:15
【问题描述】:
在 Python 中,连接两个列表的唯一方法是 list.extend,它修改了第一个列表。有没有不修改参数就返回结果的连接函数?
【问题讨论】:
标签: python concatenation sequence list-manipulation
在 Python 中,连接两个列表的唯一方法是 list.extend,它修改了第一个列表。有没有不修改参数就返回结果的连接函数?
【问题讨论】:
标签: python concatenation sequence list-manipulation
是的:list1 + list2。这给出了一个新列表,它是list1 和list2 的串联。
【讨论】:
numpy.concatenate((a,b),axis=0)
最简单的方法就是使用+ 运算符,它返回列表的连接:
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应该这样使用。
您总是可以创建一个新列表,这是添加两个列表的结果。
>>> k = [1,2,3] + [4,7,9]
>>> k
[1, 2, 3, 4, 7, 9]
列表是可变序列,所以我想通过扩展或追加来修改原始列表是有意义的。
【讨论】:
如果你有两个以上的列表要连接:
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。
【讨论】: