1.1 사전과 그 속성
사전 (dictionary)은 Python에서 키-값 쌍의 정렬된 컬렉션으로, 각 키는 유일해야 해. 사전은 Python에서 데이터 저장과 관리에 가장 유연하고 강력한 자료형 중 하나야. 리스트만큼 자주 쓸 거야. 곧 그걸 직접 알게 될 거라구 :)
사전의 주요 속성:
1. 유일한 키
사전의 각 키는 유일해야 해. 이미 존재하는 키로 키-값 쌍을 추가하면, 기존 값이 새로운 값으로 대체돼. 예를 들어, 학생들의 데이터를 저장하고 식별자를 키로 사용하는 경우:
students = {"123": "John", "124": "Alice", "123": "Mike"}
print(students) # 출력: {'123': 'Mike', '124': 'Alice'}
2. 정렬
중요! Python 3.7 이전에는 사전이 정렬되지 않은 컬렉션이었어, 그래서 요소의 순서가 보장되지 않았지. Python 3.7부터 사전은 요소가 추가된 순서를 유지하지만, 이 부분은 Python 3.8부터 표준이 되어야 했어.
5년 전 이야기야. 우리는 Python 3.12를 기준으로 배우기 때문에, 사전을 정렬된 요소의 집합으로 보면 돼.
3. 변경 가능성
사전은 변경 가능해서 사전을 만든 후에도 요소를 추가, 변경, 삭제할 수 있어. 예를 들어, 학생의 주소를 추가해 보자:
student = {"name": "John", "age": 20}
student["address"] = "123 Main St"
print(student) # 출력: {'name': 'John', 'age': 20, 'address': '123 Main St'}
4. 효율성
사전은 키-값 쌍을 빠르게 검색, 추가, 삭제할 수 있도록 최적화되어 있어. 평균적으로 검색, 추가 및 삭제 작업은 상수 시간, O(1) 안에 수행돼. 알고리즘의 복잡도가 뭔지에 대해서는 나중에 "알고리즘과 자료 구조" 주제를 다룰 때 더 알게 될 거야.
5. 키와 값
사전의 키는 문자열, 숫자 또는 튜플과 같은 불변 자료형일 수 있고, 값은 다른 사전을 포함한 모든 자료형이 될 수 있어.
6. 접근 및 수정 메서드
사전은 요소에 접근하고, 추가하고, 수정하고, 키-값 쌍을 삭제하는 여러 방법을 지원해. 이 메서드에는 get(), keys(), values(), items(), update(), pop() 등이 있지. 다음 강의에서 더 자세히 알려줄게.
7. 요소 순회
사전에서 키, 값 또는 키-값 쌍을 순회할 수 있어 이것은 사전의 요소에 대해 작업을 쉽게 수행할 수 있도록 해 줘. 예를 들어:
student = {"name": "John", "age": 20, "address": "123 Main St"}
for key, value in student.items():
print(f"{key}: {value}")
출력은:
name: John
age: 20
address: 123 Main St
8. 키의 해쉬 가능성
사전의 키는 해쉬 가능해야 해 (hash에서 따온 말). 이는 키가 그 생애 동안 변경되지 않는 해쉬 값을 가져야 함을 의미해. 해쉬 값은 임의 길이의 입력 데이터를 고정된 길이의 출력 값으로 변환하는 해쉬 함수, 알고리즘을 통해 얻어져. 이를 해시 값이나 해시 코드라고 불러. 문자열, 숫자, 튜플과 같은 불변 자료형은 해쉬 가능해서 키로 사용할 수 있어.
해쉬 함수와 해쉬 가능성에 대해서는 "알고리즘과 자료 구조" 주제에서 더 공부할 거야.
1.2 {}를 사용한 사전 생성
Python에서는 여러 방법으로 사전(dictionaries)을 만들 수 있어. 사전 객체를 만드는 다양한 방법을 예시와 함께 보여줄게:
중괄호 {} 사용하기
사전을 만드는 가장 일반적인 방법은 키-값 쌍을 쉼표로 구분하는 중괄호를 사용하는 거야. 키-값 쌍은 콜론으로 구분돼.
# 빈 사전 생성
empty_dict = {}
# 요소가 있는 사전 생성
person = {
"name": "John",
"age": 30,
"city": "New York"
}
print(type(person))
print(person)
중요! 사전 생성은 세트 생성과 비슷해. 사실 키에 값이 연결된 세트로 사전을 볼 수도 있어. 중괄호 안에 단순히 "키"를 나열하면 세트가 생성되고, 키 뒤에 콜론이 있고 값이 있으면 사전이 생성돼. 빈 중괄호는 항상 사전이야.
# 빈 사전 생성
empty_dict = {}
# 요소가 있는 세트 생성
unique_items = {
"name",
"age",
"city"
}
print(type(unique_items))
print(unique_items)
1.3 dict() 함수를 사용한 사전 생성
dict() 함수는 키-값 쌍의 시퀀스나 명명된 인수를 사용해서 사전을 만들 수 있어.
키-값 쌍의 시퀀스를 사용한 예시:
# 튜플 리스트로 사전 생성
person = dict([("name", "John"), ("age", 30), ("city", "New York")])
print(person)
명명된 인수를 사용한 예시. 추가 중괄호는 필요 없어:
# 명명된 인수로 사전 생성
person = dict(name="John", age=30, city="New York")
print(person)
dict.fromkeys() 메서드 사용하기
fromkeys() 메서드는 주어진 키와 기본값으로 사전을 생성해.
# 기본값을 가진 키로 사전 생성
keys = ["name", "age", "city"]
default_value = None
person = dict.fromkeys(keys, default_value)
print(person)
사전은 세 개의 키를 가지지만, 모두 하나의 값을 가질 거야.
1.4 기존 변수로부터 사전 생성
변수를 키와 값으로 사용해서 사전을 만들 수 있어.
# 변수로 사전 생성
name = "John"
age = 30
city = "New York"
person = {"name": name, "age": age, "city": city}
print(person)
1.5 사전 생성기 사용하기
사전 생성기는 리스트 생성기와 유사한 짧고 간결한 구문을 통해 사전을 만들 수 있어.
# 사전 생성기를 사용한 사전 생성
squares = {x: x**2 for x in range(1, 6)}
print(squares)
1.6 사전에서 값 접근하기
키를 사용해 값을 얻으려면 [] 구문을 사용해:
# 사전에서 값 접근하기
person = {"name": "John", "age": 30, "city": "New York"}
print(person["name"]) # 출력: John
중요! 키가 없으면 KeyError가 생길 거야. 이를 피하려면, get() 메서드를 사용해서 키가 있으면 값을 반환하고, 없으면 None (또는 다른 기본값)을 반환할 수 있어.
# get() 메서드를 사용해 사전에서 값 접근하기
person = {"name": "John", "age": 30, "city": "New York"}
print(person.get("name")) # 출력: John
print(person.get("address", "주소를 찾을 수 없음")) # 출력: 주소를 찾을 수 없음
1.7 사전에서 값 변경하기
키를 통해 값에 접근하여 새로운 값을 할당함으로써 사전의 값을 변경할 수 있어.
# 사전에서 값 변경하기
person = {"name": "John", "age": 30, "city": "New York"}
person["age"] = 31
print(person) # 출력: {'name': 'John', 'age': 31, 'city': 'New York'}
1.8 사전에서 요소 삭제하기
del 연산자나 pop() 메서드로 요소를 삭제할 수 있어.
# del로 요소 삭제하기
person = {"name": "John", "age": 30, "city": "New York"}
del person["age"]
print(person) # 출력: {'name': 'John', 'city': 'New York'}
# pop()으로 요소 삭제하기
person = {"name": "John", "age": 30, "city": "New York"}
age = person.pop("age")
print(person) # 출력: {'name': 'John', 'city': 'New York'}
print(age) # 출력: 30
1.9 사전에서 키 존재 여부 확인하기
in 연산자를 사용해서 사전에 키가 포함되어 있는지 확인할 수 있어.
# 사전에서 키 존재 여부 확인하기
person = {"name": "John", "age": 30, "city": "New York"}
print("name" in person) # 출력: True
print("address" in person) # 출력: False
1.10 사전의 요소 순회
사전의 키, 값 또는 키-값 쌍을 순회할 수 있어:
# 사전의 키 순회
person = {"name": "John", "age": 30, "city": "New York"}
for key in person:
print(key)
# 사전의 값 순회
for value in person.values():
print(value)
# 사전의 키-값 쌍 순회
for key, value in person.items():
print(f"{key}: {value}")
1.11 실생활에서 사전 사용 예제
사전 사용이 유용할 수 있는 몇 가지 실생활 예제를 살펴보자:
예제 1: 텍스트에서 단어 빈도 계산
텍스트가 주어졌을 때, 각 단어가 몇 번 등장하는지 계산하고 싶어.
text = "hello world hello"
word_count = {}
for word in text.split():
if word in word_count:
word_count[word] += 1
else:
word_count[word] = 1
print(word_count) # 출력: {'hello': 2, 'world': 1}
예제 2: 학생 데이터 저장
사전을 사용해서 학생들의 데이터를 저장할 수 있어, 키는 식별자가 되고 값은 그들의 데이터가 될 거야.
students = {
"123": {"name": "John", "age": 20, "major": "Computer Science"},
"124": {"name": "Alice", "age": 22, "major": "Mathematics"}
}
print(students["123"]["name"]) # 출력: John
예제 3: 전화번호부
사전을 사용해서 간단한 전화번호부를 만들 수 있어, 키는 이름이 되고 값은 전화번호가 될 거야.
phone_book = {
"John": "123-456-7890",
"Alice": "987-654-3210"
}
print(phone_book["Alice"]) # 출력: 987-654-3210
GO TO FULL VERSION