如何生成独特的itertools链?

2024-04-24 20:16:49 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,itertools.chain()的等价物是什么:

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

(显然,它返回的是生成器,而不是集合)


Tags: chainunionitertoolsset
2条回答

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

。。。在这里,它正在发挥作用:

^{pr2}$

或者,如果您喜欢用更小的构建块(这是一种更灵活且“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))

相关问题 更多 >