👨‍👩‍👦‍👦

4.4.4. 딕셔너리

1. Dictionary

  • 딕셔너리는 순서가 없는 자료형입니다.
  • 사전형은 Key와 Value 가 하나의 묶음으로 이루어진 자료 체계입니다.
  • 값의 변경이 가능합니다.
  • 다른 자료형을 입력할 수 있습니다.
  • 키의 중복은 허락하지 않고, 값의 중복을 허락합니다.
 
다른 프로그래밍 언어에서는 Hash, Map 등 다른 용어로 불리기도 합니다.
 
{ key : value }
 
위의 형태가 기본 형태입니다. 여러가지의 키와 값으로 구성되는 경우의 형태는 아래와 같습니다.
test = { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }
 
입력된 값은 아래와 같이 호출할 수 있습니다.
입력
d = {'one' : '하나', 'two' : '둘', 'three' : '셋'} d d['one']
 
출력
'하나'
key값으로 value를 호출할 수 있지만, value로 key값을 호출할 수 없습니다.
 
아래 출력 결과를 확인해보면 값을 변경할 수 있다는 것을 알 수 있습니다.
입력
d = {'one' : '하나', 'two' : '둘', 'three' : '셋'} d['one'] = 1 d
 
출력
{'one' : 1, 'two' : '둘', 'three' : '셋'}
 
예제를 하나 더 보도록 하겠습니다. 이번에는 일부러 키를 중복하여 삽입해 보았습니다.
입력
d = {'one' : '하나', 'one' : '하나2', 'one' : '하나3', 'two' : '둘', 'three' : '셋'} d d = {'one' : '하나', 'one1' : '하나1', 'one2' : '하나2', 'two' : '둘', 'three' : '셋'} d
 
출력
{'one' : '하나3', 'two' : '둘', 'three' : '셋'} {'one' : '하나', 'one1' : '하나1', 'one2' : '하나2', 'two' : '둘', 'three' : '셋'}
마지막에 들어간 key값의 value가 출력됩니다. 키의 중복은 불가능 하지만 value의 중복이 가능하다는 것을 알 수 있습니다.
 
이번에는 딕셔너리를 만드는 다양한 방법에 대해 알아보도록 하겠습니다.
입력
d = {} type(d) d = {10} type(d) d = dict() d
 
출력
dict set #키와 value로 매핑하지 않아서 set이라는 집합이 출력되었습니다. {}
 
입력
dict('leehojun') dict(['one' , '하나'), ('two', '둘')]) #대괄호를 이용하여 키와 value를 구별해야 합니다. dict(name = 'leehojun',age = 10)
 
출력
ERROR #키와 value를 구별할 수 없어서 ERROR가 발생했습니다. {'one' : '하나', 'two' : '둘'} {'name' : 'leehojun' , 'age' = 10}
 
이번에는 zip을 사용해서 mapping을 한 다음 dict로 만드는 방법에 대해 알아보도록 하겠습니다.
입력
list(zip('ABC', '123', 'abc')) dict(zip('ABC', '123')) #형변환
 
