Development Tip

Python 강좌 06 - Dictionary

MoonLight314 2024. 12. 23. 11:05
728x90

안녕하세요, MoonLight입니다.

이번 Post에서는 Python의 Dictionary에 대해서 알아보도록 하겠습니다.

 

 

1. 기본 사항

Python의 Dictionary는 key-value 쌍으로 데이터를 저장하는 변수형입니다.

Dictionary는 Hash Table을 기반으로 구현되어 있어, 빠른 조회 속도를 자랑합니다.

Python의 다른 자료형들과 달리 Dictionary는 순서가 없는 자료형입니다(단, Python 3.7 이상에서는 삽입 순서를 기억하지만, 여전히 순서가 보장된 자료형으로 분류되지는 않습니다).

 

1.1. Dictionary의 기본 구조

Dictionary는 중괄호 {} 안에 key-value 쌍으로 값을 저장합니다. 각 key는 고유해야 하며, 값은 어떤 자료형이든 가능합니다.

Dictionary를 생성하는 방법은 여러가지인데, 다음과 같은 방법이 있습니다.

1.1.1. 리터럴 방식

person = {
"name": "Alice",
"age": 25,
"city": "New York"
}
print(person)

출력:
{'name': 'Alice', 'age': 25, 'city': 'New York'}

1.1.2. dict() 함수

my_dict = dict(name="Alice", age=25)

1.1.3. List나 Tuple의 Key-Value 쌍으로 생성

pairs = [("name", "Alice"), ("age", 25)]
my_dict = dict(pairs)
print(my_dict)

출력:
{'name': 'Alice', 'age': 25}

1.1.4. fromkeys(): 공통 키로 Dictionary 생성

keys = ["name", "age", "city"]
my_dict = dict.fromkeys(keys, "unknown")
print(my_dict)

출력:
{'name': 'unknown', 'age': 'unknown', 'city': 'unknown'}

 

Dictionary의 Key & Value에 접근하는 방법에 대해서 알아보겠습니다

1.2.1. Key를 사용하여 값에 접근

print(person["name"])

출력:
Alice

print(person["age"])

출력:
25

Dictionary에서 존재하지 않는 키를 사용하려고 하면 KeyError가 발생합니다.

1.2.2. Key가 존재하지 않는 경우

print(person["address"])
# KeyError: 'address'

해결 방법: get Method를 사용.

print(person.get("address"))
# None (기본값)

print(person.get("address", "N/A"))
# "N/A" (기본값 지정)

 

1.2. Dictionary의 주요 특징

1.2.1. 키는 고유해야 함

Dictionary의 키는 고유해야 하므로, 동일한 키를 여러 번 사용할 수 없습니다. 만약 같은 키로 값을 추가하면 마지막 값이 저장됩니다.

erson = {
"name": "Alice",
"age": 25,
"name": "Bob" # 기존 'name' 키에 새로운 값이 들어감
}
print(person)

출력:
{'name': 'Bob', 'age': 25}

1.2.2. 키는 불변(immutable) 타입이어야 함

Dictionary의 키는 변경할 수 없는(불변) 자료형이어야 합니다. 따라서 List나 다른 Dictionary는 키로 사용할 수 없습니다.

# 불변 타입인 Tuple은 키로 사용 가능
valid_dict = {("name", "last"): "Alice"}

# 변경 가능한 타입인 List는 키로 사용할 수 없음
invalid_dict = {[1, 2]: "value"} # TypeError

# 키로는 숫자, 문자열, Tuple과 같은 불변 객체만 사용할 수 있습니다.
valid_dict = {1: "One", "key": "Value", (1, 2): "Tuple Key"}
invalid_dict = {[1, 2]: "List Key"} # 오류 발생

1.2.3. Dictionary는 순서가 없는 자료형 (Python 3.6 이전)

Dictionary는 삽입 순서가 보장되지 않았습니다. 그러나 Python 3.7부터는 Dictionary가 삽입 순서를 기억합니다.​

# Python 3.7 이상에서는 순서가 유지됩니다
person = {"name": "Alice", "age": 25, "city": "New York"}
for key, value in person.items():
    print(f"{key}: {value}")

