형태
zip(*iterables, strict=False)
iterable은 반복 가능(iterable)한 데이터 여러 개를 입력한다는 뜻
예시를 보자.
number = [1,2,3,4]
alpha = ['a','b','c','d']
for _ in zip(number, alpha):
print(_, end = " ") #(1, 'a') (2, 'b') (3, 'c') (4, 'd')
zip을 이용해서 반환했더니 튜플 타입으로 반환되었는데,
리스트나 딕셔너리로 반환할 수도 있다.
list(zip([1, 2, 3], [4, 5, 6])) #[(1, 4), (2, 5), (3, 6)]
list(zip("abc", "def")) #[('a', 'd'), ('b', 'e'), ('c', 'f')]
dict(zip(['one','two','three'], [1,2,3])) #{'one': 1, 'two': 2, 'three': 3}
for문 내에서 zip함수를 사용할 수도 있다.
for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):
print(item)
# (1, 'sugar')
# (2, 'spice')
# (3, 'everything nice')
str1 = "1234"
str2 = "ABCD"
str3 = "abcd"
for a,b,c in zip(str1,str2,str3):
print(a,b,c)
# 1 A a
# 2 B b
# 3 C c
# 4 D d
list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))
#[(0, 'fee'), (1, 'fi'), (2, 'fo')]
그렇다면 주어진 행렬을 전치행렬로 바꿀 수도 있을까?
각 리스트의 인덱스끼리 대응하면 된다.
matrix = [[1,2,3],[4,5,6],[7,8,9]]
trans = list(zip(*matrix))
trans #[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
행렬을 iterable하도록 튜플로 만들어준 후에
각 인덱스를 대응시키면 된다.
packing, unpacking 설명은 해당 링크에서.
strict의 디폴트는 False인데,
strict=True로 설정하면 두 데이터의 크기가 다를 때 error를 반환한다
위의 코드와 비교하여 아래의 코드를 보자.
for item in zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True):
print(item)
#TypeError: zip() takes no keyword arguments
참고로 프로그래머스 문제의 2차원 행렬곱 문제는 zip을 이용해 간단하게 풀 수 있다.
map, zip, enumerate 등은 잘 알아두면 좋겠다.
REFERENCE
PYTHONDOCS