2017-10-14 2 views
1

다음 질문에 대한 Jean의 대답에 따라 Python converting strings in a list to numbers에 최소한의 코드를 실행하면 StopIteration 예외가 발생합니다.생성기 및 목록을 사용하여 Python StopIteration

primesz2은 비어 있습니다.

인터넷 검색에서 추적 할 때 회선 주위에 루프가 필요할 수 있다고 생각하지만 해결 방법을 모르겠습니까?

역 추적 : CSV 파일에서

File "factorise_v32.py", line 118, in factorise 
    primes=[next(z2) for _ in xrange(b)] 
StopIteration 

샘플 데이터 :

("2","3","5","7","11") 

최소 코드 :

import csv 

def factorise(N) 
    .... 
    z1=(int(x) for row in csv.reader(csvfile) for x in row) 
    .... 
    b=4 #b can be any positive integer 
    z2=(int(x) for row in csv.reader(csvfile) for x in row) 
    primes=[next(z2) for _ in xrange(b)] 
+1

'next()'는'z2'가 없어지기 때문에 예외를 발생시킵니다. 'z2'에는'b' 요소가 없습니다. –

+0

@MartijnPieters 'StopIteration'은 이해를 종료하기 위해 처리되지 않겠습니까? – schwobaseggl

+1

'z2'를 반복 * 왜 *하지 않습니까? 리스트 이해력으로 만들거나 제한된 수의 요소를 얻으려면'slice()'를 사용하십시오. –

답변

2

목록의 이해가 발전기가 아닌 나 자신을 반복자. 표현 측에서 StopIteration 예외가 발생하면 중지되지 않습니다. 반복 가능은 반복이 완료된 for 루프와 통신하기 위해 StopIteration을 사용할 수 있지만 나머지 구성은 확장되지 않습니다.

당신이 반복자의 요소의 가장b 번호로 를 얻을 필요가있는 경우, itertools.islice() 사용

primes = list(islice(z2, b)) 

그것은 충분하지 않은 경우 이상 반복 할 때 b 요소를 차지 이하의 것 z2의 요소

당신이 패드 밖으로next() 디폴트 값을 제공함으로써보다 적은 b 요소가 있었다 경우 0 값으로 결과에 시도에 링크 된 게시물의 이전 버전. 나는 이것을 달성하기 위해 itertools.repeat()itertools.chain()을 사용한 것 : z2이 소진 후

primes = list(islice(chain(z2, repeat(0)), b)) 

chain(z2, repeat(0)) 부분은 끝없이 0 값을 추가합니다. islice()은 해당 시퀀스에서 요소를 b 가져옵니다.

데모 :

>>> from itertools import chain, repeat, islice 
>>> z2 = iter([1, 2, 3]) 
>>> list(islice(z2, 5)) # up to 5 
[1, 2, 3] 
>>> z2 = iter([1, 2, 3]) # pad with zeros 
>>> list(islice(chain(z2, repeat(0)), 5)) 
[1, 2, 3, 0, 0] 

주를 CSV가 없습니다 먼저 파일 객체를 되감기하지 않고, 행에 두 번 파일에서 당신이 읽을 수 없습니다. 코드가 두 위치에서 csv.reader(csvfile)을 사용하지만 csvfile 파일 개체가 처음으로 돌아 가지 않습니다. 다시 읽으려고 시도하기 전에 csvfile.seek(0)을 추가하십시오.

+0

@ Jean-FrançoisFabre : 문구가 조정되었습니다. –

+0

언제나처럼 완벽 함 : 최근에 "나는 삐봇"이 아니 었습니까? –

+1

@Jean ssssh! 그가 실제로 알아 내면 프로그래밍이 중단 될 수 있습니다! : p –

관련 문제