2014-11-24 2 views
2

관련 게시물을 보았지만이 질문은 아닙니다. 루프에서 next()를 호출하지 않고 외부 루프에서 반복자를 빨리 감을 방법을 찾고있다.Dropwhile를 사용하여 중첩 루프에서 xrange를 빨리 감기 하시겠습니까?

대답은 단순히 내부 루프에서 동일한 반복기를 사용하는 것이지만 itertools와 좋은 방법이있을 것이라고 생각했지만 dropwhile()를 사용하지만 예상 한대로하지 않습니다.

cl = ['a', 'b', 'c', 'd', 'e'] 
rangeiter = xrange(0, len(cl)) 
for x in rangeiter: 
    print('{}-'.format(x)), 
    for y in xrange(x, len(cl)): 
     print('{}'.format(cl[y])), 
     if y == 3: 
      print 
      break 
    # fast forward parent range 
    rangeiter = dropwhile(lambda v: v < y, rangeiter) 

내가 외부 루프는 내부 ​​루프가 처리 한 모든 인덱스 건너 뛰고 싶은 :

그래서 루프 내부 루프를 갖는다. 나는 dropwhile이 작업을 수행 한 것이라고 생각하지만, 대신에 나는 점점 오전 :

0- a b c d 
1- b c d 
2- c d 
3- d 
4- e 

내가

0- a b c d 
4- e 

The code is here

를 원하는 경우.

감사합니다.

+0

'xrange'는 반복자가 아닙니다. * sequence * (iterable 일 뿐이다)이다. 'for' 루프는 iter (iterable)로 iterator를 생성합니다. 알았어. –

+0

. 나는 xrange 에뮬레이션을하고 iterator를 it 's라고 가정했다. (나는 실제로 generator를 원했다.) 내부 카운터를 향상시킬 수있는 방법이 있습니까? – Colin

+0

'람다 : v

답변

2

for 루프는 iterables에 대한 반복기를 만듭니다. xrange()시퀀스 (반복 가능)이며 반복자는 아닙니다.

dropwhile()를 사용하여 해당 전진 한 후, 명시 적으로 반복자를 생성 요소를 건너 (해당 객체 반복!) : 나는 y하지 x에 따라 사전에 귀하의 dropwhile 조건을 조정 dropwhile 것을

cl = ['a', 'b', 'c', 'd', 'e'] 
rangeiter = iter(xrange(0, len(cl))) 
for x in rangeiter: 
    print('{}-'.format(x)), 
    for y in xrange(x, len(cl)): 
     print('{}'.format(cl[y])), 
     if y == 3: 
      print 
      break 
    # fast forward parent range 
    next(dropwhile(lambda v: v < y, rangeiter), None) 

참고; 예상되는 출력은 바깥 쪽 범위를 안쪽 루프가 도달 한 곳 너머로 넘길 것을 제안합니다.

+0

모든 항목을 건너 뛰려면 StopIteration 예외를 throw 할 수도 있습니다. –

+1

@LeeDanielCrocker : 예외가 * catch 된 것으로 예상되는 경우 * 아닙니다. 'for' 문은 루핑되는 iterator에 의해 발생 된'StopIteration'만을 찾으며, 루프 본문에서 같은 예외가 발생하는 것을 보지 않습니다. –