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

Rya*_*son 636 python concatenation sequence list-manipulation

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

NPE*_*NPE 1079

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

  • 实际上你可以使用一个非隐藏函数来做到这一点:import operator,operator.add(list1,list2) (34认同)
  • reduce(operator.add,[[1,2],[3,4],[5,6]])== [1,2,3,4,5,6].或者您可以使用itertools.chain而不是operator.add (15认同)
  • 嗯,这解释了它.我一直在寻找一个函数名,而不是一个运算符(是的,我知道运算符是由隐藏函数实现的.) (3认同)
  • 你也可以使用`numpy.concatenate((a,b),axis=0)` (3认同)
  • 您还可以使用 list1.extend(list2) (2认同)

Sco*_*ths 151

根据您创建它的方式,一旦创建它itertools.chain可能是您最好的选择:

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

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

>>> for i in c:
...     print i
1
2
3
4
5
6
Run Code Online (Sandbox Code Playgroud)

如果您的列表很大并且效率是一个问题,那么itertools模块中的这个和其他方法非常方便.

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

  • 只是说itertools.chain返回一个生成器...... (11认同)

Joh*_*ski 111

concatenated_list = list_1 + list_2


Tho*_*hle 96

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]
Run Code Online (Sandbox Code Playgroud)

这适用于任何有+运算符的东西:

>>> 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
Run Code Online (Sandbox Code Playgroud)

除了字符串之外的明显例外:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

  • 在Python 3.5.2中,`sum`被记录为"此函数专门用于数值并可能拒绝非数字类型".所以我不确定`sum`应该像这样使用. (3认同)

pyf*_*unc 44

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

>>> k = [1,2,3] + [4,7,9]
>>> k
[1, 2, 3, 4, 7, 9]
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您不再需要未修改的列表,则修改原始列表才有意义,因此在这种情况下它没有意义. (2认同)

Jak*_*ger 22

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

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)
Run Code Online (Sandbox Code Playgroud)

它实际上并不会在任何时候保存你(中间列表仍然是创建的)但是如果你有一个可变数量的列表要变平,那就太好了,例如*args.


Ant*_*Ant 15

只是让你知道:

在编写时list1 + list2,您正在调用__add__方法list1,该方法返回一个新列表.通过这种方式,您还可以myobject + list1通过将__add__方法添加到您的个人课程来处理.