
딕셔너리(Dictionary)란
파이썬에서 dictionary는 key: value 쌍 으로 이루어진 자료구조. 해시 테이블로 구현되어있어 효율적으로 키를 통해 값을 조회할 수 있음
장단점
기본적으로 해시테이블의 장단점과 거의 같다
- 장점
- 평균적으로 데이터 접근/ 삽입 속도가 O(1)
- 키로 직관적인 접근이 가능
- 단점
- 해시테이블 구조를 사용하기때문에 메모리 사용량이 많아질 수 있다.
- 해시 충돌로 인해 최악의 경우 복잡도는 O(n)
문법 선 요약
- 접근(조회): my_dict[키], my_dict.get(키[, 기본값])
- 값 할당(추가/수정): my_dict[키] = 값
- 삭제: del my_dict[키], my_dict.pop(키[, 기본값])
- 검색 메서드: my_dict.keys(), my_dict.values(), my_dict.items()
- 병합: my_dict.update(다른_dict)
- 복사: my_dict.copy() (얕은 복사)
- 전체 삭제: my_dict.clear()
- 키 확인: if 키 in my_dict:
딕셔너리 생성
- 중괄호 {} 사용
my_dict = {key : value}
my_dict = {
"이름": "홍길동",
"나이": 25,
"취미": ["독서", "게임"]
}
- dict() 함수 사용
- 키워드 인자(예제에서는 name, age)로 정의
my_dict = dict(name = "홍길동" , age = "25")- 튜플 리스트(key, value)로 정의
my_dict = dict([(key, value),(key, value), ...]) my_dict = dict([ ("이름", "홍길동"), ("나이", "25") ])
접근 및 수정
접근(조회)
- my_dict[key]
- 키가 존재하지 않을 경우
KeyError발생
- 키가 존재하지 않을 경우
- my_dicy.get(key, 기본값)
- 키가 없으면 기본값을 반환하고, 있으면 해당 값을 반환
- 안전하게 접근할 때 자주 사용됨 (에러 대신 기본값 반환)
my_dict = {"name": "Alice", "age": 25}
# 1) 대괄호 []를 통한 접근
print(my_dict["name"]) # "Alice"
# 2) get() 메서드를 통한 접근
print(my_dict.get("age")) # 25
print(my_dict.get("address")) # None (키가 없으므로 기본값이 None)
print(my_dict.get("address", "No Address")) # "No Address"
값 할당(추가/수정)
- my_dict[키] = 새로운_값
- 키가 없으면 새로운 키-값 쌍을 추가
- 키가 이미 있으면 기존 키의 값을 수정
my_dict = {"name": "Alice", "age": 25} # 1) 새로운 키-값 쌍 추가 my_dict["address"] = "Wonderland" print(my_dict) # {"name": "Alice", "age": 25, "address": "Wonderland"} # 2) 기존 키의 값 수정 my_dict["age"] = 26 print(my_dict) # {"name": "Alice", "age": 26, "address": "Wonderland"}
삭제
- del my_dict[키]
- 해당 키-값 쌍을 삭제
my_dict = {"name": "Alice", "age": 25, "address": "Wonderland"} del my_dict["address"] print(my_dict) # {"name": "Alice", "age": 25} - my_dict.pop(키[, 기본값])
- 키가 존재하면
삭제 후 값을 반환 - 기본값을 지정하면 키가 없을 때 그 기본값을 반환 (지정 안 하면
KeyError)
my_dict = {"name": "Alice", "age": 25} removed_value = my_dict.pop("age") print(removed_value) # 25 print(my_dict) # {"name": "Alice"} # 기본값을 지정한 경우 result = my_dict.pop("address", "No Address") print(result) # "No Address" print(my_dict) # {"name": "Alice"} - 키가 존재하면
키/값/아이템 확인
- my_dict.keys() : 딕셔너리의 모든 키를 반환
my_dict = {"name": "Alice", "age": 25, "address": "Wonderland"}
print(my_dict.keys())
# dict_keys(['name', 'age', 'address'])
for key in my_dict.keys():
print(key)
# name
# age
# address
- my_dict.values() : 모든 값을 반환
my_dict = {"name": "Alice", "age": 25, "address": "Wonderland"}
print(my_dict.values())
# dict_values(['Alice', 25, 'Wonderland'])
for val in my_dict.values():
print(val)
# Alice
# 25
# Wonderland
- my_dict.items() : (키, 값) 형태의 튜플들을 반환
my_dict = {"name": "Alice", "age": 25, "address": "Wonderland"}
print(my_dict.items())
# dict_items([('name', 'Alice'), ('age', 25), ('address', 'Wonderland')])
for key, value in my_dict.items():
print(key, value)
# name Alice
# age 25
# address Wonderland
딕셔너리 병합
- my_dict.update(other_dict) : other_dict의 키-값 쌍을 현재 딕셔너리에 병합하거나 덮어씀
my_dict = {"name": "Alice", "age": 25}
another_dict = {"age": 30, "address": "Wonderland"}
my_dict.update(another_dict)
print(my_dict)
# {"name": "Alice", "age": 30, "address": "Wonderland"}
in 연산자
- if 키 in my_dict: : 딕셔너리에 해당 키가 존재하는지 확인 (존재유무 판별)
my_dict = {"name": "Alice", "age": 25}
if "name" in my_dict:
print("name 키가 존재합니다.")
if "address" not in my_dict:
print("address 키가 없습니다.")
복사
- copy_dict = my_dict.copy() : 얕은 복사(shallow copy)
import copy
my_dict = {"name": "Alice", "hobbies": ["reading", "gaming"]}
copy_dict = my_dict.copy()
# 얕은 복사이므로 리스트(가변 객체)까지는 그대로 참조를 공유함
copy_dict["hobbies"].append("coding")
print(my_dict)
# {"name": "Alice", "hobbies": ["reading", "gaming", "coding"]}
print(copy_dict)
# {"name": "Alice", "hobbies": ["reading", "gaming", "coding"]}
# 만약 완전히 분리된 복사를 원한다면
deep_copy_dict = copy.deepcopy(my_dict)
- (참고) 깊은 복사 시에는 copy 모듈의 deepcopy() 활용
비우기
- my_dict.clear() : 모든 키-값 쌍 제거
my_dict = {"name": "Alice", "age": 25, "address": "Wonderland"}
my_dict.clear()
print(my_dict)
# {}728x90
'WIL' 카테고리의 다른 글
| H2가 MySQL, PostgreSQL와의 차이 (0) | 2025.06.19 |
|---|---|
| 개발 환경에서 프론트-백 서버 분리 이유 (0) | 2025.06.19 |
| 크래프톤 정글 학습 13주차: Spring Boot로 CRUD 게시판 API 서버 구축기 (0) | 2025.06.18 |