我想用zip解析两个(可能)不同长度的生成器:

for el1, el2 in zip(gen1, gen2):
    print(el1, el2)

然而,如果"gen1"中的一个元素消耗较少,则"gen1"中的一个元素消耗较少.

例如

def my_gen(n:int):
    for i in range(n):
        yield i

gen1 = my_gen(10)
gen2 = my_gen(8)

list(zip(gen1, gen2))  # Last tuple is (7, 7)
print(next(gen1))  # printed value is "9" => 8 is missing

gen1 = my_gen(8)
gen2 = my_gen(10)

list(zip(gen1, gen2))  # Last tuple is (7, 7)
print(next(gen2))  # printed value is "8" => OK

显然,缺少一个值(在我之前的示例中为8),因为gen1在意识到gen2没有更多元素之前被读取(从而生成值8).但这个值在宇宙中消失了.当gen2是"更长"时,就不存在这样的"问题".

QUESTION:有没有办法检索这个缺失的值(例如,在我之前的示例中为8)...理想情况下,参数的数量是可变的(比如zip).

NOTE: I have currently implemented in another way by using 100 but I really wonder how to get this missing value using 101 or equivalent.

NOTE 2: I have created some tests of the different implementations in this REPL in case you want to submit and try a new implementation :) 100

推荐答案

如果要重用代码,最简单的解决方案是:

from more_itertools import peekable

a = peekable(a)
b = peekable(b)

while True:
    try:
        a.peek()
        b.peek()
    except StopIteration:
        break
    x = next(a)
    y = next(b)
    print(x, y)


print(list(a), list(b))  # Misses nothing.

您可以使用以下设置测试此代码:

def my_gen(n: int):
    yield from range(n)

a = my_gen(10)
b = my_gen(8)

它将打印:

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

Python-3.x相关问答推荐

我有个问题继承遗产合伙人

如何创建多个日志(log)文件

Python gpsd客户端

当条件第一次出现时将行标记为True,如果按顺序重复则标记为False

对大型数据框中的选定列进行重新排序

重复数组直到一定长度 groupby pandas

TypeError: issubclass() arg 1 在 Flask 中导入 langchain 时必须是一个类

一起使用数据类和枚举

过滤列表中的所有字典以使用特定键并忽略其他键?

Python Regex 查找给定字符串是否遵循交替元音、辅音或辅音、元音的连续模式

当我判断另一个 checkButton 时,如何判断两个 python tkinter checkButtons?

过滤查询集和Q运算符的不同值

根据另一列值对多个数据框列进行分组

你如何表达一个没有参数的 Python Callable?

Seaborn 热图 colored颜色 条标签作为百分比

Python过滤器函数 - 单个结果

Python中的多行日志(log)记录

如何将 Matplotlib 图形转换为 PIL Image 对象(不保存图像)

python - Pandas - Dataframe.set_index - 如何保留旧的索引列

Django 教程 unicode 不起作用