我想用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相关问答推荐

如何有效地计算Kernel/Matrix

如何将参数/值从测试方法传递给pytest的fixture函数?

CDKTF ec2 具有特定私有 IP 地址的娱乐

如何使用python将pdf文件的页面合并为单个垂直组合页面

Python根据条件从多行读取值

DataFrame列中如何迭代重复值?

如何统计一个值连续出现的次数?

通过匹配第一列的行值,逐个单元格地添加两个Pandas 数据框中的浮点数

attrs 将 list[str] 转换为 list[float]

Pandas DataFrame:使用 Pandas 将 NaN 值替换为 3 行以上的平均值

Einsum 对于张量乘法很慢

在字符串中查找正则表达式的所有模式

Python 3 `str.__getitem__` 的计算复杂度是多少?

是否将dict转换为一个数据帧,每个值都有重复的键?

如何从左到右解包元组?

IronPython 3 支持?

0 是 0 == 0(#evaluates 为真?)

map 对象不是 JSON 可序列化的

Python pathlib 获取父级相对路径

交错4个相同长度的python列表