출력 (Python 3.7 이상에서는 순서 보장):
name: Alice
age: 25
city: New York

 

1.3. Dictionary의 다양한 Method와 연산

1.3.1. keys(), values(), items()

Dictionary의 키, 값, key-value 쌍을 각각 반환하는 Method입니다.

person = {"name": "Alice", "age": 25, "city": "New York"}

# 키 목록
print(person.keys())

출력:
dict_keys(['name', 'age', 'city'])

# 값 목록
print(person.values())

출력:
dict_values(['Alice', 25, 'New York'])

# key-value 쌍 목록
print(person.items())

출력:
dict_items([('name', 'Alice'), ('age', 25), ('city', 'New York')])

1.3.2. get()

get() Method는 키를 통해 값을 조회하는 Method로, 키가 존재하지 않으면 기본값을 반환합니다. KeyError를 방지할 수 있습니다.

# get() 사용 예시
print(person.get("name"))

출력:
Alice

print(person.get("address", "Unknown"))

출력:
Unknown (키가 없으면 기본값 반환)

1.3.3. update()

update() Method는 기존 Dictionary에 다른 Dictionary나 Key-Value 쌍을 추가하거나 수정할 수 있습니다.

person = {"name": "Alice", "age": 25}

# 다른 Dictionary 추가
person.update({"city": "New York", "age": 26}) # "age"가 수정됨

print(person)

출력:
{'name': 'Alice', 'age': 26, 'city': 'New York'}

1.3.4. pop(), popitem()

pop()은 특정 키를 삭제하고 해당 값을 반환합니다.

popitem()은 마지막 key-value 쌍을 삭제하고 반환합니다.

# pop() 예시
removed_value = person.pop("age")
print(removed_value) # 25
print(person)

출력:
{'name': 'Alice', 'city': 'New York'}

# popitem() 예시
last_item = person.popitem()
print(last_item)

출력:
('city', 'New York')

print(person)

출력:
{'name': 'Alice'}

 

1.3.5. clear()

clear()는 Dictionary의 모든 항목을 제거합니다.

person.clear()
print(person)

출력:
{}

1.3.6. del

del은 특정 키를 삭제하는 데 사용됩니다.

del person["name"]
print(person)

출력:
{} (삭제된 후)

1.3.7. Dictionary 반복

# Key만 읽어올 때 사용하는 방법입니다.
for key in person:
    print(key)

# Value만 읽어올때 사용하는 방법입니다.
for value in person.values():
    print(value)

# Key-Value 쌍 반복을 같이 읽어올 때 사용하는 방법입니다.
for key, value in person.items():
    print(f"{key}: {value}")

1.3.8. Key 존재 여부 확인

특정 Key가 Dictionary 안에 존재하는지 여부를 확인할 때 사용하는 방법입니다.

if "name" in person:
    print("Key 'name' exists")

if "city" not in person:
    print("Key 'city' does not exist")

 

1.4. Dictionary의 복사

1.4.1. copy()

Dictionary를 얕은 복사하려면 copy() Method를 사용할 수 있습니다.

person = {"name": "Alice", "age": 25}
person_copy = person.copy()

print(person_copy)

출력:
{'name': 'Alice', 'age': 25}

1.4.2. dict() 생성자

dict() 생성자를 사용하여 Dictionary를 복사하거나 생성할 수 있습니다.

person = {"name": "Alice", "age": 25}
person_copy = dict(person)

print(person_copy)

출력:
{'name': 'Alice', 'age': 25}

 

1.5. Dictionary와 List의 혼합 사용

Dictionary는 List와 함께 많이 사용됩니다.

예를 들어, Dictionary의 값을 List로 할당하거나, List 안에 여러 Dictionary를 담을 수 있습니다.

Value는 어떤 종류의 Data Type도 담을 수 있기 때문에 다른 Data Type과 같이 사용하는 유용하게 사용할 수 있습니다.

# Dictionary 값에 List를 넣기
person = {"name": "Alice", "friends": ["Bob", "Charlie", "David"]}

