트랙
/
Python
Python
/
학습 과정
/
딕셔너리 메서드
딕셔

딕셔너리 메서드 에서 Python

2개의 연습 문제

딕셔너리 메서드 소개

Python의 dict 클래스는 딕셔너리를 다룰 때 유용한 메서드를 많이 제공해요. 그중 일부는 dict 개념에서 이미 소개했어요. 여기서는 몇 가지를 더 살펴보고, 딕셔너리를 순회하고 조작하는 몇 가지 기법도 함께 알아볼게요.

  • <dict>.setdefault()는 KeyError를 발생시키지 않고 키를 자동으로 추가해요.
  • <dict>.fromkeys(<iterable>, <default value>)는 임의 개수의 이터러블로부터 새로운 dict를 만들어요.
  • <dict>.keys(), <dict>.values(), <dict>.items()는 편리한 이터레이터를 제공해요.
  • sorted(<dict>.items())를 사용하면 dict의 항목을 손쉽게 재정렬할 수 있어요.
  • <dict_one>.update(<dict_two>)는 다른 dict와 겹치는 값으로 하나의 dict를 갱신해요.
  • <dict> | <other_dict>와 <dict> |= <other_dict>는 연산자로 두 dict를 병합하거나 갱신해요.
  • reversed(<dict>.keys()), reversed(<dict>.values()), reversed(<dict>.items())는 뒤집힌 뷰를 만들어요.
  • <dict>.popitem()은 key, value 쌍을 제거하고 반환해요.

오류 없이 삽입하는 setdefault()

딕셔너리 개념에서 이미 다뤘듯이, <dict>.get(<key>, <default value>)는 기존 value를 반환하거나, key가 딕셔너리에 없으면 default value를 반환해서 KeyError를 피할 수 있어요. 이 방식은 추가적인 오류 처리를 하고 싶지는 않지만 찾는 key가 반드시 있을 거라고 믿을 수 없을 때 잘 맞아요.

비슷하게 "안전한"(KeyError 없이) 삽입 연산을 위해서는 <dict>.setdefault(<key>, <default value>) 메서드가 있어요. <dict>.setdefault(<key>, <default value>)는 key가 딕셔너리에 있으면 value를 반환해요. key가 없으면 (key, default value) 쌍을 _삽입_하고 사용할 수 있도록 default value를 반환해요.

>>> palette_I = {'Grassy Green': '#9bc400', 'Purple Mountains Majesty': '#8076a3', 'Misty Mountain Pink': '#f9c5bd'}

# Looking for the value associated with key "Rock Brown".The key does not exist, 
# so it is added with the default value, and the value is returned.
>>> palette.setdefault('Rock Brown', '#694605')
'#694605'

# The (key, default value) pair has now been added to the dictionary.
>>> palette_I
{'Grassy Green': '#9bc400', 'Purple Mountains Majesty': '#8076a3', 'Misty Mountain Pink': '#f9c5bd', 'Rock Brown': '#694605'}

이터러블로 딕셔너리 채우기: fromkeys()

여러 keys와 기본값으로 딕셔너리를 빠르게 채우려면 클래스 메서드 fromkeys(<iterable>, <default value>)를 사용해요. 이 메서드는 keys의 이터러블을 순회하면서 새로운 dict를 만들어요. 모든 values는 지정한 default value로 설정돼요:

>>> new_dict = dict.fromkeys(['Grassy Green', 'Purple Mountains Majesty', 'Misty Mountain Pink'], 'fill in hex color here')

{'Grassy Green': 'fill in hex color here',
 'Purple Mountains Majesty': 'fill in hex color here',
 'Misty Mountain Pink': 'fill in hex color here'}

.popitem()으로 (key, value) 쌍 제거하고 반환하기

.popitem()은 딕셔너리에서 (key, value) 쌍 하나를 제거하고 반환해요. 쌍은 후입선출(LIFO) 순서로 반환돼요. 딕셔너리가 비어 있으면 popitem()을 호출할 때 KeyError가 발생해요:

>>> palette_I = {'Grassy Green': '#9bc400', 
                 'Purple Mountains Majesty': '#8076a3', 
                 'Misty Mountain Pink': '#f9c5bd'}
>>> palette_I.popitem()
('Misty Mountain Pink', '#f9c5bd')

>>> palette_I.popitem()
('Purple Mountains Majesty', '#8076a3')

