본문 바로가기

파이썬

파이썬 데이터 구조 - 딕셔너리(Dictionary) 이해하기

반응형

파이썬 딕셔너리는 키-값 쌍으로 데이터를 저장하며, 데이터를 효율적으로 관리하고 접근하는 데 유용한 도구입니다. 이 글을 통해 딕셔너리의 기본 개념부터 고급 활용법까지 알아보겠습니다.

파이썬 딕셔너리(Dictionary) 소개

딕셔너리의 정의와 특징

딕셔너리는 키(Key)와 값(Value)의 쌍으로 데이터를 저장하는 데이터 구조로, 해시 테이블을 기반으로 빠른 검색과 접근이 가능합니다. 일상생활에서의 딕셔너리를 생각해보면, 전화번호부와 비슷합니다. 전화번호부에서는 이름(키)으로 전화번호(값)를 빠르게 찾을 수 있죠.

  • 키-값 쌍으로 구성된 데이터 구조
  • 순서가 없는(unordered) 데이터 구조
  • 변경 가능한(mutable) 데이터 구조
  • 빠른 데이터 검색과 접근

딕셔너리는 중괄호 {}를 사용하여 생성하며, 키와 값은 콜론 :으로 구분됩니다.

예를 들어,

person = {
    "name": "Padawan Joy",
    "age": 30,
    "location": "New York"
}

딕셔너리와 다른 데이터 구조의 비교

파이썬에는 딕셔너리 외에도 다양한 데이터 구조가 있습니다. 그 중 몇 가지를 비교해보겠습니다.

  • 리스트(List): 순서가 있는(mutable) 데이터 구조로, 인덱스를 사용하여 요소에 접근
  • 셋(Set): 중복을 허용하지 않는(unordered) 데이터 구조로, 요소의 순서가 없음
  • 튜플(Tuple): 순서가 있는(immutable) 데이터 구조로, 한 번 생성되면 변경 불가능

딕셔너리는 키를 통해 값을 빠르게 검색하고 수정할 수 있는 반면, 리스트는 인덱스를 통해 순차적으로 접근해야 합니다. 셋은 중복을 허용하지 않으며, 튜플은 변경이 불가능하다는 점에서 각각의 데이터 구조는 고유한 용도와 특성을 가지고 있습니다.

파이썬 딕셔너리의 기본 사용법

딕셔너리 생성하기

빈 딕셔너리 만들기

빈 딕셔너리는 중괄호 {}를 사용하여 생성할 수 있습니다. 이는 나중에 요소를 추가할 계획이 있을 때 유용합니다.

empty_dict = {}
print(empty_dict)  # 출력: {}

초기값을 가진 딕셔너리 만들기

딕셔너리는 초기값을 지정하여 생성할 수도 있습니다. 예를 들어, 학생의 정보를 담은 딕셔너리를 만들어 보겠습니다.

student = {
    "name": "Alice",
    "age": 25,
    "major": "Computer Science"
}
print(student)  # 출력: {'name': 'Alice', 'age': 25, 'major': 'Computer Science'}

딕셔너리 요소 접근하기

키를 사용한 접근

딕셔너리의 각 요소는 키를 사용하여 접근할 수 있습니다. 키는 고유해야 하며, 이를 통해 해당 값을 빠르게 찾을 수 있습니다.

예를 들어,

student = {
    "name": "Alice",
    "age": 25,
    "major": "Computer Science"
}

print(student["name"])  # 출력: Alice
print(student["age"])   # 출력: 25
print(student["major"]) # 출력: Computer Science

 

만약 존재하지 않는 키를 사용하면 KeyError가 발생하므로, 키가 존재하는지 확인하는 것이 중요합니다.

딕셔너리 슬라이싱

딕셔너리는 리스트나 튜플과 달리 슬라이싱을 직접적으로 지원하지 않습니다. 하지만, 특정 키의 범위를 지정하여 서브 딕셔너리를 만들거나, 키와 값을 따로 추출할 수 있는 방법이 있습니다.

 

