編集:イテレータのリセットを扱うsimilar question hereがあります。以下の回答は、ネストされたイテレーターの実際の問題に対処しています。ネストされたイテレーターはリセットされないため、見逃しやすい問題を処理します。Python - イテレータを2回繰り返します。
イテレータをPythonで2回反復する方法はありますか?
次のコード例では、2番目の反復が最初のものと同じオブジェクトで動作していることが分かり、結果が変わっています。これを下のC#と比較すると、後の結果が得られます。
私がしたいことをする方法はありますか?私は、イテレータのコピーを作成するか、それが元の関数を "取得"できるかどうか疑問に思っていましたが、もっと簡単な方法があります。 (私はちょうどMyIter()
を下記のおもちゃの例で2回呼び出すことができると知っていますが、イテレータがどこから来たのかわからないと役に立たなくなります。
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());
}
与える:
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
コントラストを与える
1-1
1-2
1-3
1-4
2-1
2-2
. . .
Pythonでイテレータを無制限に反復処理できます。しかし、ジェネレータ(あなたが与えられたコードの外観である)を参照しているのであれば、ジェネレータそのものを何回も実行する方法はありません。ただし、ジェネレータの結果をメモリに保存し、その結果を反復することができます。あなたが与えた例では、 'PrintCombos(list(MyIter()))' –
['itertools.tee'](https://docs.python.org/3/library/itertools.html #itertools.tee)があなたが探しているものかもしれません。 – Matthias
[反復子はPythonでリセットできますか?](http://stackoverflow.com/questions/3266180/can-iterators-be-reset-in-python) –