Zipped Python generators with 2nd one being shorter: how to retrieve element that is silently consumed(压缩的Python生成器,第二个更短:如何检索静默使用的元素)
本文介绍了压缩的Python生成器,第二个更短:如何检索静默使用的元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想用zip
解析两个(可能)不同长度的生成器:
for el1, el2 in zip(gen1, gen2):
print(el1, el2)
但是,如果gen2
的元素较少,则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
为"较长"时,不存在此类"问题"。
问题:有没有办法检索这个缺失值(即我上一个示例中的8
)?...理想情况下使用可变数量的参数(如zip
)。
注意:我目前使用itertools.zip_longest
以另一种方式实现,但我真的很想知道如何使用zip
或等效项获取此缺少的值。
注2:我已经为此REPL中的不同实现创建了一些测试,以防您提交并尝试新的实现:)https://repl.it/@jfthuong/MadPhysicistChester
推荐答案
如果您想要重用代码,最简单的解决方案是:
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生成器,第二个更短:如何检索静默使用的元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:压缩的Python生成器,第二个更短:如何检索静默使用的元素
基础教程推荐
猜你喜欢
- 症状类型错误:无法确定关系的真值 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01