🗄️ 데이터센터
home
주식거래 데이터
home
🗝️

딕셔너리 사용법

딕셔너리의 중요성

딕셔너리(Dictionary)는 파이썬 프로그래밍에서 가장 유용하고 강력한 자료구조 중 하나입니다. 키(key)값(value)의 쌍으로 데이터를 저장하는 딕셔너리는 데이터의 빠른 검색수정을 가능하게 합니다. 마치 실제 사전에서 단어()를 찾으면 그 의미()를 얻을 수 있는 것처럼, 딕셔너리에서도 키를 통해 원하는 값에 즉시 접근할 수 있습니다. 이는 리스트튜플과 달리 순차적으로 데이터를 검색할 필요가 없어 매우 효율적입니다. 또한 키-값 쌍의 추가, 수정, 삭제가 자유로워 동적인 데이터 관리에 특히 적합합니다.
딕셔너리는 영어로 'Dictionary'를 줄여서 'Dict'라고도 부르며, 파이썬 코드에서는 주로 'dict'라고 표기합니다. 이는 파이썬의 내장 자료형 이름이기도 하며, 변수명이나 주석에서 자주 사용되는 약어입니다.

딕셔너리 사용법

파이썬의 딕셔너리JSON(JavaScript Object Notation)과 매우 유사한 구조를 가지고 있습니다. JSON이 웹에서 데이터를 주고받을 때 널리 사용되는 데이터 형식인 것처럼, 딕셔너리도 파이썬에서 구조화된 데이터를 다룰 때 가장 많이 사용되는 자료구조입니다.
두 형식 모두 키-값 쌍을 사용하여 데이터를 저장하며, 중첩된 구조를 만들 수 있다는 공통점이 있습니다. 실제로 파이썬에서 JSON 데이터를 다룰 때는 딕셔너리로 변환하여 작업하는 것이 일반적입니다. 기본 조작법들은 웹 개발이나 데이터 처리 작업에서 매우 자주 사용되므로, 이를 잘 이해하고 익히는 것이 중요합니다.

1. 딕셔너리 생성하기

1) 기본생성

딕셔너리는 중괄호 {}를 사용하여 생성하며, 키와 값은 콜론(:)으로 구분합니다.
# 빈 딕셔너리 생성 my_dict = {} # 초기값을 가진 딕셔너리 생성 student = { "name": "김철수", "age": 20, "grade": "A" }
Python
복사

2) 복합생성

복합 딕셔너리는 딕셔너리 안에 또 다른 딕셔너리나 리스트 등을 포함하는 중첩된 구조입니다. 이러한 구조는 복잡한 데이터를 체계적으로 관리할 때 유용합니다.
# 중첩된 딕셔너리 생성 school = { "class_1": { "teacher": "김선생", "students": { "student1": {"name": "홍길동", "age": 15}, "student2": {"name": "김영희", "age": 16} } }, "class_2": { "teacher": "이선생", "students": { "student1": {"name": "박철수", "age": 15}, "student2": {"name": "최영희", "age": 16} } } } # 딕셔너리와 리스트의 조합 user_info = { "name": "김철수", "hobbies": ["독서", "운동", "게임"], "scores": { "korean": [90, 85, 88], "math": [95, 92, 90] } }
Python
복사

2. 딕셔너리 접근하기

1)기본접근법

딕셔너리의 값에 접근할 때는 대괄호 [] 안에 키를 지정하거나 get() 메서드를 사용합니다.
# 딕셔너리 생성 student = { "name": "김철수", "age": 20 } # 대괄호로 접근 print(student["name"]) # 출력: 김철수 # get() 메서드로 접근 print(student.get("age")) # 출력: 20 # 존재하지 않는 키에 접근시 차이점 print(student.get("grade")) # 출력: None print(student["grade"]) # KeyError 발생!
Python
복사

2) 복합딕셔너리 접근법

