2012-04-27 42 views
0

目前我在做這個構建發電機返回唯一值:是否可能,建議從集合

# duplicates is a list 
uniques = list(set(duplicates)) 

然而,唯一往往是暫時性的。爲唯一身份構建一個發電機會更好嗎?如果是這樣,我將如何做到這一點?

回答

0

有使用發電機,而不是靜態的集合,其中只有一個(可能)在這裏也適用兩種可能的好處:

  • 內存使用情況。這裏不適用,因爲要產生唯一性,你需要這種方式的O(n)內存或其他方法

  • 時間 - 如果您希望僅消耗部分生成的輸出,那麼您可以通過延遲生成來節省時間。所以,如果這是你的情況,那麼使用發電機可以爲你節省一些處理能力。當然,爲了產生獨特的懶惰,你需要記住已經產生的一組值(見上),並在你去的時候過濾掉它們。

1

我不完全清楚你希望通過使用發電機來實現什麼。

有一點很清楚:它不會降低內存需求,因爲爲了確定當前元素是否是唯一的,生成器需要知道先前看到的所有獨特元素。

另外,在list(set(...))中構建列表的目的還不完全清楚。爲什麼不堅持你已經構建的套裝?

1

如果您不需要列表,請改爲使用set(duplicates)。這大概減半了你的記憶使用。集合是可迭代的。

或者,您也可以定義一個發電機:

def uniques(it): 
    seen = set() 
    for x in it: 
     if x not in seen: 
      yield x 
      seen.add(x) 

,但我的直覺是,這將不僅僅是一次性構建一組慢了許多。無論如何,內存消耗大致相同。

相關問題