_빌런 2023. 3. 30. 02:57

Python에는 다양한 편리한 내장 함수들이 있다.

절댓값을 계산해주는 abs, 형식을 지정해주는 format, 거듭제곱을 계산해주는 pow 등.

그 중 하나가 zip 함수이다.

 

num = [1, 2, 3]
char = ["A", "B", "C"]

zip_type = zip(num, char)
# <zip object at 0x000002710EF1B880>

zip_list = list(zip(num, char))
# [(1, 'A'), (2, 'B'), (3, 'C')]

zip은 동일 개수로 이루어진 다른 자료들을 묶어주는 함수이다. (쉽게 생각하면 mapping이다.)

이때 zip 객체로 반환하기 때문에 출력하기 위해서는 unpakcing이나 형변환이 필요하다.

 

compare1 = [1, 2, 3]
compare2 = ['a', 'b', 'c', 'd']

zip1 = zip(compare1, compare2)
# (1, 'a'), (2, 'b'), (3, 'c')

zip2 = zip(compare1, compare2, strict=True)
# ValueError: zip() argument 2 is longer than argument 1

zip은 동일 개수 객체를 함수라고 했는데 길이가 다르다면 어떻게 될까

기본적으로는 '가장 적은 객체를 기준'으로 나머지는 전부 잘린다. (zip1의 경우)

 

zip 함수는 zip(iterable, strict=false)가 기본 형태인데 strict를 True로 설정하면 길이가 다를 때 오류를 반환한다.

zip2의 경우처럼 ValueError가 뜨며 어떤 argument가 얼마나 길이가 차이가 나는지 확인이 가능하다.

 

import string

seq1 = string.ascii_lowercase
seq2 = "Abcdefghijklmnopqrstuvwxyz"

zip_seqs = zip(seq1, seq2)
#print(list(zip_seqs))

enum_seqs = enumerate(zip_seqs)
#print(list(enum_seqs))

for i, (a, b) in enum_seqs:
    if a != b:
        print(f'index: {i}')		# index: 0

zip을 응용하면 위와 같은 코드를 작성할 수 있다.

string 라이브러리를 import하여 string.ascii_lowercase를 사용할 수 있는데 이는 소문자 알파벳 a부터 z까지이다.

 

seq1에는 알파벳 소문자를, seq2에는 임의의 문자열을 입력한다.

이를 zip으로 같은 인덱스끼리 매핑한 튜플을 만들고, enumerate로 인덱스를 추가한다.

그 후 반복문에서 unpacking하여 seq1과 seq2의 문자가 다를 때의 index를 출력한다.

 

 

고민을 시작한 영상 출처 : https://www.youtube.com/shorts/rDfvSE4AuwM

참고한 문서 자료 : https://docs.python.org/ko/3/library/functions.html#zip