복합 딕셔너리의 중첩된 값에 접근할 때는 대괄호나 get() 메서드를 연속해서 사용할 수 있습니다.
# 예시 딕셔너리 school = { "class_1": { "teacher": "김선생", "students": { "student1": {"name": "홍길동", "age": 15} } } } user_info = { "hobbies": ["독서", "운동"], "scores": {"korean": [90, 85, 88]} } # 1. 대괄호로 직접 접근 print(school["class_1"]["teacher"]) # 출력: 김선생 print(user_info["hobbies"][0]) # 출력: 독서 # 2. get() 메서드로 안전하게 접근 # 장점: 키가 없어도 오류가 발생하지 않음 print(school.get("class_1", {}).get("teacher")) # 출력: 김선생 print(school.get("class_3", {}).get("teacher")) # 출력: None # 3. 기본값 설정 # 키가 없을 때 원하는 기본값 반환 print(school.get("class_3", {}).get("teacher", "선생님 없음")) # 출력: 선생님 없음
Python
복사
get() 메서드를 사용하면 존재하지 않는 키에 접근할 때 KeyError 예외가 발생하는 것을 방지할 수 있습니다. 특히 중첩된 구조에서는 이러한 안전한 접근 방식이 유용합니다.

3) get()의 활용성

get() 메서드는 더 유용한 기능을 제공합니다. 존재하지 않는 키에 접근할 때 기본값을 지정할 수 있어서, None 대신 원하는 값을 반환받을 수 있습니다.
# get() 메서드의 기본값 활용 student = {"name": "김철수", "age": 20} # 두 번째 인자로 기본값 지정 print(student.get("grade", "성적 없음")) # 출력: 성적 없음 print(student.get("scores", [])) # 출력: [] print(student.get("contact", { # 복잡한 기본값도 지정 가능 "email": "없음", "phone": "없음" })) # 조건문에서 활용 if student.get("age", 0) > 19: print("성인입니다")
Python
복사
이처럼 get() 메서드의 기본값 기능을 활용하면, 존재하지 않는 키에 대한 예외 처리를 간단히 할 수 있으며, 코드의 안정성을 높일 수 있습니다.

3. 딕셔너리 수정하기

딕셔너리의 값을 수정하거나 새로운 키-값 쌍을 추가할 수 있습니다.
# 값 수정하기 student["age"] = 21 # 새로운 키-값 쌍 추가 student["phone"] = "010-1234-5678" # 값 삭제하기 del student["grade"]
Python
복사
복합 딕셔너리의 구조를 수정할 때는 중첩된 구조를 고려하여 단계적으로 접근해야 합니다.
# 중첩된 값 수정하기 school["class_1"]["teacher"] = "박선생" # 중첩된 구조에 새로운 학생 추가 school["class_1"]["students"]["student3"] = { "name": "이영수", "age": 15 } # 리스트가 포함된 딕셔너리 수정 user_info["hobbies"].append("그림") user_info["scores"]["korean"].append(92) # 중첩된 값 삭제하기 del school["class_1"]["students"]["student2"] # update() 메서드를 사용한 여러 값 동시 수정 school["class_1"].update({ "teacher": "정선생", "room": "301호" })
Python
복사
복합 딕셔너리를 수정할 때는 존재하지 않는 키에 접근하지 않도록 주의해야 합니다. 필요한 경우 키의 존재 여부를 먼저 확인하거나, get() 메서드를 활용하여 안전하게 수정하는 것이 좋습니다.

4. 딕셔너리 수정 시 주의사항