# List 안에 Dictionary 넣기
people = [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 30},
{"name": "Charlie", "age": 35}
]

print(people)

출력:
[{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}, {'name': 'Charlie', 'age': 35}]

 

 

1.6. Dictionary Comprehension

Dictionary Comprehension을 사용하면 더 간결하고 효율적으로 Dictionary를 생성할 수 있습니다.

# 1부터 5까지의 제곱수를 Dictionary로 저장
squares = {x: x**2 for x in range(1, 6)}
print(squares)

출력:
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

1.7. 응용 예제

1.7.1. Dictionary 정렬

scores = {"Alice": 90, "Bob": 70, "Charlie": 80}
sorted_scores = dict(sorted(scores.items(), key=lambda item: item[1], reverse=True))
print(sorted_scores)

출력:
{'Alice': 90, 'Charlie': 80, 'Bob': 70}

1.7.2. Dictionary 값 합계

scores = {"Alice": 90, "Bob": 70, "Charlie": 80}
total = sum(scores.values())
print(total)

출력:
240

1.7.3. Dictionary 필터링

scores = {"Alice": 90, "Bob": 70, "Charlie": 80}
passed = {k: v for k, v in scores.items() if v >= 80}
print(passed)

출력:
{'Alice': 90, 'Charlie': 80}

 

1.8. 결론

Dictionary는 Python에서 매우 강력하고 유용한 자료형입니다.

key-value 쌍을 사용하여 데이터를 효율적으로 저장하고 검색할 수 있으며, 다양한 내장 Method를 통해 Dictionary 작업을 쉽게 처리할 수 있습니다.

데이터베이스처럼 데이터를 쌍으로 관리하거나 복잡한 자료를 다룰 때 특히 유용합니다.

 

 

 

2. 예제

 

Ex. 1. 본적으로 데이터 Unpacking은 좌변의 변수와 우변 데이터 개수가 같아야 합니다. 하지만 star expression을 사용하면 변수의 개수가 달라도 데이터 Unpacking을 할 수 있습니다. Tuple에 저장된 데이터 중에서 앞에 있는 두 개의 데이터만 필요할 경우 나머지 데이터의 Unpacking 코드를 작성할 필요가 없습니다.

 

a, b, *c = (0, 1, 2, 3, 4, 5)
print(a)
print(b)
print(c)

 

다음과 같이 10개의 값이 저장된 scores List가 있을 때, start expression을 사용하여 좌측 8개의 값을 valid_score 변수에 바인딩하여라.

scores = [8.8, 8.9, 8.7, 9.2, 9.3, 9.7, 9.9, 9.5, 7.8, 9.4]

scores = [8.8, 8.9, 8.7, 9.2, 9.3, 9.7, 9.9, 9.5, 7.8, 9.4]
*valid_score , _, _ = scores
print(valid_score)

출력:
[8.8, 8.9, 8.7, 9.2, 9.3, 9.7, 9.9, 9.5]

 

Ex. 2. 다음과 같이 10개의 값이 저장된 scores List가 있을 때, start expression을 사용하여 우측 8개의 값을 valid_score 변수에 바인딩하여라.

scores = [8.8, 8.9, 8.7, 9.2, 9.3, 9.7, 9.9, 9.5, 7.8, 9.4]

scores = [8.8, 8.9, 8.7, 9.2, 9.3, 9.7, 9.9, 9.5, 7.8, 9.4]
_,_,*valid_score = scores
print(valid_score)

출력:
[8.7, 9.2, 9.3, 9.7, 9.9, 9.5, 7.8, 9.4]

 

Ex. 3. 다음과 같이 10개의 값이 저장된 scores List가 있을 때, start expression을 사용하여 가운데 있는 8개의 값을 valid_score 변수에 바인딩하여라.

scores = [8.8, 8.9, 8.7, 9.2, 9.3, 9.7, 9.9, 9.5, 7.8, 9.4]

scores = [8.8, 8.9, 8.7, 9.2, 9.3, 9.7, 9.9, 9.5, 7.8, 9.4]
_,*valid_score,_ = scores
print(valid_score)

출력:
[8.9, 8.7, 9.2, 9.3, 9.7, 9.9, 9.5, 7.8]

 

 

