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

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

例:

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

预期结果:

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

Python使这个很容易。

 mergedlist = listone + listtwo 

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

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

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

 mergedlist = list(set(listone + listtwo)) 

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

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

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

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

Python >= 3.5替代: [*l1, *l2]

尽pipe这是一个古老的答案,但是通过接受PEP 448引入了另一个备选scheme,值得一提。

标题为Additional Unpacking Generalizations的PEP通常在Python中使用星号*expression时减less了一些语法限制; 与它,join两个列表(适用于任何迭代)现在也可以完成:

 >>> 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] 

这个function是为Python 3.5定义的,它没有在3.x系列中被移植到以前的版本。 在不受支持的版本中,将引发SyntaxError

与其他方法一样,这也会创build相应列表中元素的浅表副本


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

这对于将可迭代项加到列表中,如my_list + list(my_tuple) + list(my_range) ,现在相当于只是[*my_list, *my_tuple, *my_range]

所以,加+会由于types不匹配而引发TypeError

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

以下将不会:

 res = [*l, *r] 

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


一个不错的小振作是它比其他方法更快:

 # 4 lists of 1000 elements l1, l2, l3, l4 = [[*range(1000)] for _ in range(4)] # unpacking into [] %timeit [*l1, *l2, *l3, *l4] 10000 loops, best of 3: 23.7 µs per loop # using + %timeit l1 + l2 + l3 + l4 10000 loops, best of 3: 50.7 µs per loop # using itertools.chain %timeit list(itertools.chain(l1, l2, l3, l4)) 10000 loops, best of 3: 57.9 µs per loop 

itertools.chainclosures了这个差距,当清单的大小(在我的机器至less)超过1米的元素。 (在这种情况下,你可能不应该使用Python列表:-)

您可以简单地使用++=运算符,如下所示:

 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)) 

这个问题直接要求join两个列表。 但是,即使您正在寻找联接多个列表(包括join零列表的情况)的方式,search也相当高。 考虑这个更通用的方法:

 a = [[1,2,3], [4,5,6], [7,8,9]] reduce(lambda c, x: c + x, a, []) 

会输出:

 [1, 2, 3, 4, 5, 6, 7, 8, 9] 

请注意,当a[][[1,2,3]]时,这也能正常工作。

但是,这可以通过itertools更高效地完成:

 a = [[1,2,3], [4,5,6], [7,8,9]] list(itertools.chain(*a)) 

如果你不需要一个list ,但只是一个迭代,省略list()

更新

帕特里克柯林斯在评论中提出的替代scheme也适用于你:

 sum(a, []) 

值得注意的是, itertools.chain函数接受可变数目的参数:

 >>> l1 = ['a']; l2 = ['b', 'c']; l3 = ['d', 'e', 'f'] >>> [i for i in itertools.chain(l1, l2)] ['a', 'b', 'c'] >>> [i for i in itertools.chain(l1, l2, l3)] ['a', 'b', 'c', 'd', 'e', 'f'] 

如果可迭代(元组,列表,生成器等)是input,则可以使用from_iterable类方法:

 >>> il = [['a'], ['b', 'c'], ['d', 'e', 'f']] >>> [i for i in itertools.chain.from_iterable(il)] ['a', 'b', 'c', 'd', 'e', 'f'] 

使用Python 3.3+,你可以使用yield :

 listone = [1,2,3] listtwo = [4,5,6] def merge(l1, l2): yield from l1 yield from l2 >>> list(merge(listone, listtwo)) [1, 2, 3, 4, 5, 6] 

或者,如果你想支持任意数量的迭代器:

 def merge(*iters): for it in iters: yield from it >>> list(merge(listone, listtwo, 'abcd', [20, 21, 22])) [1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 20, 21, 22] 

如果您想要以sorting的forms合并这两个列表,则可以使用heapq库中的合并function。

 from heapq import merge a = [1,2,4] b = [2,4,6,7] print list(merge(a,b)) 

如果您不想或不能使用加号运算符( + ),则可以使用__add__函数:

 listone = [1,2,3] listtwo = [4,5,6] result = list.__add__(listone, listtwo) print(result) >>> [1, 2, 3, 4, 5, 6] 

在Python中join两个列表:

 >>> a = [1, 2, 3, 4] >>> b = [1, 4, 6, 7] >>> c = a + b >>> c [1, 2, 3, 4, 1, 4, 6, 7] 

如果你不想要任何重复:

 >>> a = [1, 2, 3, 4, 5, 6] >>> b = [5, 6, 7, 8] >>> c = list(set(a + b)) >>> c [1, 2, 3, 4, 5, 6, 7, 8] 

如果需要将两个有序列表与复杂的sorting规则合并,则可能需要像下面的代码(使用简单的sorting规则进行可读性:-))自行滚动。

 list1 = [1,2,5] list2 = [2,3,4] newlist = [] while list1 and list2: if list1[0] == list2[0]: newlist.append(list1.pop(0)) list2.pop(0) elif list1[0] < list2[0]: newlist.append(list1.pop(0)) else: newlist.append(list2.pop(0)) if list1: newlist.extend(list1) if list2: newlist.extend(list2) assert(newlist == [1, 2, 3, 4, 5]) 

作为更多列表的更一般的方法,你可以把它们放在一个列表中,并使用itertools.chain.from_iterable()函数,基于这个答案是平坦化嵌套列表的最佳方法:

 >>> l=[[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> import itertools >>> list(itertools.chain.from_iterable(l)) [1, 2, 3, 4, 5, 6, 7, 8, 9] 

1.请注意, chain.from_iterable()在python => 2.6中可用。在其他版本中,使用chain(*l)

你可以使用在list对象上定义的append()方法:

 mergedlist =[] for elem in listone: mergedlist.append(elem) for elem in listtwo: mergedlist.append(elem) 
 list(set(listone) | set(listtwo)) 

上面的代码不保留顺序,从每个列表中删除重复(但不是从连接列表中删除)

正如许多人已经指出的那样, itertools.chain()是需要对两个列表应用完全相同的处理的方法 。 就我而言,我有一个不同于一个列表的标签和一个标志,所以我需要一些稍微复杂的东西。 事实certificate,在幕后itertools.chain()只是做到以下几点:

 for it in iterables: for element in it: yield element 

(请参阅https://docs.python.org/2/library/itertools.html ),所以我从这里获得了灵感,并且写了一些这样的话:

 for iterable, header, flag in ( (newList, 'New', ''), (modList, 'Modified', '-f')): print header + ':' for path in iterable: [...] command = 'cp -r' if os.path.isdir(srcPath) else 'cp' print >> SCRIPT , command, flag, srcPath, mergedDirPath [...] 

这里要理解的要点是列表只是一个可迭代的特例,它们是任何其他的对象; 并且for ... in python for ... in循环,可以使用元组variables,所以很容易在多个variables上同时循环。

 lst1 = [1,2] lst2 = [3,4] def list_combinationer(Bushisms, are_funny): for item in lst1: lst2.append(item) lst1n2 = sorted(lst2) print lst1n2 list_combinationer(lst1, lst2) [1,2,3,4] 

如果你想要一个新的列表,同时保留两个旧列表:

 joinedList = [] for i in listOne: joinedList.append(i) for j in listTwo: joinedList.append(j) sorted(joinedList) return joinedList