출력
[('A', '1', 'a'), ('B', '2', 'b'), ('C', '3', 'c') {'A' : '1', 'B' : '2', 'C' : '3'}
 
in 연산자를 사용하여 key의 포함 여부를 알 수 있습니다.
입력
d = {'one' : '하나', 'two' : '둘', 'three' : '셋'} '하나' in d 'one' in d
 
출력
False True
key 값에서만 포함 여부를 확인하기 때문에 '하나'의 값이 d에 있어도 False가 출력되었습니다.
 
다음 예제처럼 value에 리스트를 넣을 수도 있습니다.
menu = { coffee : ['americano', 'cafe latte', 'mocah latte'], tea: ['green tea', 'black tea'], fruits: ['orange juice', 'pineapple juice'] }
 
사전형에 값을 추가할 때는 키값을 [ ]안에 넣고, 값을 할당해줍니다.
입력
my_score = { 'korean': 90, 'english': 80, 'math': 100 } my_score['science'] = 95 print(my_score)
 
출력
{'korean': 90, 'english': 80, 'math': 100, 'science': 95}
 
사전형에 요소를 삭제하고 싶을 때는 del키를 사용합니다.
입력
my_score = { 'korean': 90, 'english': 80, 'math': 100 } del my_score['english'] print(my_score)
 
출력
{'korean': 90, 'math': 100}
 
사전형에 요소의 길이를 알고 싶을 때는 len를 사용합니다.
입력
l = [20, 30] len(l) len(d)
 
출력
2 2
len은 리스트에서도 사용가능하고, 딕셔너리에서도 사용가능합니다.
 
사전형은 KeyValue가 매칭되어 있기 때문에 어떤 값을 찾아오는데에 굉장히 편리합니다.
입력
# 국어 성적을 알고 싶은 경우 my_score = { 'korean': 90, 'english': 80, 'math': 100 } print(my_score['korean']) # get 함수를 이용하여 가져올 수도 있습니다. print(my_score.get('korean')) # 다만 해당하는 키가 없을 때 # 키값만을 이용하여 가져오는 경우에는 오류가 발생하며 get을 사용할 때에는 None을 리턴합니다. # 오류에 대한 예외처리가 있는 안전한 get을 사용하는 것이 바람직해 보입니다.
 
출력
90 90
 
다만 사전형에서의 Key 값은 고유한 값이기 때문에 동일한 이름으로 사용할 수 없습니다.
입력
my_score = { 'korean': 90, 'english': 80, 'math': 100, 'math': 90 } print(my_score)
 
출력
{'korean': 90, 'english': 80, 'math': 90}
 
일반적으로 생각해도 Key 값을 기준으로 값을 찾아야 하기 때문에 고유할 수 밖에 없습니다.
Key 값으로 리스트를 사용할 순 없지만, 튜플은 키값으로 사용할 수 있습니다. Key가 고유하다는 점을 생각해보면 변할 수 있는 리스트는 사용해서는 안되겠지요.
입력
map_check = { (1, 3): 10293, (1, 2): 39492, (1, 1): 49377, (1, 4): 12375 } print(map_check)
출력
{(1, 3): 10293, (1, 2): 39492, (1, 1): 49377, (1, 4): 12375}
 
입력
my_check = { [1, 3]: 10293, [1, 2]: 39492, [1, 1]: 49377, [1, 4]: 12375 } print(my_check)
 
출력
Traceback (most recent call last): File "/study.py", line 5, in <module> [1, 4]: 12375 TypeError: unhashable type: 'list'

2. 딕셔너리의 method

2.1 keys( )

사전 자료형에 있는 Key 값들을 가져오려면 keys 함수를 사용합니다. 이때 반환되는 것은 dict_keys 객체입니다. 이 객체는 리스트와 비슷하게 반복문을 사용할 수 있습니다.
입력
map_check = { (1, 3): 10293, (1, 2): 39492, (1, 1): 49377, (1, 4): 12375 } print(map_check.keys())
 
출력
dict_keys([(1, 3), (1, 2), (1, 1), (1, 4)])
 

2.2 values( )

사전 자료형에 있는 value 값들을 가져오려면 values 함수를 사용합니다. 이때 반환되는 것은 dict_values 객체입니다. 이 객체는 리스트와 비슷하게 반복문을 사용할 수 있습니다.
입력
map_check = { (1, 3): 10293, (1, 2): 39492, (1, 1): 49377, (1, 4): 12375 } print(map_check.values())
 
출력
dict_values([10293, 39492, 49377, 12375])
 

2.3 items( )

사전 자료형에 있는 KeyValue를 리스트의 형태로 얻기 위해서는 items 함수를 사용합니다. 이때 반환되는 것은 dict_items 객체입니다. 이 객체는 리스트와 비슷하게 반복문을 사용할 수 있습니다.
입력
map_check = { (1, 3): 10293, (1, 2): 39492, (1, 1): 49377, (1, 4): 12375 } print(map_check.items())
 
출력
dict_items([((1, 3), 10293), ((1, 2), 39492), ((1, 1), 49377), ((1, 4), 12375)])
 
자료 사전형 안에 원하는 Key가 있는지 찾아볼 때에는 in 을 활용할 수 있습니다.
입력
my_score = { 'korean': 90, 'english': 80, 'math': 100 } print('math' in my_score) print('science' in my_score)
 
출력
True False
 

2.4 get( )

key값으로 value값을 호출하고 싶다면 get을 사용하여 호출합니다.
입력
def switch(x): return{1 : 'Mon', 2 : 'Tue', 3 : 'Wed', 4 : 'Thu' }.get(x) print(switch(3))
 
출력
Wed
 

2.5 fromkeys( )

시퀀스형 자료를 가지고 딕셔너리를 만들 때 fromkeys를 사용합니다.
입력
dict.fromkeys('leehojun') dict.fromkeys('leehojun',100)
 
출력
{'i' : None, 'e' : None, 'h' : None, 'o' : None, 'j' : None, 'u' : None, 'n' : None} {'i' : 100, 'e' : 100, 'h' : 100, 'o' : 100, 'j' : 100, 'u' : 100, 'n' : 100}
 
입력
keys = ('name','age','grade') values = ('leehojun','10','수') dict.fromkeys('leehojun',100) dict.fromkeys(keys, values)
 
출력
{'name' : ('leehojun','10','수'), 'age' : ('leehojun','10','수'), 'grade' : ('leehojun','10','수')}
값이 시퀀스자료형으로 들어가는 것이 아니라 똑같은 값으로 들어간다는 것을 주의해주세요.
 

2.6 update( )

기존의 데이터에 추가로 데이터를 추가하고 싶다면 update함수를 사용하여 추가해줍니다.
입력
d = {'one' : '하나', 'two' : '둘', 'three' : '셋'} d.update({'one' : 1, 'two' : 2}) d
 
출력
{'one' : '1', 'two' : '2', 'three' : '셋'}
 

3. 딕셔너리 순회

입력
d = {'two' : 2, 'three' : '셋'} for i in d: print(i)
 
출력
two three
for문에서 딕셔너리를 순회하면 키의 값만 출력됩니다.
 
입력
#키의 값과 vlaue순회 for i in d: print(i, d[i])
 
출력
two 2 three 셋
 
입력
for i , j in d.items(): print(i, j) d.items()
 
출력
two 2 three 셋 dict_items(['two', 2), ('three', '셋')])