본문 바로가기
Python

파이썬의 딕셔너리 dict() 함수의 개념과 활용

by 산코디 2024. 5. 8.

파이썬에서 딕셔너리는 다양한 데이터 처리 작업을 하는데 매우 유용한 자료구조다. 보통 dict() 함수를 사용하여 딕셔너리 객체를 다루며, 다양한 형태의 데이터를 효율적으로 저장하고 조회하는 데 사용된다. 파이썬에서 딕셔너리는 매우 중요한 개념이다. 그러한 만큼 개념과 함께 딕셔너리를 학습하고 숙지하는 것이 좋다.

간단하게 개념부터 하나씩 살펴보고 활용하는 방법까지 정리해보자.




딕셔너리의 개념

파이썬의 딕셔너리(dictionary)는 키와 값의 쌍으로 데이터를 손쉽게 저장하는 자료구조다.

키-값 쌍
딕셔너리는 중괄호 안에 콤마( , )로 구분된 키, 값 쌍으로 이루어져 있다. 각 키는 유일해야 하고, 값은 중복될 수 있다.

속도
딕셔너리는 내부적으로 해시 테이블(hash table)로 구성되어 있고, 그렇기 때문에 키를 사용하여 값에 빠르게 접근할 수 있다. 일반 배열과는 다르게 값을 찾는 속도가 빠르다고 볼 수 있다.

가변성
딕셔너리는 크기가 가변적이기 때문에 필요에 따라 값을 추가하거나 삭제할 수 있다.

활용성
딕셔너리는 다양한 데이터 처리 작업에 활용된다. 예를 들어, 데이터의 그룹화, 빠른 조회와 검색, 키를 기반으로 한 데이터의 가공 처리 등이 있다.

유연성
딕셔너리는 숫자, 문자열, 리스트, 튜플 등 다양한 자료형을 저장할 수 있다.

정리한 바와 같이 딕셔너리는 매우 중요한 자료구조임을 알 수 있고, 그 중에서 특히 키-값 쌍으로 이루어져 조회 시 속도가 매우 빠르다는 것이 큰 장점이라고 생각한다. 또한 속도가 빠르기 때문에 대용량 데이터 처리를 하는 작업에도 매우 적합하다고 할 수 있다.



dict() 함수란?

dict() 함수는 파이썬의 내장 함수로 딕셔너리를 생성하는 데 주로 사용된다. 보통 딕셔너리는 중괄호 {}를 사용하여 생성하지만, dict() 함수를 사용하면 다양한 데이터 구조로부터 딕셔너리를 생성할 수 있다.


키-값 쌍 리스트
키-값 쌍 리스트를 dict()로 전달하여 딕셔너리를 생성할 수 있다.

my_dict = dict([('apple', 5), ('banana', 3), ('orange', 7)])

위의 코드와 같이 튜플로 이루어진 리스트를 딕셔너리에 전달하면 각 요소별로 첫 번째 인자는 키, 두 번째 인자는 값으로 생성된다.


키워드 인자
또한 dict() 함수는 키워드 인자로 전달하는 방법이 있다.

my_dict = dict(apple=5, banana=3, orange=7)

위와 같이 키워드 인자(apple, banana, orange)는 키가 되고, 값(5, 3, 7)은 해당 키의 값이 된다.


다른 딕셔너리 참조
dict() 함수의 또 다른 기능 중 하나는 먼저 생성된 다른 딕셔너리를 전달하게 되면 해당 딕셔너리를 복사하여 새로운 딕셔너리를 생성할 수 있다.

existing_dict = {'apple': 5, 'banana': 3, 'orange': 7}
new_dict = dict(existing_dict)

위와 같이 existing_dict이라는 변수에 딕셔너리 형태의 데이터를 먼저 생성한 후, dict() 함수를 통해 새로운 딕셔너리를 생성할 수 있다.




딕셔너리의 활용

위에서 dict() 함수를 사용하여 간단한 사용 방법을 알아봤는데, 실제 업무에서 dict() 함수를 사용하려면 조금 더 활용 가능한 기능들을 활용하는 것이 좋다.


키와 값 추출
딕셔너리를 사용할 때에는 내장 함수를 통해서 키와 값을 각각 다양하게 호출하여 활용할 수 있다.

keys()
# 딕셔너리 생성
fruit_prices = {'apple': 1000, 'banana': 1500, 'orange': 1200}

# 딕셔너리의 키를 추출하여 리스트로 변환
keys_list = list(fruit_prices.keys())

# 추출된 키 출력
print("딕셔너리의 키:")
print(keys_list)

위의 코드는 딕셔너리의 keys() 함수를 활용하여 키값만 배열로 추출하는 예제다. 업무 개발을 하다 보면 키값만 추출해서 처리해야 하는 경우가 상당히 많다. 위와 같이 딕셔너리 구조라면 내장 함수로 keys()를 호출할 수 있고, 해당 함수를 통해서 간단하게 키값을 추출하여 처리가 가능하다.

