늒네 기록

[python] zip() 함수에 대하여 본문

언어 공부 기록/python

[python] zip() 함수에 대하여

jaeha lee 2020. 10. 9. 20:42

서로 다른 두 리스트로 작업을 하다가, 둘을 같은 순서에 있는 아이템끼리 묶어서 쓸 일이 있을때 사용하는 것이 바로 zip() 함수다. 예를 들어, 아래와 같은 상황이 주어져있다고 하자.

1
2
3
4
5
6
7
8
9
= [123]
= ['a''b''c']
= ['foo''bar''baz']
 
= []
for i in range(len(a)):
    x.append((a[i], b[i], c[i]))
 
# x = [(1, 'a', 'foo'), (2, 'b', 'bar'), (3, 'c', 'baz')]
cs

이때, 6번째 줄의 for문을 돌면서 x에 a, b, c에 들어있는 아이템을 순서대로 묶어서 넣어주었는데, 이 작업을 편하게 해주는 것이 바로 zip()함수이다.

1
2
3
4
5
6
7
8
= [123]
= ['a''b''c']
= ['foo''bar''baz']
 
= zip(a, b, c)
 
print(y) # <zip object at 0x00D47E88>
print(list(y)) # [(1, 'a', 'foo'), (2, 'b', 'bar'), (3, 'c', 'baz')]
cs

zip 함수에는 iterable한 오브젝트를 여럿 넣어주면 각 오브젝트에서 아이템을 꺼내서 순서대로 묶어준다. 예를 들어서, 이런 것도 가능하다.

1
2
3
4
= [range(0,i*5,i) for i in range(1,5)]
 
print(l) # [range(0, 5), range(0, 10, 2), range(0, 15, 3), range(0, 20, 4)] 
print(list(zip(*l))) # [(0, 0, 0, 0), (1, 2, 3, 4), (2, 4, 6, 8), (3, 6, 9, 12), (4, 8, 12, 16)]
cs

여기서 l이라는 리스트에 iterable한 객체가 여럿 들어있는데, 이 객체들을 한 번에 zip에 전달하기 위해서 *l로 l의 내용물만 전달한 것을 볼 수 있다.

 

그렇다면, 만약 zip에 전달한 객체들이 들고 있는 아이템 개수가 서로 다르면 어떻게 될까?

1
2
3
4
5
6
7
8
= [1234]
= ['a''b''c''d''e']
= ['foo''bar''baz']
 
= zip(a, b, c)
 
print(y) # <zip object at 0x00D47E88>
print(list(y)) # [(1, 'a', 'foo'), (2, 'b', 'bar'), (3, 'c', 'baz')]
cs

위의 예시를 보면, a, b, c중 더 적은 아이템을 들고 있는 객체에 맞춰 zip을 해주는 것을 확인할 수 있다.

반응형
Comments