Python 两个迭代器的并集

Python 两个迭代器的并集,python,Python,考虑迭代器count(3,3)和count(5,5)。我如何创建一个迭代器,只输出出现在count(3,3)和count(5,5)中的数字?为了回答这个问题,OP在注释中接受(计数(3)中的x代表x,如果不是x%3或不是x%5)。以下内容应适用于一般情况,前提是可接受副本。如果不能接受重复,可以将其包装在一个函数中,该函数将其输出存储在一个集合中以供进一步参考,但现在我们正在对最终的总大小进行假设 一种方法就是将两者交错。这假设它们都具有相同的特性。这也将创建注释中指出的重复项 import

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

为了回答这个问题,OP在注释中接受
(计数(3)中的x代表x,如果不是x%3或不是x%5)
。以下内容应适用于一般情况,前提是可接受副本。如果不能接受重复,可以将其包装在一个函数中,该函数将其输出存储在一个集合中以供进一步参考,但现在我们正在对最终的总大小进行假设


一种方法就是将两者交错。这假设它们都具有相同的特性。这也将创建注释中指出的重复项

import itertools

def union(it1, it2):
    return (item for pair in itertools.izip(it1, it2) for item in pair)
如果它们有不同的cardnality,那么您最终将截断其中一个。这里有一个更普遍的解决方案

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

为了回答这个问题,OP在评论中接受了
(计数(3)中的x代表x,如果不是x%3或不是x%5)
。以下内容应适用于一般情况,前提是可接受副本。如果不能接受重复,可以将其包装在一个函数中,该函数将其输出存储在一个集合中以供进一步参考,但现在我们正在对最终的总大小进行假设


一种方法就是将两者交错。这假设它们都具有相同的特性。这也将创建注释中指出的重复项

import itertools

def union(it1, it2):
    return (item for pair in itertools.izip(it1, it2) for item in pair)
如果它们有不同的cardnality,那么您最终将截断其中一个。这里有一个更普遍的解决方案

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

在您提到的具体案例中,迭代器是
count(15,15)
。在一般情况下,迭代器上需要更强的条件。它们都是单调的吗?他们的结果是否足够小,可以分成几组?等等。你认为交叉口会有多稀疏?我想不出一个好的通用方法来实现这一点。那么你希望工会如何实现呢
chain(count(3,3),count(5,5))
做你想做的事,但在你看到5从中出来之前,这将是一个嬉皮的一两分钟。当然,按升序排列。@alphomega是保证按升序排列的两个输入迭代器吗?是的。我专门处理count(3,3)和count(5,5)。在您提到的具体案例中,迭代器是
count(15,15)
。在一般情况下,迭代器上需要更强的条件。它们都是单调的吗?他们的结果是否足够小,可以分成几组?等等。你认为交叉口会有多稀疏?我想不出一个好的通用方法来实现这一点。那么你希望工会如何实现呢
chain(count(3,3),count(5,5))
做你想做的事,但在你看到5从中出来之前,这将是一个嬉皮的一两分钟。当然,按升序排列。@alphomega是保证按升序排列的两个输入迭代器吗?是的。我专门处理count(3,3)和count(5,5)。当两个输入迭代器在同一个迭代中生成一个元素时,这将起作用。对不起。我在看两组的交集,这比较难。问题变了!通过这种方式,工会是绝对可以实现的+1wrt第一种技术,您如何确保没有重复?(例如,15会出现几次。)当两个输入迭代器在同一次迭代中生成一个元素时,这将起作用。对不起。我在看两组的交集,这比较难。问题变了!通过这种方式,工会是绝对可以实现的+1wrt第一种技术,您如何确保没有重复?(例如,15会出现几次。)