>>> palette_I.popitem()
('Grassy Green', '#9bc400')

# All (key, value) pairs have been removed.
>>> palette_I.popitem()
Traceback (most recent call last):
  line 1, in <module>
    palette_I.popitem()
KeyError: 'popitem(): dictionary is empty'

뷰를 통해 딕셔너리의 항목 순회하기

.keys(), .values(), .items() 메서드는 딕셔너리의 이터러블 뷰를 반환해요.

이 뷰를 사용하면 항목을 변경하지 않고 손쉽게 순회할 수 있어요. 뷰는 _동적_이기도 해요. 기반이 되는 딕셔너리 데이터가 바뀌면 연결된 view object에도 그 변경이 반영돼요:

>>> palette_I = {'Grassy Green': '#9bc400', 
                 'Purple Mountains Majesty': '#8076a3', 
                 'Misty Mountain Pink': '#f9c5bd'}

# Using .keys() returns a list of keys.
>>> palette_I.keys()
dict_keys(['Grassy Green', 'Purple Mountains Majesty', 'Misty Mountain Pink'])

# Using .values() returns a list of values.
>>> palette_I.values()
dict_values(['#9bc400', '#8076a3', '#f9c5bd'])

# Using .items() returns a list of (key, value) tuples.
>>> palette_I.items()
dict_items([('Grassy Green', '#9bc400'), ('Purple Mountains Majesty', '#8076a3'), ('Misty Mountain Pink', '#f9c5bd')])

# Views are dynamic.  Changing values in the dict 
# changes all of the associated views.
>>> palette_I['Purple Mountains Majesty'] = (128, 118, 163)
>>> palette_I['Deep Red'] = '#932432'

>>> palette_I.values()
dict_values(['#9bc400', (128, 118, 163), '#f9c5bd', '#932432'])

>>> palette_I.keys()
dict_keys(['Grassy Green', 'Purple Mountains Majesty', 'Misty Mountain Pink', 'Deep Red'])

>>> palette_I.items()
dict_items([('Grassy Green', '#9bc400'), ('Purple Mountains Majesty', (128, 118, 163)), ('Misty Mountain Pink', '#f9c5bd'), ('Deep Red', '#932432')])

.keys(), .values(), .items() 더 알아보기

Python 3.7+에서 dicts는 항목이 삽입된 순서를 유지하므로 .keys(), .values(), .items()를 사용할 때 선입선출(FIFO) 순서로 순회할 수 있어요.

Python 3.8+에서는 뷰가 뒤집을 수 있는 성질도 가져요. 따라서 reversed(<dict>.keys()), reversed(<dict>.values()), reversed(<dict>.items())를 사용하면 키, 값, 또는 (key, value) 쌍을 후입선출(LIFO) 순서로 순회할 수 있어요:

>>> palette_II = {'Factory Stone Purple': '#7c677f', 
                  'Green Treeline': '#478559', 
                  'Purple baseline': '#161748'}
>>> for item in palette_II.items():
...     print(item)
...
('Factory Stone Purple', '#7c677f')
('Green Treeline', '#478559')
('Purple baseline', '#161748')

>>> for item in reversed(palette_II.items()):
...     print(item)
...
('Purple baseline', '#161748')
('Green Treeline', '#478559')
('Factory Stone Purple', '#7c677f')

.update()로 딕셔너리 합치기

<dict_one>.update(<dict_two>)는 두 딕셔너리를 합치는 데 사용할 수 있어요. 이 메서드는 <dict_two>의 (key,value) 쌍을 가져다 <dict_one>에 써넣어요:

>>> palette_I = {'Grassy Green': '#9bc400',
                 'Purple Mountains Majesty': '#8076a3',
                  'Misty Mountain Pink': '#f9c5bd'}
>>> palette_II = {'Factory Stone Purple': '#7c677f',
                  'Green Treeline': '#478559',
                  'Purple Baseline': '#161748'}

>>> palette_I.update(palette_II)

# Note that new items from palette_II are added.
>>> palette_I
{'Grassy Green': '#9bc400', 'Purple Mountains Majesty': '#8076a3', 'Misty Mountain Pink': '#f9c5bd', 'Factory Stone Purple': '#7c677f', 'Green Treeline': '#478559', 'Purple Baseline': '#161748'}

