Python zip
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