Programming Languages/Python

[Python] zip과 dict로 리스트 2개 딕셔너리로 매핑하기 (feat. for문 탈출)

쉬지마 이굥진 2024. 12. 17. 04:09

들어가며

파이썬의 swapcase 메서드에 이어.. 알고리즘 문제를 풀다 얼떨결에 알게 된 zip 메서드, 이건 모두 알아야해!!!!!! 마음으로 포스팅해보려고 한다.

솔직히 이거 찾고 이굥진 인생 한정 2024 올해의 발견상 주고 싶었다.

 

예제

여기 같은 길이의 리스트 2개가 있다고 가정해보자. 이 리스트는 4명의 이름에 대한 리스트와, 그 이름에 맞는 점수 리스트다.

 

name = ["karina", "winter", "ningning", "zizel"]

score = [5, 10, 1, 3]

 

이 두 리스트를, 한 개의 딕셔너리로 매핑하려고 한다.

평소의 나는 for문으로 매핑하는 방법을 선택해서

이렇게 하거나,

혹은

이렇게 했을 것.

 

이런 약 3줄의 코드를 zip, dict 메서드를 쓰면 단 한 줄로 줄일 수 있다.

 

dict_score = dict(zip(name, score))

요 한 줄로 매핑이 가능하다. 아주 짧고 간단해짐.

 

for문 세 줄을 한 줄로 줄일 수 있게 해준 zip과 dict 함수에 대해 알아보자.

 

zip( )

zip()은 여러 개의 iterable(반복 가능한 객체, e.g. 리스트)을 병렬로 묶어서 튜플로 생성해주는 함수다.

즉, 위 예제에서는 두 리스트의 값을 하나씩 묶어서 튜플을 생성하는데,

zip(name, score) 코드가 name과 score 리스트의 값을 하나씩 묶어서 튜플로 만드는거라고 생각하면 된다.

결과는 아래와 같다.

[('may', 5), ('kein', 10), ('kain', 1), ('radi', 3)]

 

주의점 및 사용 예시

💡주의점
zip() 은 전달된 iterable 중 가장 짧은 길이에 맞춰 동작한다. 나머지 길이가 긴 요소는 무시된다.
사용 후 결과가 zip 객체로 반환되므로 필요 시 list()나 dict()로 변환해야 한다.

 

길이가 다른 리스트가 들어온다면? 

list1 = [1, 2, 3]
list2 = ['a', 'b']

result = zip(list1, list2)
print(list(result))  # [(1, 'a'), (2, 'b')]

가장 짧은 길이에 맞춰서 동작한다. list1 에서의 마지막 요소인 3이 버려진 걸 볼 수 있다.

 

2개 이상의 여러 iterable도 한번에 묶을 수 있다!

list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
list3 = [True, False, True]

result = zip(list1, list2, list3)
print(list(result))  # [(1, 'a', True), (2, 'b', False), (3, 'c', True)]

 

dict( )

dict 함수는 딕셔너리 객체를 생성하는데 사용되는 내장 함수이다.

 

zip() 을 통해 만든 아래의 튜플을,

[('may', 5), ('kein', 10), ('kain', 1), ('radi', 3)]

 dict()에 전달하면, 첫 번째 리스트의 값이 key, 두 번째 리스트의 값이 value 인 딕셔너리를 만들어준다.

dict = dict(zip(name, score)) 	# 결과: {'karina': 5, 'winter': 10, 'ningning': 1, 'zizel': 3}

 

기타 사용 방법

이렇게도 쓸 수 있지롱

 

1. 빈 딕셔너리 생성

empty_dict = dict()
print(empty_dict)  # {}

2. 키-값 쌍을 지정해서 생성

person = dict(name="Alice", age=25, city="Seoul")
print(person)  # {'name': 'Alice', 'age': 25, 'city': 'Seoul'}

 

파이썬은 배우면 배울수록 엄청 쉽고 편한 함수들이 많은 걸 느낀다. 꾸준히 해야지

zip과 dict을 바로 써먹어보고 싶다면 아래 문제를 추천한당 lv.1 짜리라 가볍게 풀만함!https://school.programmers.co.kr/learn/courses/30/lessons/176963

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr