通常,您使用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_longest
用None
s(或您作为fillvalue=
参数传递的任何值)填充较短的可迭代项。如果这不是您想要的,则可以使用一种理解来过滤None
s:
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
改用。