눈송이의 개발생활
[Python]내장 함수 - zip() 본문
프로그래머스 Lv.1 문제를 풀다가 처음 보는 함수가 있어서 정리하려고 한다.
행렬의 덧셈이라는 문제였는데, 나는 이중 for문을 돌면서 각각 원소를 더했지만, 다른 사람의 풀이를 보니 zip()을 이용해서 심플하게 풀었었다.
아래와 같이 나의 코드는.... 정말 길고 복잡하고 못생겼다.
코드가 확 깨끗해지는 함수라서 공부해보았다.
# 내 풀이
def solution(arr1, arr2):
answer = []
for i in range(len(arr1)):
answer.append([])
for j in range(len(arr1[0])):
answer[i].append(arr1[i][j] + arr2[i][j])
return answer
# 다른 사람 풀이
def solution(arr1, arr2):
answer = [[c + d for c, d in zip(a, b)] for a, b in zip(arr1, arr2)]
return answer
zip()
옷의 지퍼처럼 두 그룹의 데이터를 서로 엮어주는 파이썬의 내장 함수
- 그룹들은 동일한 개수로 이루어져야 함
- 여러 개의 순회 가능한 iterable 객체를 인자로 받음
- iterator 반환
numbers = [1, 2, 3]
letters = ['a','b','c']
print(list(zip(numbers, letters)))
# [(1, 'a'), (2, 'b'), (3, 'c')]
각 인덱스에 해당하는 원소들끼리 묶어서 tuple로 return
matrix1 = [[1, 2], [3, 4]]
matrix2 = [[5, 6], [7, 8]]
for a, b, in zip(matrix1, matrix2):
print('a :', a, 'b :', b)
# a : [1, 2] b : [5, 6]
# a : [3, 4] b : [7, 8]
위의 문제의 코드를 조금 나눠서 살펴보면, 처음에 2개의 행렬을 묶으면 index가 0인 [1, 2]와 [5, 6]이 하나의 세트가 되고, index가 1인 [3, 4]와 [5, 6]이 다른 하나의 세트가 되는 것을 볼 수 있다.
matrix1 = [[1, 2], [3, 4]]
matrix2 = [[5, 6], [7, 8]]
for a, b, in zip(matrix1, matrix2):
for c, d in zip(a, b):
print(a, b, c + d)
# [1, 2] [5, 6] 6
# [1, 2] [5, 6] 8
# [3, 4] [7, 8] 10
# [3, 4] [7, 8] 12
1번째 출력된 것은 1과 5의 합, 2번째는 2와 6의 합 이렇게 각 a 세트와 b 세트의 동일한 index의 원소들이 더해지는 것을 볼 수 있다.
unzip
zip()으로 묶은 데이터를 다시 풀고 싶을 때는 zip() 함수를 사용한다.
numbers = [1, 2, 3]
letters = ['a','b','c']
pairs = list(zip(numbers, letters))
print(pairs)
# [(1, 'a'), (2, 'b'), (3, 'c')]
num, let = zip(*pairs)
print(num)
print(let)
# (1, 2, 3)
# ('a', 'b', 'c')
zip으로 묶었던 리스트에 unpacking 연산자(*)를 붙이면 다시 각각 tuple 형태로 돌아온다.
❗ 주의 ❗
zip으로 엮는 인자의 길이가 다른 경우에는 가장 짧은 인자를 기준으로 묶어주고 남는 원소들은 버리기 때문에 자료형의 길이가 모두 동일하도록 해야한다.
'Programming Languages > Python' 카테고리의 다른 글
[Python]자료구조 - deque (0) | 2022.01.16 |
---|---|
[Python]itertools - permutations, combinations (순열과 조합) (0) | 2022.01.15 |
[Python]String 관련 함수 - join, reversed (0) | 2022.01.13 |
Comments