이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.

 

키워드 인자를 묶어달라고 했더니 딕셔너리 형태로 묶어줬다. 그러면 딕셔너리가 무엇이고, 어떻게 쓰면 되는지 알아보자.

 

딕셔너리(dictionary)

딕셔너리(dictionary)의 뜻은 사전이다. 딕셔너리란 데이터 타입은 어째서 이런 이름을 갖게 되었을까?

사전을 어떻게 쓰는지 영어사전을 통해 생각해보자. apple이란 단어의 뜻이 궁금하면 어떻게 하는가?
인터넷이 나오기 전이었다면, 영한사전을 펼쳐서 알파벳순으로 정렬된 단어를 찾아볼 것이다.
하지만 요즘은 영한사전을 인터넷에서 무료로 제공한다. 그래서 아래 그림과 같이 그냥 검색하듯이 한다.

영어사전으로 검색하자

내가 검색하고자 하는 단어, 즉 키워드를 사전에 던져주니, 사전에서 사과라는 답을 돌려주었다. 즉, apple은 사과임을 알 수 있다.

딕셔너리는 정말로 사전처럼 하나의 키워드를 던져주면 여기에 해당하는 값을 돌려주는 데이터 타입이다. 만약 영어 사전처럼 apple은 사과라는 내용이 담긴 딕셔너리가 있다면, 이렇게 생겼을 것이다.

{'apple' : '사과'}

여기서 우리가 찾고자 하는 단어인 ‘apple’은 딕셔너리에서는 키(key)라고 부르고, 사전에서 검색한 결과, 즉 ‘사과’는 값(value)라고 부른다.
이를 일반화해서 표현하자면 이렇게 표현할 수 있다.

{key : value}

여기서 키가 될 수 있는 조건이 있는데, 객체가 불변이어야 한다. 따라서 튜플은 키가 될 수 있지만, 리스트는 키가 될 수 없다.

그러면 본격적으로 딕셔너리를 다뤄보자.

 

딕셔너리 생성

비어있는 딕셔너리는 다음과 같이 생성할 수 있다.

a = {}
a = dict()

아무것도 없는 중괄호를 넣어주거나, 아니면 dict() 함수에 인자를 아무것도 넣지 않고 호출하는 것이다.

미리 무언가가 들어있는 딕셔너리를 생성하고 싶다면, 위의 사과 예제처럼 직접 넣을 수도 있다.

a = {'apple':'사과'}

아니면 순회 가능한 객체 다음과 같이 dict() 함수에 집어넣어도 된다.

a = dict([['apple','사과']])

이 때 dict()의 인자로는 하나의 순회 가능한 객체가 들어가야 하며, 이 객체의 각각의 항목은 크기가 2인 순회 가능한 객체가 들어있어야 한다.

 

딕셔너리 키 확인하기/값 가져오기

딕셔너리에서 특정 키가 있는지 확인하는 방법은 리스트 때와 동일하다. in을 사용하면 된다.

'apple' in a

만약 위의 결과가 True라면, ‘apple’에 해당하는 값을 가져올 수 있다는 것을 의미한다. 다음과 같이 가져오면 된다.

b = a['apple']

리스트나 튜플에서 인덱스 값을 대괄호에 집어넣듯이, 딕셔너리에 키를 대괄호에 집어넣으면 된다. 그러면 b에는 ‘사과’라는 문자열이 들어있을 것이다.

만약 찾고자 하는 키가 딕셔너리에 없는데 위와 같은 동작을 한다면 ‘그런 키는 없는데?’ 라는 에러가 발생할 것이다.

>>> a['hi']
Traceback (most recent call last):
  File "<pyshell#31>", line 1, in <module>
    a['hi']
KeyError: 'hi'

 

딕셔너리 항목 추가/변경/삭제

간단하다. 아래와 같이 하면 된다.

a['hi'] = '안녕'

리스트였다면 범위를 벗어났다는 오류 메시지를 볼 수 있었겠지만, 딕셔너리는 그냥 이렇게 집어넣으면 된다. 실제로 위의 동작 후 a[‘hi’]의 값을 확인하면 ‘안녕’이 들어있는 것을 확인할 수 있을 것이다.

그러면 해당하는 키가 있는데도 위의 동작을 하면 어떻게 될까? 그러면 새로 대입한 값으로 대체된다.

a['hi'] = '안녕하세요'

를 바로 실행하면, a[‘hi’]는 ‘안녕하세요’로 바뀐것을 확인할 수 있을 것이다.

그러면 특정 값을 삭제하려면 어떻게 해야할까? 리스트와 똑같다. del을 사용하면 된다.

del a['hi']

이러면 ‘hi’와 이 키에 대응하던 ‘안녕하세요’가 같이 삭제된 것을 확인할 수 있을 것이다.

 

딕셔너리 순회하기

딕셔너리도 순회 가능한 객체이다. 리스트 순회하듯이 딕셔너리를 순회해보자.

a = {1:10, 2:20, 3:30, 4:40}

for v in a :
    print(v)

위의 코드를 실행하면 1,2,3,4가 출력되는 것을 확인할 수 있다. 즉, 딕셔너리를 순회하면 키에 대해서 순회한다는 것을 알 수 있다. 키를 가져왔다면 자연스럽게 키에 대한 값을 가져올 수 있을 것이다.

for v in a :
    print(v, a[v])

위의 방법 말고도, 순회를 위한 특수한 데이터 타입을 딕셔너리로부터 가져올 수 있다. 키만 모아둔 데이터, 값만 모아둔 데이터, 그리고 키와 데이터의 쌍을 저장하고 있는 데이터를 가져올 수 있다.

  • keys() - 딕셔너리의 모든 키

딕셔너리의 모든 키를 담은 dict_keys()를 리턴한다.

>>> a.keys()
dict_keys([1, 2, 3, 4])

따라서 다음과 같이 순회하면 1,2,3,4가 나오는 것을 확인할 수 있을 것이다.

for v in a.keys():
    print(v)
  • values() - 딕셔너리의 모든 값

딕셔너리의 모든 값을 담은 dict_values()를 리턴한다.

>>> a.values()
dict_values([10, 20, 30, 40])

따라서 다음과 같이 순회하면 10,20,30,40이 나오는 것을 확인할 수 있을 것이다.

for v in a.values():
    print(v)
  • items() - 딕셔너리의 모든 키와 값의 쌍

딕셔너리의 모든 키와 값의 쌍을 담은 dict_items()를 리턴한다.

>>> a.items()
dict_items([(1, 10), (2, 20), (3, 30), (4, 40)])

따라서 다음과 같이 순회하면 (1,10), (2,20), (3,30), (4,40)이 나오는 것을 확인할 수 있을 것이다.

for v in a.items():
    print(v)

위의 세 데이터 타입들은 모두 순회 가능한 객체들이다. 다만 리스트처럼 인덱스 접근은 불가능하니, 인덱스 접근이 하고 싶다면 이 객체들을 토대로 새로운 리스트를 만들수도 있다.

 

Categories:

Updated:

Comments