2017-03-08 32 views
1

例如,什麼是itertools.chain()等價的:如何生成獨特的itertools鏈?

set.union({1,2,3},{3,4,2,5},{1,6,2,7}) 

(顯然它返回一個發電機,而不是一組)

+0

你能提供一些投入和產出?目前還不清楚你使用的術語是什麼。 –

+0

我不用你可以用iterable來做到這一點:需要有一些方法來查看當前元素是否已經存在於輸出中,因此需要存儲輸出並將其追加到它的途中。 – Evert

回答

4

沒有在任何itertools將你直接這樣做。

爲了避免產生重複的項目,您需要跟蹤您已經屈服了什麼,顯而易見的方法是使用一組。這裏是圍繞itertools.chain()一個簡單的包裝,其確實是:

from itertools import chain 

def uniq_chain(*args, **kwargs): 
    seen = set() 
    for x in chain(*args, **kwargs): 
     if x in seen: 
      continue 
     seen.add(x) 
     yield x 

...這裏是它的行爲:

>>> list(uniq_chain(range(0, 20, 5), range(0, 20, 3), range(0, 20, 2))) 
[0, 5, 10, 15, 3, 6, 9, 12, 18, 2, 4, 8, 14, 16] 

另外,如果您更喜歡用從較小的構建塊解決方案(這是一個更加靈活和「itertoolsy」的方式做到這一點),你可以寫一個通用uniq()功能,並與chain()結合起來:

def uniq(iterable): 
    seen = set() 
    for x in iterable: 
     if x in seen: 
      continue 
     seen.add(x) 
     yield x 

在行動:

>>> list(uniq(chain(range(0, 20, 5), range(0, 20, 3), range(0, 20, 2)))) 
[0, 5, 10, 15, 3, 6, 9, 12, 18, 2, 4, 8, 14, 16] 
0

你可以做這樣的事情:

def chain_unique(*args): 
    seen = set() 
    yield from (v for v in chain(*args) if v not in seen and not seen.add(v)) 
+1

它的工作原理,但我認爲把這麼多的邏輯打包成一行代碼並不是pythonic – wim