編輯:有一個similar question here處理迭代器重置。下面的接受答案解決了嵌套迭代器的實際問題,並且處理了一個容易遺漏的問題,因此嵌套迭代器不會重置。Python - 重複迭代器兩次
有沒有什麼辦法在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
. . .
你可以在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) –