python多列表合并 - python打印list




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

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

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

标题为Additional Unpacking Generalizations的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

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

例:

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

预期结果:

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

一个真正简洁的方式来添加列表是

li = [[1,2,3], [4,5,6], [7,8,9]]
reduce(list.__add__,li)

这给了我们

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

作为更多列表的更通用的方法,您可以将它们放入列表中并使用itertools.chain.from_iterable() 1函数,该函数基于THIS答案是平坦化嵌套列表的最佳方式:

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


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

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

你可以去extend功能。

l1 = [1,2,3]
l2 = [4,5,6]
l1.extend(l2)
print l1

输出: [1,2,3,4,5,6]


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

在Python中加入两个列表:

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

如果你想以排序的形式合并这两个列表,你可以使用heapq库中的合并功能。

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]

或者,如果您不喜欢使用dunders ,则可以使用operator导入:

import operator

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

result = operator.add(listone, listtwo)
print(result)

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

有人可能会认为这样更具可读性。


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

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

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

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

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

mergedlist = list(set(listone + listtwo))

正如许多人已经指出的那样,如果需要对两个列表应用完全相同的处理itertools.chain()就是要走的路。 就我而言,我有一个标签和一个标签,这些标签与另一个标签不同,所以我需要稍微复杂一些的东西。 事实证明,在幕后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循环for ... in可以与元组变量一起工作,所以很容易在同一时间循环多个变量。


这个问题直接问到关于加入两个列表。 但是,即使您正在寻找联接多个列表的方式(包括加入零列表时的情况),它的搜索量也非常高。 考虑这种更通用的方法:

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

更新

Patrick Collins在评论中提出的替代方案也适用于您:

sum(a, [])

import itertools

A = list(zip([1,3,5,7,9],[2,4,6,8,10]))
B = [1,3,5,7,9]+[2,4,6,8,10]
C = list(set([1,3,5,7,9] + [2,4,6,8,10]))

D = [1,3,5,7,9]
D.append([2,4,6,8,10])

E = [1,3,5,7,9]
E.extend([2,4,6,8,10])

F = []
for a in itertools.chain([1,3,5,7,9], [2,4,6,8,10]):
    F.append(a)


print ("A: " + str(A))
print ("B: " + str(B))
print ("C: " + str(C))
print ("D: " + str(D))
print ("E: " + str(E))
print ("F: " + str(F))

输出:

A: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
B: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
C: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
D: [1, 3, 5, 7, 9, [2, 4, 6, 8, 10]]
E: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
F: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

list(set(listone) | set(listtwo))

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





list