[파이썬] 사전(dictionary) 사용법
Oct 17, 2020 · 5 min read



사전(dictionary)은 파이썬에서 리스트(list)와 더불어 가장 많이 사용되는 내장 데이터 타입 중 하나 입니다.

사전의 특징

해시 테이블(hash table) 자료 구조 기반으로 하는 사전은 키(key)와 값(value)으로 이루어진 여러 쌍의 데이터를 담아 둘 때 사용합니다.

리스트처럼 가변(mutability) 데이터 타입이기 때문에 사전을 선언 후에 자유롭게 새로운 키에 값을 추가하거나 기존 키의 값을 삭제할 수 있습니다.

동적 언어인 파이썬에서는 키로 해시가 가능한(hashable) 모든 데이터를 사용할 수 있고, 값에 대해서는 아무런 제한없이 어떤 데이터도 보관할 수 있습니다.

자바와 같이 동일한 타입의 키와 값만 사용하도록 제한하는 다른 언어와 상당히 대조되는 부분입니다.

사전과 비슷한 특징을 가지되 담고 있는 데이터가 불변(immutability)해야 한다면 named tuple을 사용해야 합니다. 이 부분은 관련 포스트를 참고 바랍니다.

사전 생성

사전을 생성하는 데는 여러가지 방법이 있지만, 가장 많이 사용되는 방법은 중괄호({})를 사용하는 것입니다. 중괄호 안에 <키>: <값> 형태의 데이터 쌍을 쉼표(,)로 구분해서 나열해주면 됩니다.

예를 들어, 사용자의 데이터를 정보를 담아두기 위한 사전은 다음과 같이 생성할 수 있습니다.

>>> { "name": "사용자", "email": "user@test.com", "age": 25 }
{'name': '사용자', 'email': 'user@test.com', 'age': 25}

빈 사전을 생성할 때도 자주 있습니다. 가변 데이터 타입이라 나중에 언제든지 데이터를 추가할 수 있기 때문입니다. 빈 사전을 생성할 때는 빈 중괄호를 사용하거나, dict() 내장 함수를 호출하면 됩니다.

>>> {}
{}
>>> dict()
{}

자주 쓰이는 방법은 아니지만, dict() 내장 함수에 키워드 인자나 터플(tuple) 리스트를 넘길 수도 있습니다.

>>> dict(name="사용자", email="user@test.com", age=25)
{'name': '사용자', 'email': 'user@test.com', 'age': 25}
>>> dict([("name", "사용자"), ("email", "user@test.com"), ("age", 25)])
{'name': '사용자', 'email': 'user@test.com', 'age': 25}

데이터 추가

사전에 데이터를 추가할 때는 대괄호([<키>] = <값>)를 사용하여 원하는 값을 할당해주면 됩니다.

>>> user = {}
>>> user["name"] = "사용자"
>>> user["email"] = "user@test.com"
>>> user["age"] = 25
>>> user
{'name': '사용자', 'email': 'user@test.com', 'age': 25}

데이터 접근

사전이 담고 있는 데이터에 접근할 때도 대괄호([<키>])를 사용합니다.

>>> user["name"]
'사용자'
>>> user["email"]
'user@test.com'
>>> user["age"]
25

한 가지 주의할 점은 사전에 존재하지 않는 키를 사용하면 KeyError 오류가 발생한다는 것입니다.

>>> user["mail"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'mail'

이러한 오류를 방지하고 싶다면, get(<키>[, <기본값>]) 메서드를 사용하면 됩니다. 기본값을 지정해주지 않으면, 키가 존재하지 않을 때, None을 반환합니다.

>>> user.get("mail", "서울")
'서울'
>>> user.get("mail")

데이터 갱신

가변 데이터 타입인 사전은 자유롭게 담고 있는 데이터를 갱신할 수 있습니다. 기존 키에 새로운 값을 할당하기만 하면 기존 값이 새로운 값으로 대체됩니다.

>>> user["age"] = 31
>>> user
{'name': '사용자', 'email': 'user@test.com', 'age': 31}

데이터 삭제

del 키워드를 사용해서 특정 키와 값의 쌍을 사전에서 제거할 수 있습니다.

>>> del user["email"]
>>> user
{'name': '사용자', 'age': 31}

데이터 순회

in 연산자를 통해서 사전에 있는 모든 데이터를 for 루프문으로 순회할 수 있습니다. 기본적으로는 키만 얻어지기 때문에, 값은 대괄호를 이용해서 접근해야 합니다.

>>> user = {"name": "사용자", "email": "user@test.com", "age": 25}
>>> for key in user:
...     print(f"{key}: {user[key]}")
...
name: 사용자
email: user@test.com
age: 25

하지만 items() 메서드를 활용하면 키와 값을 터플의 형태로 한 번에 얻을 수 있어서 좀 더 깔끔하게 루프문을 작성할 수 있습ㄴ다.

>>> user = {"name": "사용자", "email": "user@test.com", "age": 25}
>>> for key, value in user.items():
...     print(f"{key}: {value}")
...
name: 사용자
email: user@test.com
age: 25

툭정 키가 존재하는 지 확인

in 연산자를 사용하면 특정 키가 사전에 존재하는지도 쉽게 확인 할 수 있습니다.

>>> user = {"name": "사용자", "email": "user@test.com", "age": 25}
>>> "email" in user
True
>>> "mail" in user
False

따라서 if 조건문과도 자연스럽게 함께 사용할 수 있습니다.

>>> if "email" in user:
...     print("email 키는 존재합니다.")
... else:
...     print("email 키를 사전에서 찾을 수 없습니다.")
...
email 키는 존재합니다.

사전 병합

여러 개의 사전을 합쳐야할 때는 ** 연산자를 사용하여, 중괄호 안에 합칠 사전들을 쉼표(,)로 구분하여 나열하면 됩니다.

>>> dic1 = {"A": 1, "B": 2}
>>> dic2 = {"B": 3, "C": 4}
>>> { **dic1, **dic2 }
{'A': 1, 'B': 3, 'C': 4}

Python 3.9 버전부터는 대신에 | 연산자를 사용해서 좀 더 깔끔하게 여러 개의 사전을 병합할 수 있습니다.

>>> dic1 | dic2
{'A': 1, 'B': 3, 'C': 4}

사전 반영

하나의 사전에 다른 사전의 모든 데이터를 반영하고 싶을 때는 사전의 update() 메서드를 사용할 수 있습니다.

>>> dic1 = {"A": 1, "B": 2}
>>> dic2 = {"B": 3, "C": 4}
>>> dic1.update(dic2)
>>> dic1
{'A': 1, 'B': 3, 'C': 4}

단순 병합과 달리 다른 사전에 데이터가 반영되면서 기본 사전에 있는 데이터가 변경되는 부분 주의 바라겠습니다.

마찬가지로 Python 3.9 버전에서 사전에 추가된 | 연산자를 활용해서 같은 효과를 낼 수도 있습니다.

>>> dic1 = {"A": 1, "B": 2}
>>> dic2 = {"B": 3, "C": 4}
>>> dic1 |= dic2
>>> dic1
{'A': 1, 'B': 3, 'C': 4}

마치면서

이상으로 사전(dictionary) 데이터 타입의 특징과 사용 방법에 대해서 실전에서 많이 쓰이는 것 위주로 간단히 살펴 보았습니다. 파이썬에서 정말 다양하게 사용되는 내장 데이터 타입인 만큼 사용법을 숙지해두시면 큰 도움이 되실 거라 생각합니다.





최신 포스트


Engineering Blog  by Dale Seo