[英]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.