이 튜토리얼에서는 파이썬 사전(dictionary)을 키 또는 값을 기준으로 정렬하는 다양한 방법을 자세히 살펴보겠습니다.
파이썬에서 사전을 다룰 때, 저장된 데이터를 키나 값에 따라 정렬해야 하는 경우가 종종 발생합니다. 파이썬 사전은 키-값 쌍으로 이루어져 있기 때문에, 필요에 따라 정렬된 키 또는 값을 가진 새로운 사전을 생성하는 방식으로 데이터를 관리할 수 있습니다.
이 튜토리얼에서는 먼저 파이썬 사전의 기본적인 개념을 다시 한번 짚어보고, 그 다음으로 내용을 키 또는 값에 따라 정렬한 새로운 사전을 만드는 효과적인 방법을 소개합니다.
파이썬 사전 기초 복습
파이썬 사전이란 무엇인가?
파이썬 사전은 키와 값의 쌍으로 이루어진 데이터를 저장하는 내장 데이터 구조입니다. 각 키는 고유하며, 키를 사용하여 해당 값을 빠르게 조회할 수 있습니다. 사전에서 키는 값들을 식별하는 고유한 역할을 하므로 중복될 수 없습니다.
py_dict = {"Python": "cool!", "Learn": True} py_dict["Python"] # 출력: cool! py_dict["Learn"] # 출력: True
기능적으로 사전은 해시 맵과 유사하게 작동합니다. 따라서 데이터가 특정 순서대로 정렬되어 저장될 필요는 없습니다. 키를 알고 있다면 사전 내의 데이터에 임의의 순서로 접근하는 것이 가능합니다.
사전의 데이터 순서
파이썬의 이전 버전에서는 키의 순서를 유지하기 위해 OrderedDict를 사용해야 했습니다. 하지만 파이썬 3.7부터는 사전 항목을 추가한 순서대로 접근할 수 있게 되었습니다. 이는 사전에 데이터를 추가한 순서가 보장된다는 것을 의미합니다.
이제 파이썬 사전의 기본 개념을 복습했으니, 사전을 정렬하여 새로운 사본을 만드는 방법을 알아보겠습니다.
⚙️ 참고: 이 튜토리얼의 코드가 제대로 실행되려면 파이썬 3.7 버전 이상이 필요합니다. 최신 버전의 파이썬은 여기에서 다운로드할 수 있으며, koreantech.org 온라인 파이썬 편집기에서도 예제를 실행할 수 있습니다.
키를 기준으로 파이썬 사전 정렬하기
카페의 디저트 메뉴 이미지를 예시로 들어보겠습니다. 이 메뉴에는 디저트 이름과 그에 상응하는 가격이 나란히 표시되어 있습니다.
메뉴에 있는 항목 이름들을 키로, 가격을 값으로 하여 파이썬 사전의 형태로 나타낼 수 있습니다. 아래와 같이 ‘desserts’라는 사전을 만들어 보겠습니다.
desserts = { "Ice cream": 10, "Brownies": 12, "Cheesecake": 3, "Swiss roll": 5, "Cookies": 4, "Cup cake": 2 }
다음으로, 디저트 이름이 알파벳 순서로 정렬된 새로운 사전 ‘sorted_desserts’를 만들 것입니다. 원래 ‘desserts’ 사전에서 디저트 이름은 키로 사용되었으므로, 정렬된 새로운 사전을 생성하기 위해서는 이러한 키들을 알파벳 순서로 정렬해야 합니다.
파이썬 사전의 키에 접근하는 방법
이를 위해서는 먼저 사전의 키들을 추출한 다음, 알파벳 순서로 정렬하는 과정이 필요합니다.
파이썬에서는 내장된 사전 메소드인 `.keys()`를 사용하여 사전의 모든 키를 리스트 형태로 얻을 수 있습니다.
아래와 같이 `desserts` 사전에서 `.keys()` 메소드를 호출하여 키들을 추출해 보겠습니다.
keys = desserts.keys() print(keys) # 출력 ['Ice cream', 'Brownies', 'Cheesecake', 'Swiss roll', 'Cookies', 'Cup cake']
이 리스트를 인자로 사용하여 파이썬의 내장 함수인 `sorted()`를 호출하면 새로운 정렬된 리스트를 얻을 수 있습니다.
이제 리스트 `keys`를 인자로 `sorted()` 함수를 호출하여 정렬된 리스트를 변수 `sorted_keys`에 저장합니다.
sorted_keys = sorted(keys) print(sorted_keys) # 출력 ['Brownies', 'Cheesecake', 'Cookies', 'Cup cake', 'Ice cream', 'Swiss roll']
키들이 알파벳 순서로 정렬되었으므로, `desserts` 사전에서 `sorted_keys`의 키에 해당하는 값을 조회하여 새로운 `sorted_desserts` 사전을 만들 수 있습니다.
sorted_desserts = {} for key in sorted_keys: sorted_desserts[key] = desserts[key] print(sorted_desserts) # 출력 {'Brownies': 12, 'Cheesecake': 3, 'Cookies': 4, 'Cup cake': 2, 'Ice cream': 10, 'Swiss roll': 5}
위 코드 블록의 각 단계를 설명하면 다음과 같습니다.
- `sorted_desserts`를 빈 파이썬 사전으로 초기화합니다.
- `sorted_keys` 리스트를 순회합니다.
- `sorted_keys`의 각 키에 대해 `desserts` 사전에서 해당 값을 찾아서 `sorted_desserts`에 새로운 항목을 추가합니다.
이와 같이 `for` 루프를 사용하는 것은 비교적 장황한 방법으로 간주될 수 있습니다. 파이썬은 사전을 간결하게 생성할 수 있는 ‘사전 컴프리헨션(dictionary comprehension)’이라는 강력한 기능을 제공합니다.
파이썬 사전 컴프리헨션
파이썬은 리스트 컴프리헨션과 유사한 사전 컴프리헨션 기능을 지원합니다. 사전 컴프리헨션을 사용하면 단 한 줄의 코드로 새로운 파이썬 사전을 만들 수 있습니다.
▶️ 파이썬에서 사전 컴프리헨션을 사용하는 일반적인 문법은 다음과 같습니다.
# 1. 두 개의 리스트에서 키와 값을 가져오는 경우: list1, list2 new_dict = {key: value for key, value in zip(list1, list2)} # 2. 키만 있고 값을 조회할 수 있는 경우 new_dict = {key: value for key in <iterable>}
위의 두 번째 형식인 `new_dict = {key: value for key in <iterable>}`를 사용하여 `sorted_desserts` 사전을 생성해 보겠습니다.
이 예시에서:
- `iterable`: `sorted_keys` 리스트
- `key`: `sorted_keys`를 순회하면서 접근하는 키
- `value`: `desserts` 사전에서 해당 `key`에 대한 값인 `desserts[key]`
이 모든 요소를 합쳐서 사전 컴프리헨션을 표현하면 다음과 같습니다.
sorted_desserts = {key: desserts[key] for key in sorted_keys} print(sorted_desserts) # 출력 {'Brownies': 12, 'Cheesecake': 3, 'Cookies': 4, 'Cup cake': 2, 'Ice cream': 10, 'Swiss roll': 5}
위 출력에서 보듯이, 디저트들이 `sorted_desserts` 사전에서 알파벳 순서로 정렬되었습니다.
값을 기준으로 파이썬 사전 정렬하기
이제 파이썬 사전을 값에 따라 정렬하는 방법을 알아볼 차례입니다.
`desserts` 사전에서 값은 디저트의 가격에 해당합니다. 이 가격을 기준으로 사전을 오름차순 또는 내림차순으로 정렬할 수 있습니다.
▶️ 내장된 사전 메소드 `.items()`를 사용하면 모든 키-값 쌍을 얻을 수 있습니다. 이 때 각 쌍은 튜플 형태로 반환됩니다.
desserts.items() # 출력 dict_items([('Ice cream', 10), ('Brownies', 12), ('Cheesecake', 3), ('Swiss roll', 5), ('Cookies', 4), ('Cup cake', 2)])
각 항목은 튜플이므로 인덱싱을 통해 키와 값에 개별적으로 접근할 수 있습니다.
dict_items = desserts.items() for item in dict_items: print(f"key:{item[0]}, value:{item[1]}") # 출력 key:Ice cream, value:10 key:Brownies, value:12 key:Cheesecake, value:3 key:Swiss roll, value:5 key:Cookies, value:4 key:Cup cake, value:2
값을 기준으로 정렬하려면, 위의 방식으로 얻은 키-값 쌍에서 인덱스 1에 위치한 값에 접근해야 합니다.
파이썬 사전의 값을 오름차순으로 정렬하는 방법
이번에는 `sorted()` 함수를 사용할 때 선택적인 `key` 매개변수를 활용합니다. `key` 매개변수에는 모든 파이썬 함수, 내장 함수, 사용자 정의 함수, 심지어 람다 함수까지 전달할 수 있습니다.
참고: `lambda args: expression`은 파이썬에서 람다 함수를 정의하는 문법입니다.
가격별로 디저트를 정렬하는 예시에서는 사전 항목(키-값 쌍)에 접근할 수 있어야 합니다. 따라서 `key = lambda item: item[1]`으로 설정하여 값(가격)을 기준으로 정렬하도록 합니다.
`sorted()` 함수는 기본적으로 리스트를 반환하므로 아래와 같이 명시적으로 `dict`로 캐스팅해야 합니다.
sorted_desserts = dict(sorted(desserts.items(), key=lambda item: item[1])) print(sorted_desserts) # 출력 {'Cup cake': 2, 'Cheesecake': 3, 'Cookies': 4, 'Swiss roll': 5, 'Ice cream': 10, 'Brownies': 12}
위 코드는 다음과 같이 사전 컴프리헨션을 사용하여 다시 작성할 수도 있습니다.
sorted_desserts = {key: value for key, value in sorted(desserts.items(), key=lambda item: item[1])} print(sorted_desserts) # 출력 {'Cup cake': 2, 'Cheesecake': 3, 'Cookies': 4, 'Swiss roll': 5, 'Ice cream': 10, 'Brownies': 12}
`sorted_desserts`에서 가장 저렴한 $2짜리 컵케이크가 첫 번째 항목이고, 가장 비싼 $12짜리 브라우니가 마지막 항목입니다.
파이썬 사전의 값을 내림차순으로 정렬하는 방법
가격을 내림차순으로 정렬하려면, 아래 설명된 대로 선택적인 `reverse` 매개변수를 `True`로 설정하면 됩니다.
sorted_desserts = dict(sorted(desserts.items(), key=lambda item: item[1], reverse=True)) print(sorted_desserts) # 출력 {'Brownies': 12, 'Ice cream': 10, 'Swiss roll': 5, 'Cookies': 4, 'Cheesecake': 3, 'Cup cake': 2}
이제 `sorted_desserts` 사전은 가격이 내림차순으로 정렬되어 가장 비싼 $12짜리 브라우니부터 시작합니다.
마무리 👩🏽💻
이 튜토리얼에서 배운 내용을 빠르게 요약해 보겠습니다.
- 파이썬 사전은 키-값 쌍으로 데이터를 저장합니다. 이때 키는 모두 고유해야 합니다.
- 키 또는 값을 기준으로 사전을 정렬하는 과정에서는 정렬된 새로운 사전을 생성합니다.
- 내장된 사전 메소드인 `.keys()`와 `.items()`를 사용하여 각각 모든 키와 키-값 쌍을 검색할 수 있습니다.
- 선택적인 매개변수인 `key`와 `reverse`를 `sorted()` 함수와 함께 사용하여 원하는 방식으로 사전을 정렬할 수 있습니다.
이제 파이썬 사전을 정렬하는 방법을 배웠으니, 파이썬 리스트를 정렬하는 방법도 배워보세요. 즐거운 코딩 되세요! 🎉