예를 들어, 딕셔너리에서 특정 키만 선택하여 새로운 딕셔너리를 만들 수 있습니다.

student = {
    "name": "Alice",
    "age": 25,
    "major": "Computer Science",
    "grade": "A"
}

# 특정 키만 선택하여 새로운 딕셔너리 생성
filtered_student = {k: student[k] for k in ("name", "major")}
print(filtered_student)  # 출력: {'name': 'Alice', 'major': 'Computer Science'}

딕셔너리의 주요 메서드

요소 추가 및 수정

새로운 키-값 쌍 추가하기

파이썬의 딕셔너리는 새로운 키를 대입하면 자동으로 해당 키-값 쌍이 추가됩니다. 별도의 메서드를 사용할 필요 없이, 키를 통해 직접 값을 할당하면 됩니다.

student = {
    "name": "Alice",
    "age": 25,
    "major": "Computer Science"
}

# 새로운 키-값 쌍 추가
student["grade"] = "A"
print(student)
# 출력: {'name': 'Alice', 'age': 25, 'major': 'Computer Science', 'grade': 'A'}

update() 메서드

update() 메서드는 딕셔너리를 업데이트하거나 여러 키-값 쌍을 한 번에 추가하는 데 사용됩니다. 이는 여러 데이터를 동시에 추가하거나 기존 값을 수정할 때 유용합니다.

예를 들어,

student = {
    "name": "Alice",
    "age": 25,
    "major": "Computer Science"
}

# 여러 키-값 쌍 업데이트
student.update({
    "grade": "A",
    "gpa": 3.8
})
print(student)
# 출력: {'name': 'Alice', 'age': 25, 'major': 'Computer Science', 'grade': 'A', 'gpa': 3.8}

요소 삭제하기

del 키워드

del 키워드는 딕셔너리에서 특정 키를 삭제하는 데 사용됩니다. 키를 직접 지정하여 해당 키-값 쌍을 삭제할 수 있습니다.

student = {
    "name": "Alice",
    "age": 25,
    "major": "Computer Science"
}

# 키 'age' 삭제
del student["age"]
print(student)  # 출력: {'name': 'Alice', 'major': 'Computer Science'}

pop()

pop() 메서드는 지정한 키의 요소를 삭제하고, 그 값을 반환합니다. 키를 지정하지 않으면 오류가 발생하므로, 존재하는 키를 지정해야 합니다.

예를 들어,

student = {
    "name": "Alice",
    "age": 25,
    "major": "Computer Science",
    "grade": "A"
}

# 키 'grade' 삭제 및 값 반환
grade = student.pop("grade")
print(grade)      # 출력: A
print(student)    # 출력: {'name': 'Alice', 'age': 25, 'major': 'Computer Science'}

딕셔너리 정렬과 키 추출

keys()

keys() 메서드는 딕셔너리의 모든 키를 반환합니다. 이는 딕셔너리의 구조를 파악하거나, 반복문에서 키를 사용할 때 유용합니다.

student = {
    "name": "Alice",
    "age": 25,
    "major": "Computer Science"
}

keys = student.keys()
print(keys)  # 출력: dict_keys(['name', 'age', 'major'])

values()

values() 메서드는 딕셔너리의 모든 값을 반환합니다. 이는 데이터의 내용을 확인하거나, 값을 기반으로 작업할 때 유용합니다.

values = student.values()
print(values)  # 출력: dict_values(['Alice', 25, 'Computer Science'])

items()

items() 메서드는 딕셔너리의 모든 키-값 쌍을 반환합니다. 이는 반복문에서 키와 값을 동시에 사용할 때 유용합니다.

items = student.items()
print(items)  # 출력: dict_items([('name', 'Alice'), ('age', 25), ('major', 'Computer Science')])

딕셔너리의 활용 사례

연락처 관리 시스템

