Python——迭代一个迭代器两次

标签 python for-loop iterator generator yield

<分区>

编辑:有一个 similar question here处理迭代器重置。然而,下面接受的答案解决了嵌套迭代器的实际问题,并处理了一个容易遗漏的问题,即嵌套迭代器不会重置。

有什么方法可以在 python 中对迭代器进行两次迭代?

在下面的示例代码中,我可以看到第二次迭代对与第一次相同的对象进行操作,因此产生了一个奇怪的结果。将此与下面的 C# 进行对比,它会产生我想要的结果。

有没有办法做我想做的事。我想知道我是否可以制作迭代器的副本或“检索”它来自的函数,但也许有更简单的方法。 (我知道我可以在下面的玩具示例中调用 MyIter() 两次,但如果我不知道迭代器来自何处并且不是我所追求的,那将毫无用处!)。

def MyIter():
  yield 1;
  yield 2;
  yield 3;
  yield 4;

def PrintCombos(x):
  for a in x:
      for b in x:
          print(a,"-",b);

PrintCombos(MyIter());

给予

1 - 2
1 - 3
1 - 4

对比:

static IEnumerable MyIter()
{
    yield return 1;
    yield return 2;
    yield return 3;
    yield return 4;
}

static void PrintCombos(IEnumerable x)
{
    foreach (var a in x)
        foreach (var b in x)
            Console.WriteLine(a + "-" + b);
}

public static void Main(String[] args)
{
    PrintCombos(MyIter());
}

给出:

1-1
1-2
1-3
1-4
2-1
2-2
. . .

最佳答案

您可以使用 itertools.tee 创建生成器的多个副本

from itertools import tee

def MyIter():
    yield 1
    yield 2
    yield 3
    yield 4

def PrintCombos(x):
    it1, it2 = tee(x, 2)
    for a in it1:
        it2, it3 = tee(it2, 2)
        for b in it3:
        print("{0}-{1}".format(a, b))

PrintCombos(MyIter())

关于Python——迭代一个迭代器两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40935272/

相关文章:

c++ - 设置因 move 语义而无效的迭代器

python - 你如何查看一个 numpy 广播对象?

python - 使用 python 检索 selenium 中更新的 url

python - 我可以使用 Google App Engine 做什么?

python - 如何制作具有两个单独循环的嵌套 for 循环?

string - 对于每个控制变量必须是变量或对象

python - 将 C 字符串公开给 NumPy 的最快方法?

javascript - JS中数字原型(prototype)的自定义迭代器

c++ - ostream_iterator increment应该在什么情况下使用?

javascript - 如何在 for 循环中重用 ES6 javascript 中的生成器?