如何生成唯一的itertools链?

use*_*074 2 python unique python-itertools python-3.x

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

set.union({1,2,3},{3,4,2,5},{1,6,2,7})
Run Code Online (Sandbox Code Playgroud)

(显然,这将返回生成器,而不是集合)

Zer*_*eus 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
Run Code Online (Sandbox Code Playgroud)

...而它正在起作用:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

另外,如果您希望从较小的构建基块中构成解决方案(这是一种更灵活,更“ itertoolsy”的方法),则可以编写一个通用uniq()函数并将其与chain()

def uniq(iterable):
    seen = set()
    for x in iterable:
        if x in seen:
            continue
        seen.add(x)
        yield x
Run Code Online (Sandbox Code Playgroud)

实际上:

>>> 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]
Run Code Online (Sandbox Code Playgroud)