一尘不染

将python中的不相等列表压缩到一个列表中,该列表不会从要压缩的较长列表中删除任何元素

python

我有两个清单

a = [1,2,3]
b = [9,10]

我想将这两个列表合并(压缩)到一个列表中c,这样

c = [(1,9), (2,10), (3, )]

Python的标准库中是否有任何函数可以做到这一点?


阅读 171

收藏
2020-12-20

共1个答案

一尘不染

通常,您使用itertools.zip_longest以下方法:

>>> import itertools
>>> a = [1, 2, 3]
>>> b = [9, 10]
>>> for i in itertools.zip_longest(a, b): print(i)
... 
(1, 9)
(2, 10)
(3, None)

但是zip_longestNones(或您作为fillvalue=参数传递的任何值)填充较短的可迭代项。如果这不是您想要的,则可以使用一种理解来过滤Nones:

for i in (tuple(p for p in pair if p is not None) 
          for pair in itertools.zip_longest(a, b)):
    print(i)

但是请注意,如果两个可迭代对象都具有None值,则也会将其过滤掉。如果您不想这样做,请定义自己的对象fillvalue=并过滤该对象,而不是None

_marker = object()

def zip_longest_no_fill(a, b):
    for i in itertools.zip_longest(a, b, fillvalue=_marker):
        yield tuple(x for x in i if x is not _marker)

list(zip_longest_no_fill(a, b))  # [(1, 9), (2, 10), (3,)]

在Python
2上,请itertools.izip_longest改用。

2020-12-20