두 딕셔너리에서 키가 겹치면, dict_one의 value가 dict_two의 해당 value로 _덮어써져요:

>>> palette_I = {'Grassy Green': '#9bc400', 
                 'Purple Mountains Majesty': '#8076a3', 
                 'Misty Mountain Pink': '#f9c5bd', 
                 'Factory Stone Purple': '#7c677f', 
                 'Green Treeline': '#478559', 
                 'Purple baseline': '#161748'}
                   
>>> palette_III = {'Grassy Green': (155, 196, 0), 
                   'Purple Mountains Majesty': (128, 118, 163),
                   'Misty Mountain Pink': (249, 197, 189)}
>>> palette_I.update(palette_III)

# Overlapping values in palette_I are replaced with 
# values from palette_III
>>> palette_I
{'Grassy Green': (155, 196, 0),
  'Purple Mountains Majesty': (128, 118, 163), 
  'Misty Mountain Pink': (249, 197, 189), 
  'Factory Stone Purple': '#7c677f', 
  'Green Treeline': '#478559', 'Purple baseline': '#161748'}

합집합(|와 |=) 연산자로 딕셔너리 병합하거나 갱신하기

Python 3.9에서는 dicts를 병합하는 또 다른 방법인 union 연산자가 도입됐어요. dict_one | dict_two는 dict_one과 dict_two의 (key, value) 쌍으로 구성된 새로운 딕셔너리를 만들어요. 두 딕셔너리가 키를 공유하면 dict_two의 값이 우선해요.

>>> palette_I = {'Grassy Green': '#9bc400', 
                 'Purple Mountains Majesty': '#8076a3', 
                 'Misty Mountain Pink': '#f9c5bd'}

>>> palette_II = {'Factory Stone Purple': '#7c677f', 
                  'Green Treeline': '#478559', 
                  'Purple baseline': '#161748'}

>>> new_dict = palette_I | palette_II
>>> new_dict
...
{'Grassy Green': '#9bc400',
 'Purple Mountains Majesty': '#8076a3',
 'Misty Mountain Pink': '#f9c5bd',
 'Factory Stone Purple': '#7c677f',
 'Green Treeline': '#478559',
 'Purple baseline': '#161748'}

dict_one |= other는 <dict_one>.update(<other>)와 비슷하게 동작하지만, 이 경우 other는 dict이거나 (key, value) 쌍의 이터러블일 수 있어요:

>>> palette_III = {'Grassy Green': (155, 196, 0),
                   'Purple Mountains Majesty': (128, 118, 163),
                   'Misty Mountain Pink': (249, 197, 189)}
>>> new_dict |= palette_III
>>> new_dict
...
{'Grassy Green': (155, 196, 0),
'Purple Mountains Majesty': (128, 118, 163),
'Misty Mountain Pink': (249, 197, 189),
'Factory Stone Purple': '#7c677f',
'Green Treeline': '#478559',
'Purple baseline': '#161748'}

딕셔너리 정렬하기

딕셔너리에는 내장 정렬 메서드가 없어요. 하지만 내장 함수 sorted()를 .items()와 함께 사용하면 dict _뷰_를 정렬할 수 있어요. 그리고 정렬된 뷰를 사용해 새로운 딕셔너리를 만들 수 있어요. _정렬 키_를 지정하지 않으면 기본 정렬은 딕셔너리의 keys를 기준으로 해요.

# Default ordering for a dictionary is last in, first out (LIFO).
>>> color_palette = {'Grassy Green': '#9bc400', 
                    'Purple Mountains Majesty': '#8076a3', 
                    'Misty Mountain Pink': '#f9c5bd', 
                    'Factory Stone Purple': '#7c677f', 
                    'Green Treeline': '#478559', 
                    'Purple baseline': '#161748'}
 
 
# The default sort order for a dictionary uses the keys.
>>> sorted_palette = dict(sorted(color_palette.items()))
>>> sorted_palette
{'Factory Stone Purple': '#7c677f',
 'Grassy Green': '#9bc400',
 'Green Treeline': '#478559',
 'Misty Mountain Pink': '#f9c5bd',
 'Purple Mountains Majesty': '#8076a3',
 'Purple baseline': '#161748'}


