2014-03-25 3 views
0
def zip(*iterables): 
    # zip('ABCD', 'xy') --> Ax By 
    sentinel = object() 
    iterators = [iter(it) for it in iterables] 
    while iterators: 
     result = [] 
     for it in iterators: 
      elem = next(it, sentinel) 
      if elem is sentinel: 
       return 
      result.append(elem) 
      print(elem) 
     yield tuple(result) 

사용 :파이썬 - 이해 우편

list(zip('abc','def')) 

출력 :

a 
d 
b 
e 
c 
f 
[('a', 'd'), ('b', 'e'), ('c', 'f')] 

질문 : 이유는 무엇입니까 'D' 'A'가 아닌 'B'후 전달받을 ?

+0

는 모든 각각의 i 번째 엘리먼트에 전달 반복 가능한 병합. – M4rtini

+3

요소, 첫 번째 요소, 두 번째 요소 등을 서로 짝 지어줍니다. 왜 ''가 ''b ''에 추가됩니까? –

+0

[지퍼 그림] (http://en.wikipedia.org/wiki/Zipper) – jfs

답변

0

다음 사용은 'abc''def' 내에서 액세스되는 값을 제한합니다.

iterators=[iter('abc'),iter('def')] 
for it in iterators: 
    print(next(it)) 
    print(next(it)) 
    print(next(it)) 

출력 :

B

C

D

예를

F

이제 for 루프에서 next를 한 번만 사용하면 각 시퀀스에서 하나의 요소 만 가져옵니다. 이 요소는 반복기에서 모두 소모됩니다. 첫 번째 요소가 고갈되었으므로 이제는 각 시퀀스의 두 번째 요소에 동일한 방식으로 액세스 할 수 있습니다.

iterators=[iter('abc'),iter('def')] 
for x in range(1,4): 
    print('Next will access element :' +str(x)) 

    for it in iterators: 
     print(next(it)) 

    print('Element %s has been exhausted\n' %(str(x))) 

출력

Next will access element :1 

a 

d 

Element 1 has been exhausted 


Next will access element :2 

b 

e 

Element 2 has been exhausted 


Next will access element :3 

c 

f 

Element 3 has been exhausted