两个迭代器的并集

1 投票
1 回答
2331 浏览
提问于 2025-04-16 06:57

考虑一下这两个迭代器 count(3,3)count(5,5)。我该如何创建一个迭代器,只输出出现在 count(3,3)count(5,5) 中的数字呢?

1 个回答

1

为了给这个问题一个答案,提问者在评论中接受了(x for x in count(3) if not x%3 or not x%5)作为解决方案。接下来介绍的方法适用于一般情况,只要允许重复。如果不允许重复,可以把它放到一个函数里,用一个集合来存储输出,以便后续使用,但这就需要假设最终的总大小。


一种方法就是把两个集合交错在一起。这假设它们的数量是相同的。这样做也会产生重复,正如评论中提到的。

import itertools

def union(it1, it2):
    return (item for pair in itertools.izip(it1, it2) for item in pair)

如果它们的数量不同,那么你会发现其中一个会被截断。下面是一个更通用的解决方案。

import itertools

def union(it1, it2):
    it1, it2 = iter(it1), iter(it2)
    for item in (item for pair in itertools.izip(it1, it2) for item in pair):
        yield item
    for it in (it1, it2):
        for item in it:
            yield item

撰写回答