首页 > 解决方案 > 防止生成器产生相同的对象两次

问题描述

假设我有一个生成器产生可散列值(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 的解决方案?

标签: python

解决方案


你可以试试这个:

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)

推荐阅读