Ex. 4. temp 이름의 비어있는 Dictionary를 만들라.

temp = {}
print(type(temp))

출력:
<class 'dict'>

 

Ex. 5. 다음 아이스크림 이름과 희망 가격을 Dictionary로 구성하라.

이름
희망 가격
메로나
1000
폴라포
1200
빵빠레
1800
item = {"메로나":1000,
"폴라포":1200,
"빵빠레":1800
}
print(item)

출력:
{'메로나': 1000, '폴라포': 1200, '빵빠레': 1800}

 

 

Ex. 6. 5번의 Dictionary에 아래 아이스크림 가격정보를 추가하라.

죠스바 1200

월드콘 1500

item = {"메로나":1000,
"폴라포":1200,
"빵빠레":1800
}

item["죠스바"] = 1200
item["월드콘"] = 1500

print(item)

출력:
{'메로나': 1000, '폴라포': 1200, '빵빠레': 1800, '죠스바': 1200, '월드콘': 1500}

 

Ex. 7. 다음 Dictionary를 사용하여 메로나 가격을 출력하라.

ice = {'메로나': 1000,

'폴로포': 1200,

'빵빠레': 1800,

'죠스바': 1200,

'월드콘': 1500}

#실행 예:

#메로나 가격: 1000

ice = {'메로나': 1000,
'폴로포': 1200,
'빵빠레': 1800,
'죠스바': 1200,
'월드콘': 1500}

print(ice['메로나'])
print(ice.get('메로나'))

출력:
1000
1000

 

Ex. 8. 다음 Dictionary에서 메로나의 가격을 1300으로 수정하라.

ice = {'메로나': 1000,

'폴로포': 1200,

'빵빠레': 1800,

'죠스바': 1200,

'월드콘': 1500}

ice = {'메로나': 1000,
'폴로포': 1200,
'빵빠레': 1800,
'죠스바': 1200,
'월드콘': 1500}

ice['메로나'] = 1300
print(ice['메로나'])
print(ice.get('메로나'))

출력:
1300
1300

Ex. 9. 다음 Dictionary에서 메로나를 삭제하라.

ice = {'메로나': 1000,

'폴로포': 1200,

'빵빠레': 1800,

'죠스바': 1200,

'월드콘': 1500}

ice = {'메로나': 1000,
'폴로포': 1200,
'빵빠레': 1800,
'죠스바': 1200,
'월드콘': 1500}

del ice['메로나']
print(ice)

출력:
{'폴로포': 1200, '빵빠레': 1800, '죠스바': 1200, '월드콘': 1500}

 

Ex. 10. 다음 코드에서 에러가 발생한 원인을 설명하라.