values()
# 딕셔너리 생성
fruit_prices = {'apple': 1000, 'banana': 1500, 'orange': 1200}

# 딕셔너리의 값들을 추출하여 리스트로 변환
values_list = list(fruit_prices.values())

# 추출된 값들 출력
print("딕셔너리의 값들:")
print(values_list)

키와 마찬가지로 그에 해당하는 값들도 추출이 가능하다. values() 내장 함수를 사용하면 값들만 배열로 추출할 수 있다.

items()
# 딕셔너리 생성
fruit_prices = {'apple': 1000, 'banana': 1500, 'orange': 1200}

# 딕셔너리의 키-값 쌍을 추출하여 리스트로 변환
items_list = list(fruit_prices.items())

# 추출된 키-값 쌍 출력
print("딕셔너리의 키-값 쌍:")
print(items_list)

위의 코드는 키-값 쌍을 모두 포함시켜 튜플 구조의 배열로 추출이 가능하다. 딕셔너리의 내장 함수인 items()를 사용하면 가능한데, 튜플 형태의 리스트로 추출하게 되면 for문을 사용하여 반복 작업 처리를 할 수 있다.
(물론 keys(), values() 함수들도 마찬가지로 반복 작업이 가능하다)


딕셔너리의 결합
딕셔너리는 두 개 이상의 딕셔너리를 하나로 결합하여 처리할 수 있다.

# 첫 번째 딕셔너리
dict1 = {'apple': 1000, 'banana': 1500}

# 두 번째 딕셔너리
dict2 = {'orange': 1200, 'grape': 2000}

# 두 딕셔너리 결합
dict1.update(dict2)

# 결합된 딕셔너리 출력
print(dict1)

위의 코드는 두 개의 딕셔너리를 하나의 딕셔너리로 결합하는 예제 코드다. 코드를 보게 되면 dict1.update(dict2)와 같이 dict1에 dict2를 결합하는 구조로 작성이 되어 있는데,
dict2가 dict1로 결합이 된다고 보면 된다.

딕셔너리의 결합은 두 개 이상의 딕셔너리 데이터를 하나로 합치면서 데이터를 통합할 때 용이하고, 코드 또한 간결해진다. 그리고 결합하면서 중복된 데이터도 제거되는 효과가 있다.

대용량 데이터 처리를 할 때 매우 유용해 보인다.


딕셔너리의 정렬
딕셔너리는 키나 값을 기준으로 정렬을 할 수 있다. 배열이나 딕셔너리와 같은 자료구조에서 정렬은 매우 중요하다. 정렬되지 않은 데이터는 가독성이 떨어지고 활용도도 떨어지기 때문에 정렬하는 방법을 알아두는 것은 매우 중요하다.

키 정렬
# 딕셔너리 생성
fruit_prices = {'apple': 1000, 'banana': 1500, 'orange': 1200}

# 키를 기준으로 정렬
sorted_dict_keys = dict(sorted(fruit_prices.items()))

# 정렬된 딕셔너리 출력
print(sorted_dict_keys)

위와 같이 sorted() 함수를 활용하면 정렬이 가능하다. 함수의 매개변수로 딕셔너리의 items()를 호출하여 전달하면 키값을 기본으로 정렬시켜 준다.

값 정렬
# 딕셔너리 생성
fruit_prices = {'apple': 1000, 'banana': 1500, 'orange': 1200}

# 값으로 정렬
sorted_dict_values = dict(sorted(fruit_prices.items(), key=lambda x: x[1]))

# 정렬된 딕셔너리 출력
print(sorted_dict_values)

값을 기준으로 정렬을 하고자 할 때에는 람다를 활용한 약간의 연산이 필요하다.
dict(sorted(fruit_prices.items(), key=lambda x: x[1]))
위의 코드에서 fruit_prices.items()에서 반환된 배열의 두 번째 인자가 값에 해당하는데, lambda를 이용해서 정렬 기준 key를 잡아주면 된다.

보통은 키값을 기준으로 정렬하는 경우가 많지만, 종종 값에 따라서 정렬을 해야 하는 경우도 있으니 위와 같이 응용하는 방법을 숙지하면 좋을 것 같다.


JSON과 상호 변환
보통 파이썬의 딕셔너리는 JSON과 매우 유사한 형태를 하고 있다. 형태는 유사하지만 사용 용도가 다르기 때문에 외부 시스템이나 API를 연동하는 경우에는 JSON 형태로 상호 변환해줘야 한다.

딕셔너리를 JSON으로 변환
import json

# 딕셔너리 생성
fruit_prices = {'apple': 1000, 'banana': 1500, 'orange': 1200}

# 딕셔너리를 JSON으로 변환
json_data = json.dumps(fruit_prices)

# JSON 데이터 출력
print(json_data)

우선 딕셔너리 형태의 데이터를 JSON으로 변경하려면 json 내장 라이브러리를 import 시켜줘야 한다.
그리고 라이브러리에서 제공하는 dumps() 함수를 사용하면  간단하게 JSON 형태로 변환이 가능하다.
이와 같은 경우는 외부 시스템이나 API로 데이터를 내보낼 때 사용하기에 적절하다.

