본문 바로가기
Python

[Python] 딕셔너리(dict) 자료형 사용법 및 예제

by A6K 2022. 11. 2.

파이썬은 '딕셔너리(Dictionary)'라고 하는 자료형을 제공한다. 다른 언어에서는 '해시(Hash)', '연관배열(Associative Array)' 혹은 '맵(Map)' 등으로 불리는 자료형이다. 이 자료형은 Key 값과 그 Key 값에 특정 Value를 대응시킨다. 특정 Key에 Value를 대응시켜 놓으면, 나중에 Key 값으로 Value를 바로 찾아올 수 있다.

예를 들어 다음과 같은 Key - Value 쌍이 딕셔너리에 저장되어 있다고하자.

  • "빨강" - "Red"
  • "노랑" - "Yellow"
  • "초록" - "Green"
  • "파랑" - "Blue"

빨강, 노랑, 초록, 파랑은 Key 값이며 각각 Red, Yellow, Green, Blue에 대응 되어 있다. 딕셔너리에 "초록"을 넘기면 "Green"을 바로 리턴해준다. 딕셔너리의 는 "초록"에 해당하는 Value인 "Green"을 찾기 위해 모든 엘리먼트를 조사하지 않고 O(1) 시간에 바로 Value를 찾아서 리턴해준다.

딕셔너리 생성

딕셔너리는 중괄호 '{', '}'를 이용해서 생성할 수 있다.

{ key1:value1, key2:value2, key3:value3, ... }

중괄호 사이에 Key-Value 쌍을 콤마로 구분해서 나열한다. Key-Value 쌍은 Key 값과 Value 값을 콜론(:) 문자로 붙여서 표현단다. Key 값으로는 변하지 않는 값을 사용해야한다. 예를 들어 list, set 같이 내용이 바뀌는 것은 Key 값으로 사용할 수 없다. 또, Key 값은 중복될 수 없다. 만약 동일한 Key 값을 갖는 Key-Value 쌍을 적으면 나중에 오는 Key-Value 쌍의 Value 값으로 덮어쓰여진다.

예를 들어 다음과 같이 딕셔너리를 생성할 수 있다.

dictionary = { 'name' : 'Dave', 'phone' : '010-1234-5678', 'age' : 27 }
empty_dict1 = dict()
empty_dict2 = {}

print(dictionary)
print(empty_dict1)
print(empty_dict2)

# {'name': 'Dave', 'phone': '010-1234-5678', 'age': 27}
# {}
# {}

빈 딕셔너리 객체를 만들기 위해서 dict() 함수를 호출하거나 아무것도 포함하고 있지 않는 중괄호 {}를 사용하면 된다.

딕셔너리의 Key-Value 쌍 중 Key 값으로는 불변의 값만 사용가능하다는 제약이 있었지만 Value 값으로는 그런 제약이 없다. 따라서 숫자나 문자열 데이터 뿐만 아니라 set, list 혹은 다른 딕셔너리 객체도 사용할 수 있다.

dictionary = {'my_list' : [1,2,3], 'my_tuple' : (2,3), 'my_dict' : {'key1':'value1', 'key2':'value2'}}

print(dictionary)

# {'my_list': [1, 2, 3], 'my_tuple': (2, 3), 'my_dict': {'key1': 'value1', 'key2': 'value2'}}

딕셔너리 값 추가

이미 생성된 딕셔너리에 새로운 Key-Value 쌍을 추가하는 방법을 알아보자. 

d = {'a' : 'apple'}
d['b'] = 'banana'

print(d)

# {'a': 'apple', 'b': 'banana'}

'a'라는 값을 Key 값으로 갖고 'apple'을 Value 값으로 갖는 딕셔너리를 생성했다. 이 후 'b'를 Key 값으로 갖고, 'banana'를 Value 값으로 갖는 Key-Value 쌍을 추가했다.

추가하는 방법은 딕셔너리[Key] = Value 처럼 쓰면 된다. d 라는 딕셔너리에 'b' 라는 Key 값과 'banana'를 추가하기 위해서 d['b'] = 'banana' 라고 썼다.

딕셔너리 값 삭제

반대로 딕셔너리에서 Key-Value 쌍을 지우는 방법을 알아보자. 딕셔너리에서 Key-Value 쌍을 삭제하기 위해서는 del 연산을 사용하면 된다.

d= {'a': 'apple', 'b': 'banana'}
del d['b']

print(d)

# {'a': 'apple'}

del 연산의 인자로 딕셔너리[Key]를 주면 Key-Value 쌍이 딕셔너리에서 제거된다.

