본문 바로가기
프로그래밍/파이썬

파이썬 - 딕셔너리

by ennak 2024. 11. 29.
반응형

Intro

파이썬의 딕셔너리는 키-값 쌍을 저장하는 강력한 자료구조다. 기본적인 사용법을 넘어, 딕셔너리의 고급 기능과 메서드를 이해하면 더욱 효율적이고 우아한 코드를 작성할 수 있다.

1. 딕셔너리 생성 방법

딕셔너리를 생성하는 여러 방법이 있다.

a) 중괄호 사용

my_dict = {'key1': 'value1', 'key2': 'value2'}

이 방식은 가장 기본적이고 직관적이다. 하지만 키가 문자열이 아닌 경우에는 dict() 생성자를 사용하는 것이 더 깔끔하다는 것을 알게 되었다.

b) dict() 생성자 사용

my_dict = dict(key1='value1', key2='value2')

c) 리스트의 튜플로부터 생성

items = [('key1', 'value1'), ('key2', 'value2')]
my_dict = dict(items)

리스트의 튜플로 딕셔너리를 생성하는 방식은 데이터를 변환해야 할 때 자주 사용했다. 특히 데이터베이스 쿼리 결과를 딕셔너리로 변환할 때 이 방법이 유용했다.

d) 딕셔너리 컴프리헨션

my_dict = {x: x**2 for x in range(5)}

컴프리헨션은 정말 강력하다. 한 번은 대량의 데이터를 처리하면서 특정 조건에 맞는 데이터만 필터링해 딕셔너리를 생성해야 했는데, 이 방식 덕분에 코드가 훨씬 간결해졌다.

2. 주요 딕셔너리 메서드

a) get(key[, default])

키가 존재하지 않을 때 에러 대신 기본값을 반환한다.

my_dict = {'a': 1, 'b': 2}
print(my_dict.get('c', 0))  # 출력: 0

컴프리헨션은 정말 강력하다. 한 번은 대량의 데이터를 처리하면서 특정 조건에 맞는 데이터만 필터링해 딕셔너리를 생성해야 했는데, 이 방식 덕분에 코드가 훨씬 간결해졌다.

b) setdefault(key[, default])

키가 존재하면 해당 값을, 없으면 기본값을 설정하고 반환한다.

my_dict = {'a': 1, 'b': 2}
print(my_dict.setdefault('c', 3))  # 출력: 3
print(my_dict)  # 출력: {'a': 1, 'b': 2, 'c': 3}

setdefault()는 초기화 작업에서 유용하다. 한 번은 로그 데이터를 분류하면서 키가 없는 경우 기본 리스트를 추가해야 했는데, 이 메서드 덕분에 코드가 깔끔해졌다.

c) update([other])

다른 딕셔너리나 키-값 쌍으로 현재 딕셔너리를 갱신한다.

my_dict = {'a': 1, 'b': 2}
my_dict.update({'b': 3, 'c': 4})
print(my_dict)  # 출력: {'a': 1, 'b': 3, 'c': 4}

update()는 여러 소스에서 데이터를 병합할 때 유용하다. 한 번은 여러 API에서 받아온 데이터를 하나의 딕셔너리로 합쳐야 했는데, 이 메서드로 쉽게 해결했다.

d) pop(key[, default])

지정된 키의 값을 제거하고 반환한다. 키가 없으면 기본값을 반환한다.

my_dict = {'a': 1, 'b': 2}
print(my_dict.pop('b'))  # 출력: 2
print(my_dict)  # 출력: {'a': 1}

pop()은 데이터를 삭제하면서 동시에 반환받을 수 있어 편리하다. 하지만 한 번 실수로 중요한 데이터를 pop()으로 제거한 적이 있어 이후에는 신중하게 사용하고 있다.

e) popitem()

임의의 키-값 쌍을 제거하고 튜플로 반환한다 (Python 3.7부터는 마지막으로 삽입된 항목)

my_dict = {'a': 1, 'b': 2, 'c': 3}
print(my_dict.popitem())  # 출력: ('c', 3)

popitem()은 LIFO(Last In First Out) 방식으로 동작하기 때문에 스택처럼 사용할 수도 있다. 하지만 순서가 중요하지 않은 경우에만 사용하는 것이 좋다고 느꼈다.

f) keys(), values(), items()

각각 키, 값, 키-값 쌍의 뷰를 반환한다.

my_dict = {'a': 1, 'b': 2}
print(list(my_dict.keys()))    # 출력: ['a', 'b']
print(list(my_dict.values()))  # 출력: [1, 2]
print(list(my_dict.items()))   # 출력: [('a', 1), ('b', 2)]

keys(), values(), items()는 반복문에서 자주 사용한다. 특히 items()는 키와 값을 동시에 처리할 수 있어 편리하다. 한 번은 중첩된 딕셔너리를 순회하면서 이 메서드 덕분에 코드를 간결하게 작성할 수 있었다.

