例如,itertools.chain()
相当于:
set.union({1,2,3},{3,4,2,5},{1,6,2,7})
(显然返回一个生成器,而不是一组)
答案 0 :(得分:6)
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]
或者,如果您更喜欢从较小的构建块构建解决方案(这是一种更灵活且“迭代”的方式),您可以编写通用uniq()
函数并将其与{{ 1}}:
chain()
行动中:
def uniq(iterable):
seen = set()
for x in iterable:
if x in seen:
continue
seen.add(x)
yield x
答案 1 :(得分: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))