题 如何在Python中连接两个列表?


如何在Python中连接两个列表?

例:

listone = [1, 2, 3]
listtwo = [4, 5, 6]

预期结果:

>>> joinedlist
[1, 2, 3, 4, 5, 6]

1643
2017-11-12 07:04


起源


如果listone是什么呢? [3,2,1]?输出会改变吗? - barkmadley
'合并'为'创建一个浅拷贝','深拷贝'或'迭代'? (@Clergyman,它根本不是那么微不足道) - smci
这个操作不是叫做的 concatination 而不是 合并?我一直认为合并意味着连接+排序。 - Lenar Hoyt
你想要简单吗? 附加,或者你想 按排序顺序合并两个列表?您对[1,3,6]和[2,4,5]的期望是什么?我们是否可以假设两个子列表已经排序(如您的示例中所示)? - smci
@LenarHoyt正确。合并意味着某种至少是任意或关系的排序。 - Benjamin R


答案:


你可以使用 + 运算符组合它们:

listone = [1,2,3]
listtwo = [4,5,6]

mergedlist = listone + listtwo

输出:

>>> mergedlist
[1,2,3,4,5,6]

2704
2017-11-12 07:07



这会创建listone的深层副本并附加listtwo吗? - Daniel F
@Daniel它将创建一个新列表,其中包含第一个列表中项目的浅表副本,然后是第二个列表中项目的浅表副本。使用copy.deepcopy获取列表的深层副本。 - Daniel G
另一个有用的细节: listone += listtwo 结果是 listone == [1, 2, 3, 4, 5, 6] - rickcnagy
@ br1ckb0t会改变listone指向的内容吗?所以:list3 = listone  listone+=listtwo       list3也改变了吗? - MikeH
它确实改变了list3。但是,如果这不是问题,那么添加两个列表而不是创建新列表会更简单。 - rickcnagy


也可以创建一个简单地迭代两个列表中的项目的生成器。这允许您将列表(或任何可迭代的)链接在一起进行处理,而无需将项目复制到新列表:

import itertools
for item in itertools.chain(listone, listtwo):
   # do something with each list item

215
2017-11-12 20:01



这是更好的方法,因为它也适用于numpy数组。 - d.putto
这将以相同的方式工作:mergedList = itertools.chain(listone,listtwo)for mergedList中的项目: - zakdances
@d.putto:numpy数组的单项访问速度非常慢(每次访问都需要将原始内存转换为C类型为Python对象。矢量化操作如 np.dot() 直接处理C类型而无需往返Python,因此速度很快。你可以用 merged = np.r_[a, b] 得到连接的numpy数组。 - jfs


您可以使用集合来获取唯一值的合并列表

mergedlist = list(set(listone + listtwo))

151
2017-09-20 08:43



这将丢失订购信息。 - aaronasterling
但是,如果这是您感兴趣的话,那么它也会删除重复项。列表添加不会那样做。 - metasoarous
比...更好 listone + [x for x in listtwo if x not in listone] - Natim
如果我有一个列表列表,例如: [[0, 5], [1, 10], [0, 7], [3, 5]]  如何合并它们以避免密钥中的重复(每个子列表中的第一个值),但如果它们是重复的,最终会得到第二个值的总和?像这样: [[0, 12], [1, 10], [3, 5]]  谢谢 - Jose Salvatierra
+1恕我直言这是“合并”(联合)列表的正确方法,而“已批准”的答案描述了如何组合/添加列表(multiset) - alfasin


你也可以使用 extend 为了添加一个 list 添加另一个的结尾:

listone = [1,2,3]
listtwo = [4,5,6]
mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)

100
2018-02-25 15:13



你可以只使用listone.extend(listtwo),但很快就会被弃用 - Sergey Ivanov
@SergeyIvanov不,不会。 list.extend 不会去任何地方。 - Jim Fasarakis Hilliard


蟒蛇 >= 3.5 替代方案: [*l1, *l2]

尽管这是一个古老的答案,但通过接受已经引入了另一种替代方案 PEP 448 值得一提的是。

PEP,标题为 其他拆包概括,通常在使用已加星标时减少一些语法限制 * Python中的表达式;有了它,加入两个列表(适用于任何可迭代的)现在也可以用:

>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]

#unpack both iterables in a list literal
>>> joinedList = [*l1, *l2]
>>> print(joinedList)
[1, 2, 3, 4, 5, 6]

这个功能 是为Python定义的 3.5 它没有被移植到以前的版本中 3.x 家庭。在不受支持的版本中 SyntaxError 将被提出。

与其他方法一样,这也是如此 创建浅层副本 相应列表中的元素。


上边 这种方法是你真的不需要列表来执行它,任何可迭代的东西都可以。如PEP所述:

这也可以作为一种更可读的方式将迭代累加到一个   列表,如 my_list + list(my_tuple) + list(my_range) 这是现在   相当于 [*my_list, *my_tuple, *my_range]

所以虽然加上了 + 会提高一个 TypeError 由于类型不匹配:

l = [1, 2, 3]
r = range(4, 7)
res = l + r

以下不会:

res = [*l, *r]

因为它将首先解压缩迭代的内容,然后简单地创建一个 list 从内容。


97
2017-11-12 07:07



这个:lst = [1,2,3,*[4,5,6]] 说过 Expected:] - Mahesha999
@ Mahesha999似乎无法验证,它对我来说是预期的。 - Jim Fasarakis Hilliard


这很简单,我认为它甚至显示在 教程

>>> listone = [1,2,3]
>>> listtwo = [4,5,6]
>>>
>>> listone + listtwo
[1, 2, 3, 4, 5, 6]

57
2018-03-05 09:15



这也适用于 listone 和 listtwo 有不同数量的元素;-) - albus_c


你可以简单地使用 + 要么 += 运营商如下:

a = [1, 2, 3]
b = [4, 5, 6]

c = a + b

要么:

c = []
a = [1, 2, 3]
b = [4, 5, 6]

c += (a + b)

此外,如果您希望合并列表中的值是唯一的,您可以执行以下操作:

c = list(set(a + b))

33
2017-10-09 23:21