파이썬 딕셔너리 / 파이썬 dict / python 딕셔너리 / python dict
파이썬 딕셔너리는 키(key)와 값(value)의 쌍으로 데이터를 저장하는 자료구조입니다.
리스트나 튜플처럼 순차적인 인덱스가 아닌 고유한 키를 사용하여 데이터를 저장하고 검색하는데 사용됩니다.
이러한 특징으로 인해 딕셔너리는 데이터를 빠르게 검색하고 관리할 수 있는 장점을 가지고 있습니다.
1. 파이썬 딕셔너리란?
- 소개
- 딕셔너리의 개념과 활용 목적
- 키-값 쌍의 구조
- 딕셔너리의 생성
- 중괄호를 사용한 생성
- dict() 생성자 활용
- 키(key)와 값(value)의 데이터 타입
- 기본적인 딕셔너리 연산
- 특정 키(key)로 값(value) 접근하기
- 값(value) 수정하기
- 키-값 추가 및 삭제
2. 딕셔너리의 활용
- 반복문과 딕셔너리
- 'for' 루프로 딕셔너리 순회하기
- '.keys()', '.values()', '.items()' 활용
- 딕셔너리 메서드
- '.get()' 메서드로 안전한 값(value) 접근
- '.pop()' 메서드로 키-값 제거
- '.update()' 메서드로 딕셔너리 업데이트
- 중첩 딕셔너리
- 딕셔너리 안에 딕셔너리 사용하기
- 다차원 데이터 표현
3. 고급 딕셔너리 활용
- 딕셔너리 컴프리센션
- 딕셔너리 컴프리헨션 구문과 활용
- 딕셔너리 정렬
- 키(key)를 기준으로 오름차순 / 내림차순 정렬
- 값(value) 기준으로 정렬
- 딕셔너리 병합
- 'collections' 모듈의 'ChainMap' 활용
- '.update()' 메서드 대신 병합 방법
4. 활용 예시
- 실전 예제
- 단어 빈도수 세기
- 사용자 데이터 관리
- 중첩 딕셔너리 활용한 데이터 구조
- JSON과 딕셔너리 변환
- JSON 형식과의 유사성
- 'json' 모듈을 활용한 변환
5. 주의사항과 유의점
- 해시 가능한 키
- 키(key)의 해시(hash) 가능성 요구사항
- 불변(immutable) 키(key)와 가변(mutable) 키(key)
- 메모리 사용량
- 딕셔너리의 메모리 관리
- 큰 데이터셋에서의 성능 고려 사항
- 키(key) 중복
- 키(key)의 유일성
1. 파이썬 딕셔너리란?
1.1 소개
파이썬 딕셔너리는 키(key)와 값(value)의 쌍으로 데이터를 저장하는 자료구조입니다.
리스트나 튜플처럼 순차적인 인덱스가 아닌 고유한 키를 사용하여 데이터를 저장하고 검색하는데 사용됩니다.
이러한 특징으로 인해 딕셔너리는 데이터를 빠르게 검색하고 관리할 수 있는 장점을 가지고 있습니다.
1.2 딕셔너리 생성
딕셔너리는 중괄호 {}를 사용하여 생성할 수 있습니다.
각 키-값 쌍은 콜론 :으로 구분하며, 각 쌍은 쉼표로 구분됩니다.
# 중괄호를 사용한 딕셔너리 생성
student_scores = {'Alice': 85, 'Bob': 72, 'Charlie': 90}
print(student_scores) # 출력: {'Alice': 85, 'Bob': 72, 'Charlie': 90}
# dict() 생성자를 사용한 딕셔너리 생성
employee_info = dict(name='John', age=30, department='HR')
print(employee_info) # 출력: {'name': 'John', 'age': 30, 'department': 'HR'}
1.3 기본적인 딕셔너리 연산
딕셔너리에서 값(value)을 검색하려면 해당 키(key)를 사용하여 접근할 수 있습니다.
또한 딕셔너리에 새로운 키-값 쌍을 추가하거나 기존의 값(value)을 수정하거나 삭제할 수 있습니다.
student_scores = {'Alice': 85, 'Bob': 80, 'David': 78}
# 값 접근하기
print(student_scores['Alice']) # 출력: 85
# 값 수정하기
student_scores['Bob'] = 100
print(student_scores['Bob']) # 출력: 100
# 새로운 값 추가하기
student_scores['Danny'] = 250
print(student_scores) # 출력: {'Alice': 85, 'Bob': 100, 'David': 78, 'Danny':250}
# 값 삭제하기
del student_scores['David']
print(student_scores) # 출력: {'Alice': 85, 'Bob': 100, 'Danny':250}
# 모두 지우기
student_scores.clear()
print(student_scores) # 출력: {}
2. 딕셔너리의 활용
2.1 반복문과 딕셔너리
딕셔너리의 항목을 반복문을 사용하여 순회할 수 있습니다.
for 루프를 통해 딕셔너리의 키(key), 값(value) 또는 키-값 쌍을 간편하게 순회할 수 있습니다.
student_scores = {'Alice': 85, 'Bob': 80, 'David': 78}
# 키 순회
for name in student_scores:
print(name)
# 출력:
Alice
Bob
David
# 값 순회
for score in student_scores.values():
print(score)
# 출력:
85
80
78
# 키-값 쌍 순회
for name, score in student_scores.items():
print(f'{name}: {score}')
# 출력:
Alice: 85
Bob: 80
David: 78
2.2 딕셔너리 메서드
딕셔너리는 여러 가지 유용한 메서드를 제공하여 데이터를 관리할 수 있습니다.
- .get(): 특정 키(key)의 값(value)을 안전하게 가져올 수 있습니다.
- .pop(): 특정 키-값 쌍을 제거하고 해당 값(value)을 반환합니다.
- .update(): 기존 딕셔너리에 키-값 쌍을 추가하거나 기존 값(value)을 업데이트합니다.
student_scores = {'Alice': 85, 'Bob': 80, 'David': 78}
# .get() 메서드로 값 접근하기
# 딕셔너리안에 키가 없을경우 미리 정해둔 값 반환
print(student_scores.get('Alice', 'DDD')) # 출력: 85
print(student_scores.get('Kate', 'PPP')) # 출력: PPP
# .pop() 메서드로 항목 제거하기
# 'Bob' 키와 연결된 값을 반환하고 딕셔너리에서 제거
print(student_scores.pop('Bob')) # 출력: 80
# .update() 메서드로 딕셔너리 업데이트하기
new_scores = {'Eve': 95, 'Alice': 88}
student_scores.update(new_scores) # 기존 딕셔너리에 새로운 키-값 쌍을 추가하거나 기존 값을 업데이트
print(student_scores) # 출력: {'Alice': 88, 'David': 78, 'Eve': 95}
2.3 중첩 딕셔너리
파이썬 딕셔너리는 다른 딕셔너리를 값으로 포함할 수 있는 중첩 구조를 가질 수 있습니다.
이를 중첩 딕셔너리(nested dictionary)라고 합니다.
중첩 딕셔너리를 사용하면 복잡한 데이터 구조를 표현하거나 다양한 정보를 저장할 수 있습니다.
중첩 딕셔너리는 사전처럼 특정 키를 사용하여 내부 딕셔너리에 접근하고 값을 가져올 수 있습니다.
# 중첩 딕셔너리 사용 예시
student_records = {
'Alice': {'age': 25, 'grades': {'math': 90, 'english': 85}},
'Bob': {'age': 22, 'grades': {'math': 78, 'english': 92}}
}
# 다차원 데이터 접근 예시
alice_math_grade = student_records['Alice']['grades']['math']
bob_english_grade = student_records['Bob']['grades']['english']
print(f"Alice의 수학 성적: {alice_math_grade}") # 출력: Alice의 수학 성적: 90
print(f"Bob의 영어 성적: {bob_english_grade}") # 출력: Bob의 영어 성적: 92
3. 고급 딕셔너리 활용
3.1 딕셔너리 컴프리헨션
딕셔너리 컴프리헨션은 리스트 컴프리헨션과 유사한 구문을 사용하여 딕셔너리를 생성하는 방법입니다.
이를 사용하면 반복문을 효율적으로 사용하여 딕셔너리를 생성할 수 있습니다.
# 딕셔너리 컴프리헨션 예시
squared_numbers = {x : x**2 for x in range(1, 6)}
print(squared_numbers) # 결과: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
players = ["Alice", "Dai", "Ele"]
players_indexs = {player : idx for idx, player in enumerate(players)}
print(players_indexs) # 결과: {'Alice': 0, 'Dai': 1, 'Ele': 2}
players = ["Alice", "Dai", "Ele"]
scores = [100, 200, 300]
players_scores = {player : score for player, score in zip(players, scores)}
print(players_scores) # 결과: {'Alice': 100, 'Dai': 200, 'Ele': 300}
3.2 딕셔너리 정렬
딕셔너리를 정렬하는 방법에는 키를 기준으로 정렬하거나 값(value)을 기준으로 정렬할 수 있습니다.
- 키(key)를 기준으로 정렬:
student_scores = {'Alice': 85, 'Bob': 80, 'David': 78}
number_scores = {100: 'A', 350 : 'S', 50: 'C', 999: 'SSS', 70: 'B'}
# 키를 기준으로 오름차순 정렬
sorted_student_scores = dict(sorted(student_scores.items()))
print(sorted_student_scores) # 출력: {'Alice': 85, 'Bob': 80, 'David': 78}
sorted_number_scores = dict(sorted(number_scores.items()))
print(sorted_number_scores) # 출력: {50: 'C', 70: 'B', 100: 'A', 350: 'S', 999: 'SSS'}
# 키를 기준으로 내림차순 정렬
sorted_student_scores = dict(sorted(student_scores.items(), reverse=True))
print(sorted_student_scores) # 출력: {'David': 78, 'Bob': 80, 'Alice': 85}
sorted_number_scores = dict(sorted(number_scores.items(), reverse=True))
print(sorted_number_scores) # 출력: {999: 'SSS', 350: 'S', 100: 'A', 70: 'B', 50: 'C'}
- 값(value)을 기준으로 정렬
student_scores = {'Alice': 85, 'Bob': 80, 'David': 78}
number_scores = {100: 'A', 350 : 'S', 50: 'C', 999: 'SSS', 70: 'B'}
# 값를 기준으로 오름차순 정렬
sorted_student_scores = dict(sorted(student_scores.items(), key=lambda x: x[1]))
print(sorted_student_scores) # 출력: {'David': 78, 'Bob': 80, 'Alice': 85}
sorted_number_scores = dict(sorted(number_scores.items(), key=lambda x: x[1]))
print(sorted_number_scores) # 출력: {100: 'A', 70: 'B', 50: 'C', 350: 'S', 999: 'SSS'}
# 값를 기준으로 내림차순 정렬
sorted_student_scores = dict(sorted(student_scores.items(), key=lambda x: x[1], reverse=True))
print(sorted_student_scores) # 출력: {'Alice': 85, 'Bob': 80, 'David': 78}
sorted_number_scores = dict(sorted(number_scores.items(), key=lambda x: x[1], reverse=True))
print(sorted_number_scores) # 출력: {999: 'SSS', 350: 'S', 50: 'C', 70: 'B', 100: 'A'}
3.3 딕셔너리 병합
두 개 이상의 딕셔너리를 병합하는 방법에는 update() 메서드와 collections 모듈의 ChainMap을 사용하는 방법이 있습니다.
- '.update()' 메서드로 병합:
first_dict = {'a': 1, 'b': 2}
second_dict = {'b': 3, 'c': 4}
first_dict.update(second_dict) # 두 딕셔너리를 병합
print(first_dict) # 결과: {'a': 1, 'b': 3, 'c': 4}
- 'collections.ChainMap'으로 병합:
from collections import ChainMap
first_dict = {'a': 1, 'b': 2}
second_dict = {'b': 3, 'c': 4}
combined_dict = dict(ChainMap(second_dict, first_dict))
print(combined_dict) # 결과: {'a': 1, 'b': 3, 'c': 4}
4. 활용 예시
4.1.1 단어 빈도수 세기
딕셔너리는 텍스트 데이터에서 단어의 빈도수를 쉽게 세는 데 사용될 수 있습니다.
text = "apple banana apple orange banana apple"
word_freq = {}
for word in text.split():
if word in word_freq:
word_freq[word] += 1
else:
word_freq[word] = 1
print(word_freq) # 결과: {'apple': 3, 'banana': 2, 'orange': 1}
4.1.2 사용자 데이터 관리
딕셔너리를 사용하여 사용자 데이터를 관리할 수 있습니다.
users = {}
def add_user(username, email):
if username not in users:
users[username] = {'email': email}
add_user('john_doe', 'john@example.com')
add_user('jane_smith', 'jane@example.com')
print(users)
# 결과: {'john_doe': {'email': 'john@example.com'}, 'jane_smith': {'email': 'jane@example.com'}}
4.1.3 중첩 딕셔너리 활용한 데이터 구조
중첩 딕셔너리를 사용하여 계층적인 데이터 구조를 생성할 수 있습니다.
employees = {
'John': {'age': 30, 'department': 'HR'},
'Alice': {'age': 25, 'department': 'IT'}
}
print(employees)
# 출력: {'John': {'age': 30, 'department': 'HR'}, 'Alice': {'age': 25, 'department': 'IT'}}
4.2.1 JSON 형식과의 유사성
JSON(JavaScript Object Notation)은 데이터 교환 형식으로 널리 사용되며, 파이썬의 딕셔너리와 유사한 구조를 가지고 있습니다.
JSON은 키와 값의 쌍으로 이루어진 데이터 객체를 표현하는 형식으로, 이 특징으로 인해 파이썬 딕셔너리와 매우 유사한 데이터 구조를 가집니다.
따라서 파이썬 프로그램에서 딕셔너리를 JSON 형식으로 변환하거나, 반대로 JSON 데이터를 딕셔너리로 변환하여 사용할 수 있습니다.
4.2.2 json 모듈을 활용한 변환
파이썬은 json이라는 내장 모듈을 제공하여 딕셔너리와 JSON 형식 간의 변환을 간단하게 처리할 수 있습니다.
json 모듈은 딕셔너리를 JSON 형식의 문자열로 변환하거나, JSON 형식의 문자열을 딕셔너리로 변환하는 기능을 제공합니다.
- 딕셔너리를 JSON으로 변환
import json
data = {'name': 'John', 'age': 30, 'city': 'New York'}
json_data = json.dumps(data) # 딕셔너리를 JSON 문자열로 변환
print(json_data) # JSON 형식의 문자열 출력
# 출력: {"name": "John", "age": 30, "city": "New York"}
- JSON을 딕셔너리로 변환
import json
json_data = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_data) # JSON 문자열을 딕셔너리로 변환
print(data) # 딕셔너리 출력
# 출력: {'name': 'John', 'age': 30, 'city': 'New York'}
5. 주의사항과 유의점
5.1 해시 가능한 키
딕셔너리의 키(key)는 반드시 해시 가능한(hashable) 객체여야 합니다.
해시 가능한 객체는 불변(immutable)하며, 같은 값을 가진 객체는 항상 같은 해시 값을 가지는 특징이 있습니다.
예를 들어 숫자, 문자열, 튜플 등은 해시 가능한 객체입니다.
리스트나 딕셔너리는 가변(mutable)하기 때문에 해시 가능하지 않습니다.
# 유효한 예시
valid_dict = {(1, 2): 'value', 'key': 'value', 42: 'value'}
# 유효하지 않은 예시(오류 발생!)
invalid_dict = {['key']: 'value'} # 리스트는 해시 가능하지 않음
5.2 메모리 사용량
딕셔너리는 유용하게 활용할 수 있지만, 큰 데이터셋에서는 메모리 사용량이 증가할 수 있습니다.
딕셔너리를 사용할 때 메모리 사용량을 고려하여 적절한 데이터 구조를 선택하고 최적화하는 것이 중요합니다.
5.3 키(key) 중복
딕셔너리에서 각 키(key)는 유일해야 합니다.
중복된 키(key)를 사용하면 기존 값(value)이 덮어써지는 결과를 초래할 수 있습니다.
따라서 키(key) 중복을 피하고 데이터를 적절하게 관리해야 합니다.
scores = {'Alice': 85, 'Bob': 90, 'Alice': 78}
print(scores) # 출력: {'Alice': 78, 'Bob': 90}
'Python' 카테고리의 다른 글
[파이썬] islower | isupper (32) | 2023.09.28 |
---|---|
[파이썬] title | capitalize (38) | 2023.09.28 |
[파이썬] swapcase (50) | 2023.09.28 |
[파이썬] count (49) | 2023.09.28 |
[파이썬] f 문자열 | f string (62) | 2023.09.28 |