如何在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.chain
closures了这个差距,当清单的大小(在我的机器至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