d= {'a': 'apple', 'b': 'banana'}
del d['b']
del d['b']

# Traceback (most recent call last):
#   File "./test.py", line 6, in <module>
#     del d['b']
# KeyError: 'b'

만약 존재하지 않는 Key-Value 쌍을 지우려고 del 연산을 사용한 경우 KeyError가 발생한다.

만약 딕셔너리에 존재하는 모든 Key-Value 쌍을 지우고 빈 딕셔너리로 만들려면 clear() 메소드를 호출하면된다.

d= {'a': 'apple', 'b': 'banana'}
d.clear()

print(d)

# {}

딕셔너리 값 변경

딕셔너리에 있는 Key-Value 쌍의 값을 다른 값으로 변경하는 방법을 알아보자.

d= {'a': 'apple', 'b': 'banana'}
d['a'] = 'airplane'
d['b'] = 'boat'
d['c'] = 'car'

print(d)

# {'a': 'airplane', 'b':'banana', 'c': 'car'}

딕셔너리에 값을 추가하는 방법과 동일하다. 딕셔너리이름[Key] = Value를 이용해서 값을 넘겨주면 딕셔너리는 Key 값이 없으면 새로 만들어주고, Key 값이 있으면 덮어쓴다.

위 예제 코드에서는 'a'라는 Key 값에 해당하는 Value 값이 'apple'에서 'airplane'으로 'b'라는 Key 값은 'banana'에서 'boat'로 덮어쓰여졌다. 'c'라는 Key 값은 존재하지 않았으므로 'car'라는 Value와 함께 새로 추가되었다. 'a', 'b', 'c'를 추가 혹은 변경하는 방법은 모두 동일하다.

딕셔너리 값 접근

딕셔너리의 값을 가져오기 위해서는 딕셔너리이름[Key] 형태로 접근하면 된다.

d= {'a': 'apple', 'b': 'banana'}
print(d['a'])
print(d['b'])

# apple
# banana

만약 존재하지 않는 Key 값으로 접근하는 경우 KeyError가 발생한다.

만약 값이 없는 경우 에러가 아닌 None이 리턴되길 원한다면 딕셔너리에서 제공하는 get() 함수를 사용하면 된다. get() 메소드는 인자로 Key 값을 받으며, Key 값에 대응되는 Value 값을 리턴한다.

d= {'a': 'apple', 'b': 'banana'}
print(d.get('a'))
print(d.get('b'))
print(d.get('c'))

# apple
# banana
# None

만약 Key 값이 딕셔너리에 존재하지 않으면 None을 리턴한다.

딕셔너리 Key 뽑아내기 - keys()

현재 딕셔너리에 저장되어 있는 Key-Value 쌍 중에 Key 값들만 뽑아내고 싶은 경우 딕셔너리의 keys() 메소드를 사용하면 된다.

d= {'a': 'apple', 'b': 'banana', 'c': 'cacao'}
k = d.keys()
print(k)

# dict_keys(['a', 'b', 'c'])

이렇게 뽑아낸 Key 값들은 dict_keys 타입으로 표현되는데, for 문으로 하나씩 순회할 수 있다.

d= {'a': 'apple', 'b': 'banana', 'c': 'cacao'}
keys = d.keys()

for key in keys:
  print(key)
  
# a
# b
# c

딕셔너리 Value 뽑아내기 - values()

반대로 딕셔너리에 저장되어 있는 Key-Value 쌍 중에 Value 값들을 뽑아낼 수도 있다. 딕셔너리의 values() 메소드를 사용하면 된다.

d= {'a': 'apple', 'b': 'banana', 'c': 'cacao'}
values = d.values()

for value in values:
  print(value)
  
# apple
# banana
# cacao

values()로 뽑아낸 Value 값들은 dict_values 자료형으로 표현되며, 마찬가지로 for문을 이용해서 하나씩 순회할 수 있다.

딕셔너리 Key-Value 쌍 뽑아내기 - items()

아니면 Key-Value 쌍으로 값들을 뽑아낼 수도 있다. 딕셔너리의 items() 메소드는 Key 값과 Value 값으로 구성되어 있는 튜플의 리스트 형태인 dict_items 자료형으로 결과를 뽑아준다.

d= {'a': 'apple', 'b': 'banana', 'c': 'cacao'}
items = d.items()
print(items)

for item in items:
    print('key:' + item[0] + ',value:' + item[1])
  
# dict_items([('a', 'apple'), ('b', 'banana'), ('c', 'cacao')])
# key:a,value:apple
# key:b,value:banana
# key:c,value:cacao

