[Python]zip() 란?
카테고리: py
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')]
```
댓글 남기기