例如,什麼是itertools.chain()
等價的:如何生成獨特的itertools鏈?
set.union({1,2,3},{3,4,2,5},{1,6,2,7})
(顯然它返回一個發電機,而不是一組)
例如,什麼是itertools.chain()
等價的:如何生成獨特的itertools鏈?
set.union({1,2,3},{3,4,2,5},{1,6,2,7})
(顯然它返回一個發電機,而不是一組)
沒有在任何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]
你可以做這樣的事情:
def chain_unique(*args):
seen = set()
yield from (v for v in chain(*args) if v not in seen and not seen.add(v))
它的工作原理,但我認爲把這麼多的邏輯打包成一行代碼並不是pythonic – wim
你能提供一些投入和產出?目前還不清楚你使用的術語是什麼。 –
我不用你可以用iterable來做到這一點:需要有一些方法來查看當前元素是否已經存在於輸出中,因此需要存儲輸出並將其追加到它的途中。 – Evert