簡體   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