如何合并多个迭代器以获得一个随机迭代它们的新迭代器?

How to merge multiple iterators to get a new iterator which will iterate over them randomly?

假设我有一个迭代器列表:

iterators = [ iter([2, 3, 4]), iter([7, 9]), iter([-1, -2, -3, -4]) ]

我如何使用上述迭代器创建一个新的迭代器,以便在每个步骤中随机 select 列表中存在的迭代器之一(尚未完成)并从中输出下一个元素那?它应该继续输出元素,直到所有迭代器都完成。

因此,例如,如果新的迭代器是 it_combined,我在尝试对其进行迭代时可能会得到以下输出

>>> for it in it_combined:
...     print(it, end=" ")
...
2 7 3 -1 4 -2 -3 -4 9

这符合您的需求吗?

Select 一个随机迭代器并打印其中一个值。一旦该迭代器抛出异常,将其从列表中删除。继续,直到所有迭代器都消失。

import random
iterators = [ iter([2, 3, 4]), iter([7, 9]), iter([-1, -2, -3, -4]) ]

while len(iterators) > 0:
    which = random.randint(0, len(iterators)-1)
    it = iterators[which]
    try:
        print(next(it))
    except Exception:
        del iterators[which]

您可以使用 random.choice 从列表中随机 select 一个迭代器。然后,您必须确保在用完后从列表中删除该迭代器。

您可以使用 generator 来实现迭代器的合并/采样:

import random

random.seed(42)


def combine_iterators(iterators):
    while iterators:
        it = random.choice(iterators)
        try:
            yield next(it)
        except StopIteration:
            iterators.remove(it)


merged_iterator = combine_iterators(
    [iter([2, 3, 4]), iter([7, 9]), iter([-1, -2, -3, -4])]
)
for x in merged_iterator:
    print(x, end=" ")

输出:

-1 2 3 -2 7 4 9 -3 -4