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]