Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python zip() 함수 완벽 가이드: 기본 문법부터 압축 해제까지

Python의 zip() 함수는 여러 개의 반복 가능한(iterable) 객체를 받아 하나로 묶어주는 내장 함수입니다. 결과값은 각 iterable의 요소들이 쌍(pair) 형태로 저장된 zip 객체이며, 리스트, 튜플, 세트, 딕셔너리 등 다양한 자료형을 인자로 전달할 수 있습니다.


Python 반복(Iteration) 개념 복습

Python에서 '반복(iterate)'한다는 것은 프로그램이 리스트 등의 자료를 순서대로 하나씩 처리하는 과정을 의미합니다. 예를 들어, 회사가 운영하는 모든 지점의 이름을 출력하는 for 루프가 있다면, 우리는 이 프로그램이 이름 목록을 '반복 처리'하고 있다고 말할 수 있습니다.

반면 iterable(반복 가능 객체)은 자신이 가진 요소들을 하나씩 개별적으로 반환할 수 있는 객체를 뜻합니다. 배열은 for 루프를 통해 각 항목을 하나씩 출력할 수 있기 때문에 대표적인 iterable입니다.

Python zip() 함수란?

zip() 함수는 두 개 이상의 iterable의 내용을 결합하는 역할을 합니다. zip()은 튜플들로 구성된 iterator인 zip 객체를 반환하며, 인자로 전달된 모든 값이 쌍으로 저장됩니다.

Python의 zip() 함수는 리스트, 튜플, 세트, 딕셔너리와 같은 iterable을 인자로 받습니다. 그리고 전달된 각 iterable에서 가져온 요소들을 담은 튜플 목록을 생성합니다.

zip() 함수의 기본 구문은 다음과 같습니다.

zip(iterable1, iterable2, ...)

원하는 만큼 많은 iterable을 인자로 전달할 수 있으며, 결합하고 싶은 iterable들을 반드시 zip() 함수의 인자로 지정해야 합니다.

zip() 메서드는 iterable 객체들이 모두 소진(exhausted)될 때까지 실행됩니다. 즉, 만들 수 있는 모든 쌍이 생성되면 자동으로 종료됩니다. 참고로 길이가 서로 다른 iterable을 전달하면, 가장 짧은 iterable을 기준으로 결과가 만들어집니다.

zip() 함수 예제

두 개의 Python 리스트가 있다고 가정해 보겠습니다. 하나는 직원 이름을 담고 있고, 다른 하나는 직원 번호를 담고 있습니다. 두 리스트를 하나의 튜플 배열로 합치면 직원 이름과 번호를 나란히 관리할 수 있습니다.

이때 zip() 함수를 사용하면 두 리스트를 손쉽게 병합할 수 있습니다. 아래는 데이터를 병합하는 예제 프로그램입니다.

employee_numbers = [2, 9, 18, 28]
employee_names = ["Candice", "Ava", "Andrew", "Lucas"]

zipped_values = zip(employee_names, employee_numbers)
zipped_list = list(zipped_values)

print(zipped_list)

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

[('Candice', 2), ('Ava', 9), ('Andrew', 18), ('Lucas', 28)]

프로그램이 튜플 항목들의 배열을 생성했으며, 각 튜플에는 직원 이름과 해당 직원의 번호가 함께 담겨 있습니다.

코드의 첫 두 줄에서는 직원 번호와 직원 이름을 저장하는 변수를 선언합니다. 그다음 zip() 함수를 호출하여 두 리스트를 병합하고 새로운 튜플 배열을 만듭니다.

여기서 zip 객체를 리스트로 변환한 이유는 무엇일까요? zip() 함수는 zip 객체를 반환하기 때문입니다. zip 객체는 반복(iteration)할 수는 있지만, 콘솔에 바로 출력하면 내용을 읽기 어려운 형태로 표시됩니다. 따라서 콘솔에서 내용을 확인하려면 zip 객체를 리스트로 변환해야 합니다.

