2012-06-12 4 views
5

list 및 islice 객체는 모두 반복 가능하지만 결과에서이 차이가 발생합니다. 여기itertools 라이브러리의 tee 함수

r = [1, 2, 3, 4]    
i1, i2 = tee(r) 
print [e for e in r if e < 3] 
print [e for e in i2] 
#[1, 2] 
#[1, 2, 3, 4] 


r = islice(count(), 1, 5)   
i1, i2 = tee(r) 
print [e for e in r if e < 3] 
print [e for e in i2] 
#[1, 2] 
#[] 

답변

14

문제는 tee() 요구, 원래 반복자의 값을 소비 원래 반복자에서 그들을 소모 시작하면, 제대로 작동 할 수 없을 것입니다. 목록 예제에서 반복은 단순히 다시 시작됩니다. 생성기 예제에서는 소모되어 더 이상의 값이 생성되지 않습니다.

잘 설명되어 있습니다

티 일단

는() 분할, 반복 가능한 다른 곳에서는 사용하지 않아야 원본을했다; 그렇지 않으면 tee 객체에 대한 정보없이 iterable이 향상 될 수 있습니다.

Source

편집 목록과 발전기 사이의 차이 점을 설명하기 : 당신의 지능형리스트에서

>>> from itertools import islice, count 
>>> a = list(range(5)) 
>>> b = islice(count(), 0, 5) 
>>> a 
[0, 1, 2, 3, 4] 
>>> b 
<itertools.islice object at 0x7fabc95d0fc8> 
>>> for item in a: 
...  print(item) 
... 
0 
1 
2 
3 
4 
>>> for item in a: 
...  print(item) 
... 
0 
1 
2 
3 
4 
>>> for item in b: 
...  print(item) 
... 
0 
1 
2 
3 
4 
>>> for item in b: 
...  print(item) 
... 
>>> 
+0

목록 개체와 islice 개체는 비슷하게 동작해야합니다. 맞습니까? – John

+1

@ 존 아니요, 목록을 반복 할 때마다 매번 새로운 반복기가 생깁니다. 이는 여전히 값을 얻음을 의미합니다. 'islice()'를 사용하면 생성기를 얻을 수 있습니다. 생성기는 값을 한 번 생성 한 다음 고갈됩니다. 스스로 시도해보십시오. 목록을 두 번 반복 한 다음 islice를 가져 와서 두 번 반복하십시오. 동작의 차이점을 메모하십시오. –

+0

@ 존 두 예제가 비슷하게 동작하게하려면'r = [1,2,3,4]'보다는'r = iter ([1,2,3,4])'를 사용하십시오. – clacke

0

을, 당신은 i1r를 교체합니다.

관련 문제