딕셔너리를 수정할 때 가장 중요한 점은 딕셔너리가 가변(mutable) 객체라는 것입니다. 이는 딕셔너리를 수정하면 원본 데이터가 직접 변경된다는 의미입니다. 예를 들어, 한 딕셔너리를 다른 변수에 할당할 때, 실제로는 데이터가 복사되는 것이 아니라 같은 메모리 공간을 참조하게 됩니다. 따라서 어느 한 변수를 통해 딕셔너리를 수정하면, 해당 메모리를 참조하는 모든 변수에서 그 변경사항이 반영됩니다. 이러한 특성은 메모리를 효율적으로 사용할 수 있게 해주지만, 의도치 않은 데이터 변경을 일으킬 수 있으므로 주의가 필요합니다.
# 딕셔너리 복사와 수정 예시 original_dict = {"name": "김철수", "age": 20} reference_dict = original_dict # 참조만 복사됨 reference_dict["age"] = 21 print(original_dict) # 출력: {"name": "김철수", "age": 21} # 원본 딕셔너리도 함께 변경됨 # 올바른 복사 방법 import copy safe_copy = copy.deepcopy(original_dict) # 깊은 복사 safe_copy["age"] = 22 print(original_dict) # 출력: {"name": "김철수", "age": 21} # 원본은 변경되지 않음
Python
복사
따라서 원본 데이터를 보존해야 하는 경우에는 반드시 copy() 메서드나 deepcopy() 함수를 사용하여 딕셔너리를 복사한 후 수정해야 합니다. 특히 중첩된 구조를 가진 딕셔너리의 경우 deepcopy()를 사용하는 것이 안전합니다.

5. 딕셔너리 컴프리헨션

딕셔너리 컴프리헨션(Dictionary Comprehension)은 딕셔너리를 생성하는 간결하고 효율적인 방법입니다. 기존의 반복문을 한 줄로 압축하여 새로운 딕셔너리를 만들 수 있습니다.
# 기본 딕셔너리 컴프리헨션 문법 numbers = [1, 2, 3, 4, 5] squares = {x: x**2 for x in numbers} print(squares) # 출력: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25} # 조건문을 포함한 딕셔너리 컴프리헨션 even_squares = {x: x**2 for x in numbers if x % 2 == 0} print(even_squares) # 출력: {2: 4, 4: 16} # 두 리스트를 딕셔너리로 변환 keys = ['a', 'b', 'c'] values = [1, 2, 3] dict_from_lists = {k: v for k, v in zip(keys, values)} print(dict_from_lists) # 출력: {'a': 1, 'b': 2, 'c': 3}
Python
복사
딕셔너리 컴프리헨션은 가독성성능 모두를 개선할 수 있는 강력한 도구입니다. 하지만 너무 복잡한 로직을 넣으면 오히려 가독성이 떨어질 수 있으므로, 적절한 상황에서 사용하는 것이 중요합니다.
주요 사용 사례
기존 딕셔너리의 키-값 변환
리스트나 다른 이터러블에서 딕셔너리 생성
조건에 따른 필터링과 동시에 딕셔너리 생성

6. 딕셔너리 검색하기

딕셔너리에서 데이터를 검색하는 방법은 크게 세 가지가 있습니다.

1) 기본 검색 방법

# 1. 키로 직접 검색 student = {"name": "홍길동", "age": 20, "grade": "A"} print(student["name"]) # 출력: 홍길동 # 2. get() 메서드로 검색 age = student.get("age") # 20 not_found = student.get("address", "주소 없음") # 기본값 반환 # 3. in 연산자로 키 존재 여부 확인 if "grade" in student: print("학점이 있습니다")
Python
복사

2) 딕셔너리 순회 검색

# 1. 모든 키-값 쌍 순회 for key, value in student.items(): print(f"{key}: {value}") # 2. 키만 순회 for key in student.keys(): print(key) # 3. 값만 순회 for value in student.values(): print(value) # 4. 조건에 맞는 항목 찾기 result = {k: v for k, v in student.items() if isinstance(v, str)}
Python
복사

3) 복합 딕셔너리 검색

# 중첩된 딕셔너리 검색 school = { "class1": { "students": { "student1": {"name": "김철수", "scores": [90, 85, 88]} } } } # 안전한 중첩 검색 score = school.get("class1", {}).get("students", {}).get("student1", {}).get("scores", [])
Python
복사
딕셔너리를 검색할 때는 KeyError를 방지하기 위해 get() 메서드를 사용하는 것이 안전합니다. 특히 중첩된 구조에서는 더욱 중요합니다.

연습만이 성장의 지름길!

코딩직접 해봐야 합니다! colab으로 간단히 연습해 보세요. 프로젝트 전체가 아닌, 작은 코드 조각들을 하나씩 연습하는 것입니다. 이렇게 연습한 조각들이 모여 성공적인 프로젝트가 완성됩니다.