繁体   English   中英

防止生成器两次产生相同的对象

[英]Preventing a generator from yielding the same object twice

假设我有一个生成器产生可哈希值( str / int等),是否有办法防止生成器两次产生相同的值?

显然,我使用的是生成器,所以我不需要先解压缩所有值,因此,诸如yield from set(some_generator)事情就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)

在Python itertools模块食谱中有一个unique_everseen ,大致相当于@NikosOikou的答案。

这些解决方案的主要缺点是,它们依赖于以下假设:可迭代的元素是可哈希的:

>>> L = [[1], [2,3], [1]]
>>> seen = set()
>>> for e in L: seen.add(e)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

more-itertools模块对实现进行了改进,以接受unhashables元素,并且该文档提供了有关在某些情况下如何保持良好速度的提示(免责声明:我是提示的“作者”)。

您可以检查源代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM