[파이썬] 내장함수 zip()

InAnarchy·2023년 4월 13일
0

Python

목록 보기
8/14
post-thumbnail

zip

  • 동일한 개수로 이루어진 데이터들을 묶어서 리턴
  • 반환 타입은 튜플

형태

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

profile
github blog 쓰다가 관리하기 귀찮아서 돌아왔다

0개의 댓글