3. 딕셔너리 병합

Python 3.9부터는 | 연산자를 사용하여 딕셔너리를 병합할 수 있다.

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
merged = dict1 | dict2
print(merged)  # 출력: {'a': 1, 'b': 3, 'c': 4}

이전 버전에서는 다음과 같이 할 수 있다.

merged = {**dict1, **dict2}

4. 중첩 딕셔너리

딕셔너리 안에 딕셔너리를 넣어 복잡한 데이터 구조를 만들 수 있다.

nested_dict = {
    'person1': {'name': 'Alice', 'age': 30},
    'person2': {'name': 'Bob', 'age': 25}
}

print(nested_dict['person1']['name'])  # 출력: Alice

중첩된 구조는 JSON 데이터를 다룰 때 자주 접한다. 처음에는 접근 방식이 헷갈렸지만 익숙해지니 복잡한 데이터 구조도 쉽게 관리할 수 있었다.

5. defaultdict 사용하기

collections 모듈의 defaultdict를 사용하면 존재하지 않는 키에 대해 기본값을 자동으로 생성할 수 있다.

from collections import defaultdict

word_count = defaultdict(int)
words = ['apple', 'banana', 'apple', 'cherry']

for word in words:
    word_count[word] += 1

print(dict(word_count))  # 출력: {'apple': 2, 'banana': 1, 'cherry': 1}

6. OrderedDict 사용하기

Python 3.7 이전 버전에서 순서가 보장된 딕셔너리가 필요한 경우 OrderedDict를 사용할 수 있다.

from collections import OrderedDict

ordered = OrderedDict()
ordered['a'] = 1
ordered['b'] = 2
ordered['c'] = 3

print(list(ordered.keys()))  # 출력: ['a', 'b', 'c']

7. 딕셔너리 컴프리헨션 활용

복잡한 딕셔너리를 생성할 때 컴프리헨션을 활용하면 코드를 간결하게 만들 수 있다.

squares = {x: x**2 for x in range(10)}
print(squares)  # 출력: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares)  # 출력: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}

8. 딕셔너리를 이용한 스위치 케이스 구현

파이썬에는 switch-case 문이 없지만, 딕셔너리를 사용하여 비슷한 기능을 구현할 수 있다.

def add(x, y):
    return x + y

def subtract(x, y):
    return x - y

operations = {
    'add': add,
    'subtract': subtract
}

result = operations['add'](5, 3)
print(result)  # 출력: 8

9. 딕셔너리 정렬

딕셔너리를 키나 값을 기준으로 정렬할 수 있다.

my_dict = {'b': 2, 'a': 1, 'c': 3}

# 키를 기준으로 정렬
sorted_by_key = dict(sorted(my_dict.items()))
print(sorted_by_key)  # 출력: {'a': 1, 'b': 2, 'c': 3}

# 값을 기준으로 정렬
sorted_by_value = dict(sorted(my_dict.items(), key=lambda item: item[1]))
print(sorted_by_value)  # 출력: {'a': 1, 'b': 2, 'c': 3}

10. 딕셔너리 복사

딕셔너리를 복사할 때는 얕은 복사와 깊은 복사를 구분해야 한다.

import copy

original = {'a': [1, 2, 3], 'b': [4, 5, 6]}

# 얕은 복사
shallow_copy = original.copy()
shallow_copy['a'][0] = 10
print(original['a'])  # 출력: [10, 2, 3]

# 깊은 복사
deep_copy = copy.deepcopy(original)
deep_copy['a'][0] = 20
print(original['a'])  # 출력: [10, 2, 3]

11. 딕셔너리 언패킹

함수 호출 시 딕셔너리를 언패킹하여 인자로 전달할 수 있다.

def print_info(name, age, city):
    print(f"{name} is {age} years old and lives in {city}")

info = {'name': 'Alice', 'age': 30, 'city': 'New York'}
print_info(**info)  # 출력: Alice is 30 years old and lives in New York

12. 딕셔너리 뷰 객체 활용

keys(), values(), items() 메서드가 반환하는 뷰 객체는 딕셔너리의 변경사항을 실시간으로 반영한다.

my_dict = {'a': 1, 'b': 2}
keys = my_dict.keys()
print(keys)  # 출력: dict_keys(['a', 'b'])

my_dict['c'] = 3
print(keys)  # 출력: dict_keys(['a', 'b', 'c'])
반응형

'프로그래밍 > 파이썬' 카테고리의 다른 글

파이썬 - 불변(Immutable)과 가변(Mutable) 객체  (0) 2024.11.29
파이썬 - Set  (0) 2024.11.29
파이썬 - 제너레이터  (0) 2024.11.28
파이썬 - 컴프리헨션  (0) 2024.11.27
파이썬 - 튜플 개념 정리  (0) 2024.11.26