본문 바로가기
작업/Programming

파이썬(Python) zip 함수 사용

 

 

파이썬(Python)의 Built-In(내장) 함수(Function)인 zip() 함수의 사용을 정리했습니다.

 

zip() 함수는 여러 iterable 객체를 하나의 튜플(Tuple)로 통합하는 역할을 수행합니다.

 

 

zip(*iterables)

 

인자 앞에 *(Asterisk)가 붙은 것은 "가변 인자"라는 것입니다.

가변 인자는 뚜렷하게 정해지지 않은 인자의 개수를 의미합니다.

 

예를 들어, 대표적인 iterator인 리스트(List)를 zip의 인자로 사용한다고 하겠습니다.

이때, 리스트 A 하나만 zip의 인자로 쓸 수도 있으며

리스트 A, B, C를 한 번에 zip의 인자로 쓸 수도 있습니다.

 

이렇게 적용되는 인자의 개수에 제한받지 않는 경우가 가변 인자입니다.

 

 

 

Python Docs에서 정의된 zip() 함수의 설명을 가져왔습니다.

 

Make an iterator that aggregates elements from each of the iterables.
-> 각각의 iterable 객체의 원소들을 통합하는 iterator를 만든다.

Returns an iterator of tuples, where the 
i-th tuple contains the i-th element from each of the argument sequences or iterables.
-> 각각의 iterable 객체나 순서(sequences) 객체의 i 번째에 해당하는 원소들을 튜플(tuple)의 i 번째 원소로 포함하는 튜플을 반환한다.

The iterator stops when the shortest input iterable is exhausted.
-> 인자로 들어온 iterator 중에서 원소 개수가 적은 iterator의 순회가 끝나면 멈춘다(반환한다).

With a single iterable argument, it returns an iterator of 1-tuples.
-> 1개의 iterable 객체가 인자로 있으면, 1개의 tuple iterator로 반환한다.

With no arguments, it returns an empty iterator.
-> 인자가 없으면, 빈 iterator를 반환한다.

 

 

 

코드로 직접 만들어 보면서 정리했습니다.

 

4가지 과목에 대해 학생들이 얻은 점수를 zip으로 얻어내는 과정입니다.

각각의 과목 점수를 리스트로 저장했기 때문에 총 4개의 리스트가 사용됩니다.

 

그리고, 인덱스(0, 1, 2, 3, 4)를 기준으로 학생을 구분하며

4개의 리스트 각각의 0번 인덱스 값은 학생 A의 점수,

1번 인덱스 값은 학생 B의 점수, ... 형태로 점수를 얻어냅니다.

 

 

 

 

 

zip()의 인자로 4개 과목의 점수 리스트가 들어갔습니다.

가변 인자 구조이기 때문에 5과목이든 6과목이든 얼마든지 들어갈 수 있습니다.

 

zip() 함수는 인자로 받은 4개의 리스트의 i 번째 원소들을 하나의 튜플로 반환합니다.

 

즉, 첫 for문에서 4과목의 0 번째 원소인 95, 90, 90, 90을 하나의 튜플로 반환하고,

다음 for문에서 4과목의 1 번째 원소인 100, 100, 95, 100을 하나의 튜플로 반환...

 

이렇게 총 5번의 반환이 이루어집니다.

enumerate() 함수를 사용해서 순서 번호(idx)를 얻어내어 "n번 학생"을 표현했습니다.

 

 

 

 

다음으로, 원소의 개수가 같지 않은 리스트를 인자로 넣었을 경우입니다.

한국사(History) 점수 1개를 삭제하고 진행했습니다.

 

 

 

 

가장 적은 원소를 가진 한국사 리스트의 점수를 zip의 반환으로 모두 사용하면 zip() 함수는 끝납니다.

그래서 많은 원소를 가지는 Korean, English, Math의 마지막 원소는 사용되지 않습니다.

 

결과에서도 5번 학생의 점수는 표시되지 않는 것을 확인할 수 있습니다.

 

 

 

 

 

 

이번에는 2차원 리스트에 저장된 값들을 zip()의 인자로 사용했습니다.

2차원 리스트는 위의 4개의 과목 점수를 한 번에 저장한 구조입니다.

 

 

코드에는 별 문제가 없어 보이겠지만, 결과를 보면 뭔가 이상하게 느껴질 것입니다.

이전의 결과들과는 다르게 2차원 리스트의 각각의 묶음 그대로 반환되는 것을 확인할 수 있습니다.

 

이는 zip() 함수가 grades를 가변 인자 구조가 아닌 하나의 iterable 객체로 인식했기 때문입니다.

Docs의 설명 중 ④에 해당하는 처리가 발생한 것이고, 올바르게 처리되기 위해서는 가변 인자임을 알려줘야 합니다.

 

그래서 *를 명시하는 것이 필요합니다.

아래 코드를 보겠습니다.

 

 

 

 

인자의 grades 앞에 *기호를 추가했습니다.

이렇게 인자로 들어간 2차원 리스트를 가변 인자 묶음으로 활용한다고 명시하면

올바른 처리로 결과가 나타난 것을 확인할 수 있습니다.

 

 

이상으로 zip() 함수에 대한 정리였습니다.

감사합니다.

 

 

- 끝 -