변수 zipped_values가 실제로 zip 객체인지 확인하려면 아래 코드를 추가해 보세요.

print(type(zipped_values))

실행 결과는 다음과 같습니다.

<class 'zip'>

위 예제에서는 두 개의 항목을 묶었지만, 더 많은 데이터를 묶고 싶다면 zip() 함수에 리스트를 추가로 전달하기만 하면 됩니다.

zip()으로 여러 iterable 한 번에 반복하기

zip() 함수는 iterator를 반환하기 때문에 묶인 각 항목의 내용을 개별적으로 확인할 수 있습니다.

여러 iterable을 동시에 다루는 것은 Python에서 zip() 함수가 가장 널리 사용되는 사례 중 하나입니다. 예를 들어 여러 개의 리스트를 동시에 순회해야 한다면 zip() 함수가 유용합니다.

zip() 함수를 사용해 employee_numbers 리스트와 employee_names 리스트를 동시에 반복해 보겠습니다.

employee_numbers = [2, 9, 18, 28]
employee_names = ["Candice", "Ava", "Andrew", "Lucas"]

for name, number in zip(employee_names, employee_numbers):
	print(name, number)

실행 결과는 다음과 같습니다.

Candice 2
Ava 9
Andrew 18
Lucas 28

프로그램은 zip()이 반환한 튜플 목록을 순회하면서 각 튜플을 name과 number라는 두 값으로 분리합니다.

이렇게 하면 여러 iterable 객체를 한 번에 쉽게 순회할 수 있으며, 직원 이름과 해당 직원의 번호를 나란히 확인할 수 있습니다. 필요하다면 이 방식으로 세 개 이상의 iterable 객체도 동시에 반복 처리할 수 있습니다.

Python에서 압축 해제(Unzip)하기

지금까지 다양한 데이터를 zip으로 묶어 보았습니다. 그렇다면 원래 형태로 되돌리려면 어떻게 해야 할까요? 분리하고 싶은 튜플 목록(즉, zipped 값)이 있다면 zip() 함수의 언패킹(unpacking) 연산자를 사용할 수 있습니다. 이는 별표(*)를 zip() 함수와 함께 사용하는 방식입니다.

다음은 zip() 언패킹 연산자를 활용한 예제입니다.

employees_zipped = [('Candice', 2), ('Ava', 9), ('Andrew', 18), ('Lucas', 28)]
employee_names, employee_numbers = zip(*employees_zipped)

print(employee_names)
print(employee_numbers)

실행 결과는 다음과 같습니다.

('Candice', 'Ava', 'Andrew', 'Lucas')
(2, 9, 18, 28)

코드의 첫 줄에서는 튜플 목록을 포함하는 변수를 정의합니다. 그다음 줄에서는 employee_namesemployee_numbers라는 두 변수를 정의하고, 언패킹 연산자 *를 사용해 압축을 해제한 결과값을 각각 할당합니다.

즉, unzip은 employees_zipped 변수를 받아 언패킹 연산자 *로 묶음을 푸는 zip 함수라고 할 수 있습니다. 위 예제에서는 직원 이름과 직원 번호를 담은 두 개의 새 변수를 출력했습니다.

마무리

zip() 함수는 iterable 객체들을 입력받아 하나의 zip 객체로 결합하며, 이 객체는 각 iterable의 값을 나란히 보여줍니다. 두 개 이상의 배열이나 튜플을 하나로 합치고 싶을 때 매우 유용합니다.

이번 글에서는 zip() 함수의 기본 사용법과 함께, zip()으로 iterable을 반복 처리하는 방법, 그리고 이미 묶은 데이터를 다시 푸는(unzip) 방법까지 살펴보았습니다. 이제 여러분도 Python zip() 함수를 능숙하게 활용할 준비가 되었습니다.

Python 개발 언어 학습에 대한 더 많은 팁과 조언이 필요하다면, 관련 학습 가이드를 참고해 보시기 바랍니다.