[Python3] 데이터 타입 - Dict

Alexandria·2023년 8월 31일
0

Python3 Basic

목록 보기
8/19
post-thumbnail

1. Dict

Dictionary(이하, dict) 변수는 key와 value의 쌍을 저장하는 자료형입니다.

key는 불변(Immutable) 자료형이 되어야 하며, value는 어떠한 자료형도 될 수 있습니다.

dict는 Sequence 자료형이 아니므로, 인덱싱(Indexing)과 슬라이싱(Slicing)이 불가능합니다.

💡 Sequence는 여러 개의 데이터들이 연속적으로 이루어진 자료형이며 str, list, tuple이 해당됩니다. Immutable은 데이터를 변경할 수 없는 자료형이며 tuple, string 등이 해당됩니다.

다음과 같이 dict() 혹은 {}를 이용하여 생성할 수 있습니다.

a = dict()
print(type(a)) # <class 'dict'>

a = {}
print(type(a)) # <class 'dict'>

dict()을 사용하면 코드를 봤을 때 {}보다는 이해하기 쉬우며,

dict()보다 {}를 사용하면 성능 면에서 이점이 있습니다.

이번에는 {}, dict, zip, tuple을 이용하여 데이터와 함께 dict를 생성해 봅니다.

a = {"Name": "홍길동", "Age" : 20, "Addr" : "서울"}
print(a) # {'Name': '홍길동', 'Age': 20, 'Addr': '서울'}

a = dict(Name="홍길동", Age=20, Addr="서울")
print(a) # {'Name': '홍길동', 'Age': 20, 'Addr': '서울'}

a = dict(zip(["Name","Age","Addr"],["홍길동",20,"서울"]))
print(a) # {'Name': '홍길동', 'Age': 20, 'Addr': '서울'}

a = dict([("Name","홍길동"), ("Age",20), ("Addr","서울")])
print(a) # {'Name': '홍길동', 'Age': 20, 'Addr': '서울'}

dict를 생성 시 zip을 활용한 방법이 가장 오래 걸리고, {}가 가장 빠릅니다.

2. Key and Value

dict는 key를 이용하여 value에 접근할 수 있습니다.

get을 이용하면 dict에 key가 없을 때 발생하는 KeyError를 방지할 수 있습니다.

a = {"Name": "홍길동", "Age" : 20, "Addr" : "서울"}
print(a["Name"])    # 홍길동
print(a["Age"])     # 20
print(a["Addr"])    # 서울

print(a.get("Tel")) # None
print(a.get("Tel", "do you not have phones?")) # do you not have phones?

value를 조회하는 것이 아닌 key를 이용하여 value를 추가 혹은 수정할 수 있습니다.

a       = {"Name": "홍길동", "Age" : 20, "Addr" : "서울"}
a["Tel"]= "0000-0000-0000"
a["Age"]= 44
print(a) # {'Name': '홍길동', 'Age': 44, 'Addr': '서울', 'Tel': '0000-0000-0000'}

2.1. Key

keys 함수를 이용하면 dict의 iterable 한 key 목록을 얻을 수 있습니다.

a = {"Name":"홍길동", "Age":20, "Addr":"서울"}
print(a.keys()) # dict_keys(['Name', 'Age', 'Addr'])
print(list(a.keys())[0]) # Name

2.2. Value

values 함수를 이용하면 dict의 iterable 한 value 목록을 얻을 수 있습니다.

a = {"Name":"홍길동", "Age":20, "Addr":"서울"}
print(a.values()) # dict_values(['홍길동', 20, '서울'])
print(list(a.values())[0]) # 홍길동

2.3. Items

items 함수를 이용하면 iterable한 key와 value의 목록을 동시에 얻을 수 있습니다.

a = {"Name":"홍길동", "Age":20, "Addr":"서울"}
print(a.items()) # dict_items([('Name', '홍길동'), ('Age', 20), ('Addr', '서울')])
print(list(a.items())[0]) # ('Name', '홍길동')

for k,v in a.items():
    print(f"key\t: {k}")
    print(f"value\t: {v}")

3. Functions

update**를 사용하면 두개의 dict를 병합할 수 있습니다.

a = {"Name":"홍길동", "Age":20, "Addr":"서울"}
b = {"Age":25, "Tel":"1234-1234"}
a.update(b)
print(a) # {'Name': '홍길동', 'Age': 25, 'Addr': '서울', 'Tel': '1234-1234'}

a = {"Name":"홍길동", "Age":20, "Addr":"서울"}
b = {"Age":25,"Tel":"1234-1234"}
print({**a, **b}) # {'Name': '홍길동', 'Age': 25, 'Addr': '서울', 'Tel': '1234-1234'}

a = {"Name":"홍길동", "Age":20, "Addr":"서울"}
b = {"Age":25,"Tel":"1234-1234"}
print(dict(a, **b)) # {'Name': '홍길동', 'Age': 25, 'Addr': '서울', 'Tel': '1234-1234'}

각 방법별로 성능을 확인해보면 update나 {a, b} 방법을 사용하여 병합하는 것이 좋습니다.

key와 value의 쌍을 삭제 시 del 혹은 pop을 사용합니다.

pop을 사용하면 삭제되는 value를 반환하게 됩니다.

a = {"Name":"홍길동", "Age":20, "Addr":"서울"}
del a["Name"]
print(a) # {'Age': 20, 'Addr': '서울'}

a = {"Name":"홍길동", "Age":20, "Addr":"서울"}
print(a.pop("Name")) # 홍길동
print(a) # {'Age': 20, 'Addr': '서울'}
print(a.pop("Tel", "do you not have phones?")) # do you not have phones?

요소를 삭제 시 키를 정확히 알고 있다면

del과 pop의 성능을 확인해보면 pop보다는 del을 사용하는 것이 좋습니다.

반복문 중 dict가 변경될 경우 RuntimeError가 발생하지만

copy를 이용하면 RuntimeError를 방지할 수 있습니다.

# RuntimeError: dictionary changed size during iteration 발생
# a = {"Name":"홍길동", "Age":20, "Addr":"서울"}
# for k in a.keys():
#     if k == "Addr": a["New Addr"]=a.pop(k)

a = {"Name":"홍길동", "Age":20, "Addr":"서울"}
for k in a.copy().keys():
    if k == "Addr": a["New Addr"]=a.pop(k)
print(a) # {'Name': '홍길동', 'Age': 20, 'New Addr': '서울'}
profile
IT 도서관

0개의 댓글