python - 防止生成器产生相同的对象两次
问题描述
假设我有一个生成器产生可散列值(str
/int
等),有没有办法防止生成器产生相同的值两次?
显然,我使用的是生成器,所以我不需要先解包所有值,所以类似的东西yield from set(some_generator)
不是一个选项,因为这将解包整个生成器。
例子:
# Current result
for x in my_generator():
print(x)
>>> 1
>>> 17
>>> 15
>>> 1 # <-- This shouldn't be here
>>> 15 # <-- This neither!
>>> 3
>>> ...
# Wanted result
for x in my_no_duplicate_generator():
print(x)
>>> 1
>>> 17
>>> 15
>>> 3
>>> ...
什么是最 Pythonic 的解决方案?
解决方案
你可以试试这个:
def my_no_duplicate_generator(iterable):
seen = set()
for x in iterable:
if x not in seen:
yield x
seen.add(x)
您可以通过将生成器作为参数传递来使用它:
for x in my_no_duplicate_generator(my_generator()):
print(x)
推荐阅读
- excel - 选择整个过滤的行,而不仅仅是单元格
- angular - Angular 在 scss 中使用图像 url 不起作用
- casting - Ceylon 是否允许显式类型转换(向下转换)?
- nginx - nginx 不服务于非 www 域
- reactjs - 禁用后后退按钮不会再次启用
- security - 通过上下文感知访问保护的 Google 登录?
- python - Seaborn TypeError:没有找到与指定签名匹配的循环,并且在使用hue时找不到ufunc add
- javascript - 未知对象的打字稿类型
- python - 继续尝试请求之间的 API 密钥 [flask 和 flask_restful]
- cmake - 找不到 GTest 但已获取 googletest