icecream = {'폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000}
icecream['누가바']
"""
Traceback (most recent call last):
File "<pyshell#69>", line 1, in <module>
icecream['누가바']
KeyError: '누가바'
"""

Dictionary에 없는 키를 사용해서 인덱싱하면 에러가 발생합니다.

 

 

Ex. 11. 아래의 표에서, 아이스크림 이름을 키값으로, (가격, 재고) List를 Dictionary의 값으로 저장하라. Dictionary의 이름은 inventory로 한다.

이름
희망 가격
재고
메로나
300
20
비비빅
400
3
죠스바
250
100
iventory = {"메로나":[300,20],
"비비빅":[400,3],
"죠스바":[250,100]
}

print(iventory)

출력:
{'메로나': [300, 20], '비비빅': [400, 3], '죠스바': [250, 100]}

 

Ex. 12. inventory Dictionary에서 메로나의 가격을 화면에 출력하라.

inventory = {"메로나": [300, 20],

"비비빅": [400, 3],

"죠스바": [250, 100]}

#실행 예시:

#300

inventory = {"메로나": [300, 20],
"비비빅": [400, 3],
"죠스바": [250, 100]}
print(iventory.get('메로나')[0])

출력:
300

 

Ex. 13. inventory Dictionary에서 메로나의 재고를 화면에 출력하라.

inventory = {"메로나": [300, 20],

"비비빅": [400, 3],

"죠스바": [250, 100]}

#실행 예시:

#20

inventory = {"메로나": [300, 20],
"비비빅": [400, 3],
"죠스바": [250, 100]}

print(iventory.get('메로나')[1])

출력:
20

 

 

Ex. 14. inventory Dictionary에 아래 데이터를 추가하라.

월드콘 500 7

inventory = {"메로나": [300, 20],
"비비빅": [400, 3],
"죠스바": [250, 100]}
inventory["월드콘"]=[500,7]

print(inventory)

출력:
{'메로나': [300, 20], '비비빅': [400, 3], '죠스바': [250, 100], '월드콘': [500, 7]}

Ex. 15. 다음의 Dictionary로부터 key 값으로만 구성된 List를 생성하라.

icecream = {'탱크보이': 1200, '폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000}
a = list(icecream.keys())
print(a)

출력:
['탱크보이', '폴라포', '빵빠레', '월드콘', '메로나']

 

Ex. 16. 다음의 Dictionary에서 values 값으로만 구성된 List를 생성하라.

icecream = {'탱크보이': 1200, '폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000}
a = list(icecream.values())
print(a)

출력:
[1200, 1200, 1800, 1500, 1000]

 

Ex. 17. icecream Dictionary에서 아이스크림 판매 금액의 총합을 출력하라.

icecream = {'탱크보이': 1200, '폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000}

icecream = {'탱크보이': 1200, '폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000}
print(sum(icecream.values()))

출력:
6700

Ex. 18. 아래의 new_product Dictionary를 다음 icecream Dictionary에 추가하라.

icecream = {'탱크보이': 1200, '폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000}

new_product = {'팥빙수':2700, '아맛나':1000}
icecream = {'탱크보이': 1200, '폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000}
new_product = {'팥빙수':2700, '아맛나':1000}
icecream.update(new_product)
print(icecream)

출력:
{'탱크보이': 1200, '폴라포': 1200, '빵빠레': 1800, '월드콘': 1500, '메로나': 1000, '팥빙수': 2700, '아맛나': 1000}

 

Ex. 19. 아래 두 개의 Tuple을 하나의 Dictionary로 변환하라. keys를 키로, vals를 값으로 result 이름의 Dictionary로 저장한다.

keys = ("apple", "pear", "peach")

vals = (300, 250, 400)

keys = ("apple", "pear", "peach")
vals = (300, 250, 400)
result = dict(zip(keys,vals))
print(result)

출력:
{'apple': 300, 'pear': 250, 'peach': 400}

 

Ex. 20. date와 close_price 두 개의 List를 close_table 이름의 Dictionary로 생성하라.

date = ['09/05', '09/06', '09/07', '09/08', '09/09']

close_price = [10500, 10300, 10100, 10800, 11000]
date = ['09/05', '09/06', '09/07', '09/08', '09/09']
close_price = [10500, 10300, 10100, 10800, 11000]
print(dict(zip(date,close_price)))

출력:
{'09/05': 10500, '09/06': 10300, '09/07': 10100, '09/08': 10800, '09/09': 11000}

도움이 되셨으면 좋겠네요.

다른 강좌도 참고하시면 좋을 것 같습니다. 각 강좌의 Link는 아래를 참고하시기 바랍니다.

 

 

Python 강좌 01 - print()

 

Python 강좌 02 - 변수

 

Python 강좌 03 - 문자열

 

Python 강좌 04 - List

 

Python 강좌 05 - Tuple

 

Python 강좌 06 - Dictionary

 

Python 강좌 07 - 분기문

 

Python 강좌 08 - 반복문

 

Python 강좌 09 - 함수

 

Python 강좌 10 - Module

 

Python 강좌 11 - Class

 

Python 강좌 12 - File & Exception

728x90

'Development Tip' 카테고리의 다른 글

Python 강좌 08 - 반복문  (0) 2024.12.23
Python 강좌 07 - 분기문  (0) 2024.12.23
Python 강좌 05 - Tuple  (0) 2024.12.23
Python 강좌 04 - List  (0) 2024.12.23
Python 강좌 03 - 문자열  (0) 2024.12.23