딕셔너리는 연락처 관리 시스템에서 매우 유용하게 사용됩니다. 이름을 키로 하고 전화번호를 값으로 저장함으로써, 사용자가 원하는 연락처를 빠르게 검색하고 수정할 수 있습니다.

contacts = {
    "Alice": "010-1234-5678",
    "Bob": "010-8765-4321",
    "Charlie": "010-1122-3344"
}

# 새로운 연락처 추가
contacts["David"] = "010-5566-7788"
print(contacts)

# 특정 연락처 수정
contacts["Alice"] = "010-0000-0000"
print(contacts)

# 특정 연락처 삭제
del contacts["Bob"]
print(contacts)
# 출력:
# {'Alice': '010-1234-5678', 'Bob': '010-8765-4321', 'Charlie': '010-1122-3344', 'David': '010-5566-7788'}
# {'Alice': '010-0000-0000', 'Bob': '010-8765-4321', 'Charlie': '010-1122-3344', 'David': '010-5566-7788'}
# {'Alice': '010-0000-0000', 'Charlie': '010-1122-3344', 'David': '010-5566-7788'}

학생 정보 관리 프로그램

딕셔너리를 사용하여 학생들의 정보를 관리할 수 있습니다. 학생의 이름을 키로 하고, 학번, 전공, 성적 등의 정보를 값으로 저장함으로써, 학생 정보를 효율적으로 관리할 수 있습니다.

students = {
    "Alice": {"id": "S001", "major": "Computer Science", "grade": "A"},
    "Bob": {"id": "S002", "major": "Mathematics", "grade": "B"},
    "Charlie": {"id": "S003", "major": "Physics", "grade": "A+"}
}

# 새로운 학생 추가
students["David"] = {"id": "S004", "major": "Chemistry", "grade": "B+"}
print(students)

# 특정 학생의 정보 수정
students["Alice"]["grade"] = "A+"
print(students)

# 특정 학생의 정보 삭제
students.pop("Bob")
print(students)
# 출력:
# {'Alice': {'id': 'S001', 'major': 'Computer Science', 'grade': 'A'}, 'Bob': {'id': 'S002', 'major': 'Mathematics', 'grade': 'B'}, 'Charlie': {'id': 'S003', 'major': 'Physics', 'grade': 'A+'}, 'David': {'id': 'S004', 'major': 'Chemistry', 'grade': 'B+'}}
# {'Alice': {'id': 'S001', 'major': 'Computer Science', 'grade': 'A+'}, 'Bob': {'id': 'S002', 'major': 'Mathematics', 'grade': 'B'}, 'Charlie': {'id': 'S003', 'major': 'Physics', 'grade': 'A+'}, 'David': {'id': 'S004', 'major': 'Chemistry', 'grade': 'B+'}}
# {'Alice': {'id': 'S001', 'major': 'Computer Science', 'grade': 'A+'}, 'Charlie': {'id': 'S003', 'major': 'Physics', 'grade': 'A+'}, 'David': {'id': 'S004', 'major': 'Chemistry', 'grade': 'B+'}}

딕셔너리와 반복문

for 루프를 사용한 딕셔너리 순회

딕셔너리는 반복문과 함께 사용하여 각 키-값 쌍에 대해 특정 작업을 수행할 수 있습니다. 예를 들어, 딕셔너리의 모든 학생 이름과 성적을 출력하는 프로그램을 작성해 보겠습니다.

students = {
    "Alice": {"id": "S001", "major": "Computer Science", "grade": "A+"},
    "Bob": {"id": "S002", "major": "Mathematics", "grade": "B"},
    "Charlie": {"id": "S003", "major": "Physics", "grade": "A+"}
}

for name, info in students.items():
    print(f"{name}의 성적: {info['grade']}")
    # 출력:
    # Alice의 성적: A+
    # Bob의 성적: B
    # Charlie의 성적: A+

딕셔너리 컴프리헨션(Dictionary Comprehension)