JSON을 딕셔너리로 변환
import json

# JSON 데이터
json_data = '{"apple": 1000, "banana": 1500, "orange": 1200}'

# JSON을 딕셔너리로 변환
fruit_prices = json.loads(json_data)

# 딕셔너리 출력
print(fruit_prices)

위의 코드는 반대로 JSON 형태의 데이터를 딕셔너리로 변환하는 예제다. 동일하게 json 라이브러리를 참조하고 있으며, loads() 함수를 사용하면 된다.
이 예제와 같은 경우는 보통 외부에서 JSON 구조로 데이터를 받았을 경우 활용하기 좋은 예제다.

파이썬 내에서는 보통 딕셔너리 구조로 작업을 하지만 외부와 연동하는 경우에는 일반적으로 JSON 구조로 변환하여 연동하는 것이 좋다.


딕셔너리의 컴프리헨션
딕셔너리의 컴프리헨션은 반복문과 조건문을 사용하여 딕셔너리를 생성하는 방법이다.

for문
# 알파벳을 키로, 해당 알파벳의 ASCII 코드를 값으로 가지는 딕셔너리 생성
alpha_dict = {char: ord(char) for char in 'abcdefghijklmnopqrstuvwxyz'}

우선 for문을 이용하여 딕셔너리를 생성하는 예제다. 위의 코드와 같이 딕셔너리를 생성할 때, 내부를 보게 되면 for in 문법을 이용해서 알파벳을 아스키코드로 변환하여 딕셔너리를 구성하는 예제다.
키에 해당하는 요소는 알파뱃의 원본 값이 되고, 값에 해당하는 요소는 아스키 코드 값이 된다.

실행 결과

{'a': 97, 'b': 98, 'c': 99, 'd': 100, 'e': 101, 'f': 102, 'g': 103, 'h': 104, 'i': 105, 'j': 106, 'k': 107, 'l': 108, 'm': 109, 'n': 110, 'o': 111, 'p': 112, 'q': 113, 'r': 114, 's': 115, 't': 116, 'u': 117, 'v': 118, 'w': 119, 'x': 120, 'y': 121, 'z': 122}

 

if문
# 주어진 딕셔너리에서 값이 짝수인 키-값 쌍을 추출하여 새로운 딕셔너리 생성
num_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
even_dict = {key: value for key, value in num_dict.items() if value % 2 == 0}

위의 코드는 딕셔너리를 생성할 때 if문을 포함하여 특정 값만 골라 생성하는 예제다.
for문을 순회하면서 값이 조건에 부합하는지 체크하고 부합하는 값만 딕셔너리에 포함시켜 주게 된다.
if value % 2 == 0
위의 코드와 같이 값이 짝수인지 체크하고 있다.

실행 결과

{'b': 2, 'd': 4}

 


딕셔너리 사용 시 주의사항

파이썬의 딕셔너리는 활용도가 매우 높은 강력한 자료구조다. 활용도가 높은 만큼 특성을 정확히 알고 사용하는 것이 중요하며, 잘못 사용한다면 메모리 사용량과 값의 변경 등 이슈가 발생할 수 있다.


키의 불변성
딕셔너리의 키는 불변해야 한다. 키가 기준이 되기 때문에 키가 변경되지 않아야 한다.

중복 키
딕셔너리는 키를 기준으로 요소를 구성하기 때문에 중복을 허용하지 않는다. 딕셔너리 형태로 변환하고자 하는 데이터가 키로 사용하려는 요소의 중복 가능성이 있는지 확인해야 하고, 중복되는 경우에는 마지막에 할당된 요소의 값이 저장되므로 유의해서 사용해야 한다.

값의 접근
딕셔너리의 값에 접근하고자 할 때 해당 딕셔너리 내에 존재하지 않는 키로 접근하게 되면 keyError가 발생할 수 있다. 그렇기 때문에 딕셔너리에 키가 존재하는지 확인하고 값에 접근하는 것이 좋다.

순서
파이썬 버전 3.7 이후부터는 딕셔너리 삽입 순서가 유지되지만, 이전 버전에서는 순서 보장이 되지 않는다. 그렇기 때문에 딕셔너리의 순서가 중요한 경우에는 파이썬의 버전을 확인하고 사용하는 것이 좋다.




마무리

파이썬은 러닝 커브가 낮으면서 활용도가 매우 높은 언어라고 생각한다. 딕셔너리와 같은 자료구조를 통해서 데이터를 처리하는 것도 유용한 것 같다. 실제로 업무에서도 딕셔너리 기반으로 개발을 많이 해왔고, 웹 서비스에서 전달받은 JSON 데이터의 호환성도 매우 좋았다. 그러나 주의사항들도 몇 가지 정리하면서 정확히 숙지하고 써야 될 것 같다고 생각했다.
파이썬은 학습이 쉬운 만큼 깊이 있게 공부를 해야 할 것 같다.

반응형