본문 바로가기
Python/기본문법

zip() (파이썬 함수)

by yororing 2024. 9. 30.

00 개요

  • iterable 객체를 다루는 파이썬 내장 함수에 대한 정리

01 .zip() 란

1. 정의

  • zip() 함수는 입력된 여러 개의 iterable을 동시에 순회하며, 각 iterable의 동일한 인덱스 위치에 있는 요소들을 하나의 튜플로 묶어 반환하는 함수
  • 인자로 입력된 iterables들의 길이가 다를 경우, 가장 짧은 iterable을 기준으로 동작하며 남은 요소들은 무시됨 

2. 문법

zip(*iterables)
  • 인자
    • iterables: 반복 가능한 객체들(list, tuple, str, etc.). 2개 이상의 iterable을 인자로 받음 
  • 반환값
    • 각 iterable의 요소를 묶은 tuple들의 iterator

3. 예시

1) 기본 사용 예시

  • numbers 리스트와 letters 리스트가 각각의 인덱스에 맞춰 튜플로 묶임 
# 2개의 list를 zip으로 묶기
numbers = [1, 2, 3]
letters = ['a', 'b', 'c']

zipped = zip(numbers, letters)
print(list(zipped))    # [(1, 'a'), (2, 'b'), (3, 'c')]
import string
letters = string.ascii_uppercase + string.ascii_lowercase
numbers = range(1, len(letters) + 1)

zipped = zip(numbers, letters)
print(zipped)               # <zip object at 0x000001D30D7A9500>
print(list(zipped))         # [(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E'), (6, 'F'), (7, 'G'), (8, 'H'), (9, 'I'), (10, 'J'), (11, 'K'), (12, 'L'), (13, 'M'), (14, 'N'), (15, 'O'), (16, 'P'), (17, 'Q'), (18, 'R'), (19, 'S'), (20, 'T'), (21, 'U'), (22, 'V'), (23, 'W'), (24, 'X'), (25, 'Y'), (26, 'Z'), (27, 'a'), (28, 'b'), (29, 'c'), (30, 'd'), (31, 'e'), (32, 'f'), (33, 'g'), (34, 'h'), (35, 'i'), (36, 'j'), (37, 'k'), (38, 'l'), (39, 'm'), (40, 'n'), (41, 'o'), (42, 'p'), (43, 'q'), (44, 'r'), (45, 's'), (46, 't'), (47, 'u'), (48, 'v'), (49, 'w'), (50, 'x'), (51, 'y'), (52, 'z')]

2) 여러 iterable을 zip으로 묶기

  • 세 개의 iterable도 동일하게 인덱스에 맞춰 튜플로 묶임 
# 3개의 리스트를 zip으로 묶기
numbers = [1, 2, 3]
letters = ['a', 'b', 'c']
symbols = ['$', '%', '&']

zipped = zip(numbers, letters, symbols)
print(list(zipped))     # [(1, 'a', '$'), (2, 'b', '%'), (3, 'c', '&')]

3) 다른 길이의 iterable을 zip으로 묶기

  • 길이가 다를 경우, 가장 짧은 iterable을 기준으로 동작하며, 남은 요소들은 무시됨 
zipped = zip([1, 2, 3], 'abcde')
for a in zipped:
    print(a)
    print(zipped)
    
# 출력값
# (1, 'a')
# <zip object at 0x000001D30D808500>
# (2, 'b')
# <zip object at 0x000001D30D808500>
# (3, 'c')
# <zip object at 0x000001D30D808500>

4. 사용 사례

1) 두 리스트를 동시에 순회하기

  • 2개 이상의 리스트를 동시에 순회할 때 zip() 사용 가능
names = ['Pearl', 'Jake', 'Elisa']
fav_colors = ['green', 'purple', 'red']

for name, color in zip(names, fav_colors):
    print(f'{name}\'s favorite color is {color}.')
    
# 출력
# Pearl's favorite color is green.
# Jake's favorite color is purple.
# Elisa's favorite color is red.

2) 딕셔너리 생성하기

  • 리스트 또는 튜플을 활용해 딕셔너리 생성 가능
data = ['Pearl', 20, 'blue']
category = ['name', 'age', 'color']

info = dict(zip(category, data))
print(info)    # {'name': 'Pearl', 'age': 20, 'color': 'blue'}

3) 두 리스트의 요소 교환하기

  • 리스트의 요소를 서로 교환하는 작업에도 zip()을 사용 가능
list1 = [1, 2, 3]
list2 = [4, 5, 6]

# 두 리스트의 요소를 서로 교환
list1, list2 = list(zip(list2, list1))

print(list1)  # [4, 5, 6]
print(list2)  # [1, 2, 3]

4) 언집 (zip 반대 과정) 하기

  • zip()을 사용해 묶인 요소를 다시 풀어낼 때 * 연산자 사용
zipped = [(1, 'a'), (2, 'b'), (3, 'c')]

numbers, letters = zip(*zipped)
print(numbers)  # (1, 2, 3)
print(letters)  # ('a', 'b', 'c')

 

결론

  • zip() 함수는 여러 iterable을 동시에 처리할 때 매우 유용한 도구
  • 리스트, 튜플, 문자열 등 다양한 데이터 타입에서 활용 가능
  • 특히 데이터를 병렬로 처리하거나 여러 iterable을 묶을 때 유용
  • zip()을 사용하면 코드의 가독성을 높이고, 반복 작업을 간편하게 처리 가능 
  • zip() 함수의 활용 범위는 매우 넓으며, 다양한 문제 해결에 적용 가능
  • 파이썬을 다루는 개발자라면 이 함수의 사용법을 확실히 이해하고 활용하는 것이 매우 유용할 것