3 回答
TA贡献1817条经验 获得超6个赞
有几种不同的方法可以做到这一点。
您可以将法线zip()与迭代器一起使用并手动检查它是否已耗尽。
def check_consumed(it):
try:
next(it)
except StopIteration:
pass
else:
raise ValueError('rightmost iterable was not consumed')
b_it = iter(b)
list(zip(a, b_it))
check_consumed(b_it)
您可以将法线包裹起来zip()为您进行检查。
def myzip(a, b):
b_it = iter(b)
yield from zip(a, b_it)
# Or, if you're on a Python version that doesn't have yield from:
#for item in zip(a, b_it):
# yield item
check_consumed(b_it)
list(myzip(a, b))
您可以zip()使用iter()和从头开始编写自己的代码next()。
(这个没有代码,因为选项 2 在各方面都优于这个)
TA贡献1827条经验 获得超4个赞
使用 itertools 中的 zip_longest 的其他选项。如果所有列表都被消耗,它也会返回 true 或 false。也许不是最有效的方法,但可以改进:
from itertools import zip_longest
a = ['a', 'b', 'c', 'd']
b = [1, 2, 3, 4, 5]
c = ['aa', 'bb', 'cc', 'dd', 'ee', 'ff']
def myzip(*iterables):
consumed = True
zips = []
for zipped in zip_longest(*iterables):
if None in zipped:
consumed = False
else:
zips.append(zipped)
return [zips, consumed]
list(myzip(a, b, c))
#=> [[('a', 1, 'aa'), ('b', 2, 'bb'), ('c', 3, 'cc'), ('d', 4, 'dd')], False]
添加回答
举报