如何生成独特的itertools链?

时间:2017-03-08 04:25:14

标签: python python-3.x unique itertools

例如,itertools.chain()相当于:

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

(显然返回一个生成器,而不是一组)

2 个答案:

答案 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))