2012-11-25 3 views
1

반복기의 여러 인덱스 위치에서 여러 임의의 값을 가져 오는 방법은 무엇입니까?Python의 생성기에서 여러 개의 개별 값 가져 오기

How to get the n next values of a generator in a list (python)Get the nth item of a generator in Python 반복자에서 임의의 요소 또는 연속적인 서브 세트를 복용 itertools.islice의 사용을 설명한다. 하지만 반복자의 다른 위치에서 여러 개의 임의의 요소를 원한다면 어디에서 islice의 단계 인수를 사용할 수 없습니까?

저는 프로젝트 오일러의 problem 40을 해결하려고합니다. 지금 내가 인덱스 1, 10, 100, 1000, 10000, 100000과 요소를 얻으려면

iteration = (i for i in ''.join(map(str, (i for i in xrange(1,10**6))))) 

와 연결된 정수의 문자열을 생성, 내가 여기 islice를 사용하지 수 1에서 1000000 계산 때문에 next을 호출 할 때마다 현재 값이 오른쪽으로 이동합니다. 예를 들어

next(islice(iteration, 1, 2)) + next(islice(iteration, 3, 4)) 

은 '24'대신 '26'을 생성합니다.

업데이트 (25.11.12, 세계 협정시 04시 43분 + 0) : 모든 제안

감사합니다.

it = (i for i in ''.join(map(str, (i for i in xrange(1,10**6))))) 
ds = [int(nth(it, 10**i-10**(i-1)-1)) for i in range(7)] 
return product(ds) 

nth의 추한 인수가 0, 8, 89, 899, 8999 등

+1

현재 코드의 한 가지 문제점은 느리게 숫자를 생성하지 않는다는 것입니다 (예를 들어 '10 ** 6'을 '10 ** 7'로 변경). - '' '.join'은 통과했다. – DSM

답변

1
the "recipes" section of the itertools documentation

이것은 내지들의 시퀀스를 생성하는 것이다 : 현재 코드처럼 내 보인다. 그것은가는로 소비 iterablen 번째 요소를 반환 :

def nth(iterable, n, default=None): 
    "Returns the nth item or a default value" 
    return next(islice(iterable, n, None), default) 

당신이 얻을 수있는 1 일, 10 일 제로 인덱스 (반복자 소비 및됩니다 것을주의 순차적으로 호출하여 100 등의 요소가됩니다) :

first = nth(iteration, 0) 
tenth = nth(iteration, 8) # since we've already taken one 
hundredth = nth(iteration, 89) # since we've already taken ten 
# etc 

다른 방법으로, tee를 사용하고 다른 반복자 각 시간 nth을 사용할 수 있습니다. 이 방법을 사용하면 단일 반복기가 소비된다는 사실을 염려 할 필요가 없습니다. 반면에 반복자가 매우 길면 메모리를 삼킬 수도 있습니다.

1

뿐만 아니라 같은 nth보고 언급 - 나는 당신의 발전기를 단순화 보일 것이다

from itertools import count 

def concat(): 
    for i in count(1): 
     for j in str(i): 
      yield int(j) 
4

(. 오일러 번호 (40)를 해결하기 위해 훨씬 더 빠른 방법이 있습니다)

내가 일하는 것이 조금 다르게. 대신 nth를 사용 :

>>> from itertools import chain, count, islice 
>>> 
>>> it = chain.from_iterable(str(i) for i in count(1)) 
>>> wanted = {10**i for i in range(7)} 
>>> scan_region = islice(it, max(wanted)+1) 
>>> digits = [int(x) for i, x in enumerate(scan_region, 1) if i in wanted] 
>>> digits 
[1, 1, 5, 3, 7, 2, 1] 

이 방법 나는 올바른 인덱스가 있는지 확인하기 위해 어떤 뺄셈을 할 필요가 없습니다.

관련 문제