2016-12-02 6 views
3

편집 : 반복자 재설정을 다루는 similar question here이 있습니다. 그러나 아래의 대답은 중첩 된 반복자의 실제 문제를 해결하고 누락 된 이슈를 처리하여 중첩 된 반복자가 재설정되지 않도록합니다.Python - 반복자 반복하기

반복자를 통해 파이썬에서 두 번 반복하는 방법이 있습니까?

아래의 예제 코드에서 나는 두 번째 반복이 첫 번째 것과 동일한 개체에서 작동한다는 것을 알 수 있습니다. 따라서 이상한 결과가 나타납니다. 이것을 아래의 C#과 비교해 보면 내가 결과를 얻게됩니다.

내가 원하는 것을 할 수있는 방법이 있습니까? iterator의 사본을 만들 수 있는지 또는 그것이 가져온 함수를 "검색"할 수 있는지 궁금 해서요.하지만 아마도 간단한 방법이있을 것입니다. (저는 아래의 장난감 예제에서 MyIter()을 두 번 호출 할 수 있음을 알고 있습니다.하지만 iterator가 어디에서 왔는지 모를 경우 쓸모가 없습니다.).

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 
. . . 
+2

파이썬에서 반복자를 무제한 반복 할 수 있습니다. 그러나 만약 당신이 발전기 (당신이 주어진 코드의 외형에 의거 함)를 참조한다면 발전기 자체에 대해 여러 번 그렇게 할 방법이 없다. 그러나 생성기 결과를 메모리에 저장하고이를 반복 할 수 있습니다. 당신이 제공 한 예제에서'PrintCombos (list (MyIter()))' –

+0

['itertools.tee'] (https://docs.python.org/3/library/itertools.html)을 호출하면됩니다. # itertools.tee)가 당신이 찾고있는 것일 수도 있습니다. – Matthias

+0

[반복자를 파이썬으로 리셋 할 수 있습니까?] (http://stackoverflow.com/questions/3266180/can-iterators-be-reset-in-python) –

답변

1

당신은 발전기

의 여러 사본을 만들 수 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()) 
-1

이 유형의 문제에 대한 목록 이해를 사용하면 원하는 결과를 얻는 데 가장 효과적입니다.

x = [1,2,3,4] 
y = [1,2,3,4] 

spam = [[s,t] for s in x for t in y] 

for x in spam: 
    print('%s - %s' %(x[0], x[1])) 

출력 :

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

itertools.tee 번의 반복 가능한 독립적 반복자를 생성한다. 그러나 새로운 iterables가 생성되면 원래 iterable을 더 이상 사용하지 않아야합니다.

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

def PrintCombos(x): 
    xx = [] 
    xx.append(itertools.tee(x)) 
    n = 0 
    for a in xx[0][0]: 
     xx.append(itertools.tee(xx[n][1])) 
     for b in xx[n+1][0]: 
      print('%s - %s' % (a,b)); 
     n += 1 

PrintCombos(MyIter());