딕셔너리 컴프리헨션은 간결한 문법으로 새로운 딕셔너리를 생성하는 방법입니다. 이를 통해 더욱 효율적이고 읽기 쉬운 코드를 작성할 수 있습니다.

# 기존 딕셔너리에서 특정 조건을 만족하는 키-값 쌍만 추출하여 새로운 딕셔너리 생성
students = {
    "Alice": {"id": "S001", "major": "Computer Science", "grade": "A+"},
    "Bob": {"id": "S002", "major": "Mathematics", "grade": "B"},
    "Charlie": {"id": "S003", "major": "Physics", "grade": "A+"},
    "David": {"id": "S004", "major": "Chemistry", "grade": "B+"}
}

# 성적이 'A+'인 학생들만 추출
excellent_students = {name: info for name, info in students.items() if info['grade'] == "A+"}
print(excellent_students)
# 출력: {'Alice': {'id': 'S001', 'major': 'Computer Science', 'grade': 'A+'}, 'Charlie': {'id': 'S003', 'major': 'Physics', 'grade': 'A+'}}

딕셔너리와 함수

함수에서 딕셔너리 사용하기

함수 내에서 딕셔너리를 사용하면 데이터를 구조화하고 관리하는 데 큰 도움이 됩니다. 예를 들어, 사용자의 정보를 입력받아 딕셔너리에 저장하는 함수를 만들어 보겠습니다.

def create_user(name, age, email):
    user = {
        "name": name,
        "age": age,
        "email": email
    }
    return user

user1 = create_user("Alice", 25, "alice@example.com")
print(user1)
# 출력: {'name': 'Alice', 'age': 25, 'email': 'alice@example.com'}

딕셔너리를 반환하는 함수

함수가 여러 개의 값을 반환할 때 딕셔너리를 사용하면 반환값을 보다 명확하게 관리할 수 있습니다. 예를 들어, 계산 결과와 상태 메시지를 함께 반환하는 함수를 만들어 보겠습니다.

def divide(a, b):
    if b == 0:
        return {"result": None, "message": "Error: Division by zero"}
    else:
        return {"result": a / b, "message": "Success"}

output1 = divide(10, 2)
print(output1)  # 출력: {'result': 5.0, 'message': 'Success'}

output2 = divide(10, 0)
print(output2)  # 출력: {'result': None, 'message': 'Error: Division by zero'}

자주 묻는 질문 (FAQ)

딕셔너리는 왜 유용한가요?

딕셔너리는 키를 통해 값을 빠르게 검색하고 수정할 수 있기 때문에, 데이터의 구조화와 관리가 용이합니다. 또한, 키-값 쌍으로 데이터를 저장함으로써, 복잡한 데이터 관계를 쉽게 표현할 수 있습니다. 예를 들어, 사용자 정보, 제품 정보, 설정 값 등을 효과적으로 관리할 수 있습니다.

딕셔너리에 중복된 키를 사용할 수 있나요?

딕셔너리는 키가 고유해야 하기 때문에, 동일한 키를 여러 번 사용할 수 없습니다. 만약 중복된 키를 사용하여 값을 할당하면, 마지막에 할당된 값으로 덮어씌워집니다.

student = {
    "name": "Alice",
    "age": 25,
    "name": "Bob"
}
print(student)  # 출력: {'name': 'Bob', 'age': 25}

 

따라서, 딕셔너리를 사용할 때는 각 키가 고유한지 확인하는 것이 중요합니다.

마무리하며

이번 글에서는 파이썬 딕셔너리에 대해 기본 개념부터 생성 방법, 요소 접근법, 주요 메서드, 활용 사례, 반복문과의 결합, 함수와의 연계까지 자세히 살펴보았습니다. 딕셔너리는 데이터의 구조화와 관리에 있어 필수적인 도구로, 효율적인 데이터 처리와 프로그램의 안정성을 높이는 데 큰 도움이 됩니다. 파이썬 딕셔너리를 효과적으로 활용하여 더욱 체계적이고 효율적인 코드를 작성해 보세요.

반응형