[Python]zip() 란?

Date:     Updated:

카테고리:

zip()함수

zip()은 옷의 지퍼(ziper)처럼 두 그룹의 데이터를 서로 묶어주는 파이썬의 내장 함수이다. 여려 개의 순회 가능한(iterable) 객체를 인자로 받아 각 객체아 담고 있는 원소를 튜플의 형태로 차례로 접근 할 수 있는 반복자(iterator)를 반환한다.

numb = [1,2,3] # list형식, iterable하다.
strs = ["A", "B", "C"] # 원소들이 string인 것을 제외하면 역시 list이므로 iterable하다.

for pair in zip(numb, strs):
    print(pair)
(1, 'A')
(2, 'B')
(3, 'C')

zip() 함수를 이용한 병렬처리

zip() 함수를 이용해 여러 그룹의 데이터들을 루프를 한 번만 돌면서 처리할 수 있다. 가변 인자를 받기 때문에 2개 이상의 인자를 넘겨서 병렬 처리를 할 수 있다. 예를 들어, 아래 코드는 3개의 문자열 내의 글자를 하나씩 병렬로 출력한다.

for number, upper, lower in zip("12345", "ABCDE", "abcde"):
    print(number, upper, lower)
# 이렇게 할 경우, number가 일종의 [1,2,3,4,5]가되고, upper = ["A", "B", "C", "D", "E"], lower = ["a", "b", "c", "d", "e"]와 마찬가지이다.
1 A a
2 B b
3 C c
4 D d
5 E e

튜플의 원소를 3개의 변수로 할당하기 위해서 for문에서 인자풀기(unpacking)을 해주었다.

그럼 반대로 3개의 인자를 받아 하나로 묶어볼 수도 있다.

number = [1,2,3,4,5]
upper = ["A", "B", "C", "D", "E"] 
lower = ["a", "b", "c", "d", "e"]

for pairs in zip(number, upper, lower):
    print(pairs)
(1, 'A', 'a')
(2, 'B', 'b')
(3, 'C', 'c')
(4, 'D', 'd')
(5, 'E', 'e')

unzip 데이터 분리

zip()함수를 이용해 엮은 데이터를 다시 해체(unzip)하고 싶을 때도 zip() 함수를 사용할 수 있다.

numb = [1,2,3] # list형식, iterable하다.
strs = ["A", "B", "C"] # 원소들이 string인 것을 제외하면 역시 list이므로 iterable하다.
pairs = list(zip(numb, strs))
print(pairs)
[(1, 'A'), (2, 'B'), (3, 'C')]

이렇게 만들어진 pairs리스트 앞에 unpacking 연산자를 붙여서 다시 zip() 함수에 넘기면 다시 원래의 2개의 튜플을 얻을 수 있다.

numb, strs = zip(*pairs)
print(numb)
print(strs)
(1,2,3)
("A","B","C")

사전 변환

zip()함수를 이용하면 두 개의 리스트나 튜플 부터 쉽게 사전(dictionary)를 만들 수 있다. Key를 담고 있는 리스트와 Value를 담고 있는 리스트를 zip() 함수에 넘긴 후, 그 결과를 다시 dict()함수에 넘기면 된다.

keys = [1,2,3]
values = ["A","B","C"]
dictionary = dict(zip(keys,values))
print(dictionary)
{1: 'A', 2: 'B', 3: 'C'}

또 다른 예로 날짜 데이터의 리스트를 변환하면 다음과 같다.

date = dict(zip(["year", "month", "date"], [2001, 1, 31]))
print(date)
{'year': 2001, 'month': 1, 'date': 31}

주의 사항

zip() 함수로 넘기는 인자의 길이가 다를 때는 주의를 해야한다. 왜냐하면 가장 짧은 인자를 기준으로 데이터가 엮이고, 나머지는 버려지기 때문이다.

numbers = ["1", "2", "3"]
letters = ["A"]
print(list(zip(numbers, letters))
[('1', 'A')]

```

py 카테고리 내 다른 글 보러가기

댓글 남기기