# A sort key can be provided in the form
# of an anonymous function (lambda). 
>>> value_sorted_palette = dict(sorted(color_palette.items(), key=lambda color: color[1]))
>>> value_sorted_palette
{'Purple baseline': '#161748',
 'Green Treeline': '#478559',
 'Factory Stone Purple': '#7c677f',
 'Purple Mountains Majesty': '#8076a3',
 'Grassy Green': '#9bc400',
 'Misty Mountain Pink': '#f9c5bd'} 

딕셔너리의 키와 값 뒤바꾸기

딕셔너리에서 키와 값을 안정적으로 맞바꾸는 데는 약간의 작업이 필요하지만, dict.items()를 사용하는 loop나 딕셔너리 컴프리헨션으로 할 수 있어요. 안전한 맞바꾸기는 dict의 키와 값이 모두 _해시 가능_하다고 가정해요.

color_reference = {'Purple Mountains Majesty': '#8076a3',
                   'Misty Mountain Pink': '#f9c5bd',
                   'Factory Stone Purple': '#7c677f',
                   'Green Treeline': '#478559',
                   'Purple baseline': '#161748'}

# Creating a new dictionary to hold the swapped entries.
>>> swapped_color_reference = {}

# Iterating through the dictionary, using values as keys.
>>> for key, value in color_reference.items():
...     swapped_color_reference[value] = key

>>> swapped_color_reference
{'#8076a3': 'Purple Mountains Majesty',
 '#f9c5bd': 'Misty Mountain Pink',
 '#7c677f': 'Factory Stone Purple',
 '#478559': 'Green Treeline',
 '#161748': 'Purple baseline'}

 
# A dictionary comprehension can also be used to swap entries.
>>> swapped = {value: key for key, value in
               color_reference.items()}
>>> swapped
{'#8076a3': 'Purple Mountains Majesty',
 '#f9c5bd': 'Misty Mountain Pink',
 '#7c677f': 'Factory Stone Purple',
 '#478559': 'Green Treeline',
 '#161748': 'Purple baseline'}

dict에 저장된 값이 중복되면 키와 값을 맞바꾸기 전에 추가 확인이 필요해요:

# Things become more complicated if there are duplicates in 
# potential key values.This dict is arranged by hex, RGB, and HSL
# keys, but values repeat.
>>> extended_colors = {'#8076a3': 'Purple Mountains Majesty',
                       (128, 118, 163): 'Purple Mountains Majesty',
                       (21, 28, 0, 36): 'Purple Mountains Majesty',
                       '#f9c5bd': 'Misty Mountain Pink',
                       (249, 197, 189): 'Misty Mountain Pink',
                       (0, 21, 24, 2): 'Misty Mountain Pink',
                       '#7c677f': 'Factory Stone Purple',
                       (124, 103, 127): 'Factory Stone Purple',
                       (2, 19, 0, 50): 'Factory Stone Purple',
                       '#478559': 'Green Treeline',
                       (71, 133, 89): 'Green Treeline',
                       (47, 0, 33, 48): 'Green Treeline'}
                                
# New empty dictionary for holding swapped entries.
>>> consolidated_colors = {}

# Iterating over (key, value) pairs using .items()
>>> for key, value in extended_color_reference.items():
...    if value in consolidated_colors: # <--Check if key has already been created.
...        consolidated_colors[value].append(key)
...    else:
...        consolidated_colors[value] = [key]  # <--Create a value list with the former key in it.

>>> consolidated_colors
{'Purple Mountains Majesty': ['#8076a3', (128, 118, 163), (21, 28, 0, 36)],
 'Misty Mountain Pink': ['#f9c5bd', (249, 197, 189), (0, 21, 24, 2)],
 'Factory Stone Purple': ['#7c677f', (124, 103, 127), (2, 19, 0, 50)],
 'Green Treeline': ['#478559', (71, 133, 89), (47, 0, 33, 48)]}  

딕셔너리와 딕셔너리를 다루는 메서드에 대한 자세한 설명은 공식 튜토리얼과 공식 라이브러리 레퍼런스가 훌륭한 출발점이에요.

Real Python과 Finxter에도 Python 딕셔너리에 관한 매우 자세한 글이 있어요.

정렬에 대해서는 Python 문서의 정렬 HOW TO를 참고해요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요

딕셔너리 메서드 배우기

연습이 잠겨 있어요

딕셔너리 메서드 개념을 연습하려면 연습 문제 3개를 더 잠금 해제해요