items()로 리턴된 객체를 순회하면 튜플을 하나씩 사용할 수 있으며, [0] 인덱스가 Key, [1] 인덱스가 Value를 의미한다.

특정 Key가 딕셔너리에 있는지 조사 - in, not in

특정 Key 값이 딕셔너리에 존재하는지를 조사하기 위해 in 연산과 not in 연산을 사용할 수 있다.

d= {'a': 'apple', 'b': 'banana'}

if 'a' in d:
    print('a 값이 존재')

if 'b' in d:
    print('b 값이 존재')
    
if 'c' in d:
    print('c 값이 존재')

# a 값이 존재
# b 값이 존재

'a'와 'b' 라는 키 값은 딕셔너리 d에 존재하기 때문에 처음 두 조건문은 True가 된다. 하지만 'c'라는 Key 값은 존재하지 않기 때문에 세번째 조건문은 False가 된다.

not in 으로 다시 바꿔보면

d= {'a': 'apple', 'b': 'banana'}

if 'a' not in d:
    print('a 값이 존재하지 않음')

if 'b' not in d:
    print('b 값이 존재하지 않음')
    
if 'c' not in d:
    print('c 값이 존재하지 않음')

# c 값이 존재하지 않음

조건이 반대로 적용됨을 알 수 있다.

딕셔너리 병합

여러개의 딕셔너리를 하나로 합치는 연산도 제공된다. ** 연산을 이용하여 중괄호 안에 합쳐질 딕셔너리들을 콤마로 구분해서 나열하면 된다.

d1 = {'a': 'apple', 'b': 'banana'}
d2 = {'b' : 'boat', 'c': 'car'}

new_dict = {**d1, **d2}

print(new_dict)

# {'a': 'apple', 'b': 'boat', 'c': 'car'}

Key 값이 겹치는 경우 뒤쪽에 있는 Value 값이 덮어쓰게 된다.

파이썬 3.9 부터는 | 연산을 이용해 딕셔너리를 병합할 수 있다.

d1 = {'a': 'apple', 'b': 'banana'}
d2 = {'b' : 'boat', 'c': 'car'}

new_dict = d1 | d2

print(new_dict)

# {'a': 'apple', 'b': 'boat', 'c': 'car'}

이 방법은 새로운 딕셔너리 객체를 생성한다.

d1 = {'a': 'apple', 'b': 'banana'}
d2 = {'b' : 'boat', 'c': 'car'}

new_dict = {**d1, **d2}

print(d1)
print(d2)
print(new_dict)

# {'a': 'apple', 'b': 'banana'}
# {'b': 'boat', 'c': 'car'}
# {'a': 'apple', 'b': 'boat', 'c': 'car'}

만약 기존에 존재하는 딕셔너리에 다른 딕셔너리의 Key - Value 쌍을 반영하고 싶다면 딕셔너리 객체의 update() 메서드를 이용하면 된다.

d1 = {'a': 'apple', 'b': 'banana'}
d2 = {'b' : 'boat', 'c': 'car'}

d1.update(d2)

print(d1)
print(d2)

# {'a': 'apple', 'b': 'boat', 'c': 'car'}
# {'b': 'boat', 'c': 'car'}

 

파이썬 스크립트 작성에 도움되는 글 모음

파이썬으로 프로그램을 작성할 때 도움되는 글들을 모아본다. 개발환경 [Python] macOS에 파이참 설치 [Python] 파이참 깃허브 연동 [Python] 파이썬 PIP란? [Python] VSCode를 이용한 개발환경 [Python] python3를

hbase.tistory.com

 

[Python] 집합 (set) 자료형 사용법 및 예제

파이썬 2.3부터 '집합(set)' 자료형이 지원되기 시작했다. set은 집합과 관련된 연산들을 쉽게 처리하기 위해 제공하는 자료형이다. 특히 파이썬 프로그램에서 중복된 값을 제거하기 위해서 많이

hbase.tistory.com

 

[Python] 튜플(tuple) 자료형 사용법 및 예제

파이썬의 튜플은 여러 데이터를 묶어서 같이 처리할 수 있게 해주는 자료형 중 하나다. 위키백과에서 설명하는 튜플은 "셀 수 있는 수랴의 순서 있는 열거"다. 튜플은 리스트와 거의 유사하게 사

hbase.tistory.com

 

[Python] 리스트(list) 자료형 사용법 및 예제

리스트는 일련의 데이터를 묶어서 같이 처리할 수 있게 해주는 자료형 중 하나다. 관련있는 데이터들을 하나의 리스트에 담아서 함께 처리하는 코드는 파이썬에서 굉장히 흔하게 사용된다. 이

hbase.tistory.com

 

댓글