파이썬에서 딕셔너리(Dictionary)는 키(key)와 값(value) 쌍을 저장하는 자료형으로 자바의 Map, C++의 std::map, JS의 Object와 비슷하게 사용된다 .
딕셔너리의 생성 및 사용
딕셔너리를 생성할때는 중괄호를 사용하고 내부에 값을 key:value 쌍으로 저장한다.
person = {'name': '홍길동', 'age': 25, 'job': 'developer'}
empty_dict = {}
키와 값을 추가하거나 값을 수정하는 방법은 아래와 같이 추가하는 키 값으로 값을 초기화하거나 기존 키에 값을 넣으면 된다.
person['city'] = 'Seoul' # 추가
person['age'] = 26 # 수정
값에 접근하는 방법은 아래와 같이 딕셔너리명에 대괄호를 사용해서 내부에 키값을 넣어주면 된다.
print(person['name']) # '홍길동'
그런데 이렇게 사용하면 해당 키가 존재하지 않을 경우 에러를 발생시킨다.
print(person['gender']) # exception 발생
그럴때 .get 메서드를 사용하면 존재하지 않는 키일 경우 none을 반환한다.
print(person.get('job')) # 'developer'
print(person.get('gender')) # None (에러 발생 x)
그리고 get메서드에 두번째 인자로 값을 넣어주면 첫번째 인자로 구성된 키로 값이 존재하지 않을 경우 None을 반환하는게 아니라 두번째 인자를 반환한다.
print(person.get('gender', 'male')) # 'male'
값을 삭제할때는 두가지방식을 사용할 수 있는데 먼저 del 키워드이다.
del 키워드와 함께 딕셔너리명과 대괄호로 키값을 넣어 전달하면 해당 키와 요소를 제거한다.
del person["name"]
print(person) # {'age': 25, 'job': 'developer'}
그리고 리스트와 마찬가지로 pop메서드를 사용해서 값을 제거할 수 도 있다
pop메서드의 경우 리스트는 인덱스를 전달해줘야 했으나 이번에는 key값을 제거하면 해당 키와 값을 삭제하고 그 값을 반환한다.
print(person.pop("name")) # '홍길동'
print(person) # {'age': 25, 'job': 'developer'}
딕셔너리의 주요 메서드
1. key(): 딕셔너리의 키 목록을 반환한다.
print(person.keys()) # dict_keys(['name', 'job'])
반환값의 형태는 딕셔너리의 키만 모아놓은 뷰(view)객체로 dick_key 객체가 반환되며 이 반환값으로 리스트 처럼 인덱싱 및 슬라이싱을 바로 사용할 수는 없고
print(person.keys()[1]) # 인덱싱 바로 사용불가
print(person.keys()[0:1]) # 슬라이싱 바로 사용불가
for문의 순회는 가능하기에 이걸 사용해서 값을 활용하면 된다
keys = person.keys()
keySet = []
for key in keys: # dict_key의 요소를 하나씩 뽑아다
keySet.append(key) # keySet이라는 리스트에 저장
print(keySet) # ['age', 'job']
바로 리스트로 만들고 싶다면 dict_key 객체를 list() 함수로 감싸면 리스트 객체로 전환된다.
keySet = list(person.keys())
print(keySet) #['age', 'job']
2. in 연산자의 사용
딕셔너리 내부에 특정 키가 존재하는지 확인할때 in 연산자를 활용할 수 있다.
person = {'name': '홍길동', 'age': 25, 'job': 'developer'}
if 'name' in person.keys():
print("name이라는 키가 존재함")
그런데 사실 .key키워드를 사용하지 않고 아래와 같이 사용해도 키의 존재여부를 확인할 수 있다.
person = {'name': '홍길동', 'age': 25, 'job': 'developer'}
if 'name' in person:
print("name이라는 키가 존재함")
3. set 연산이 가능한 dict_key 객체
dict_key 객체는 set(집합) 연산(&, | )이 가능하다.
a = {'x': 1, 'y': 2}
b = {'y': 3, 'z': 4}
common_keys = a.keys() & b.keys() # 교집합
print(common_keys) # {'y'}
all_keys = a.keys() | b.keys() # 합집합
print(all_keys) # {'x', 'y', 'z'}
4. sorted(dict_key): 키값을 정렬해서 리스트로 반환한다.
person = {'name': '홍길동', 'age': 25, 'job': 'developer'}
key_list = sorted(person.keys())
print(key_list) # ['age', 'job', 'name']
5. values() : 값을 출력한다.
출력시엔 dict_values객체로 dict_keys와 비슷한 기능을 한다.
person = {'name': '홍길동', 'age': 25, 'job': 'developer'}
print(person.values()) # dict_values(['홍길동', 25, 'developer'])
6. items(): 키, 값 쌍으로 출력한다
출력시엔 dict_items 객체로 dict_keys와 dict_values와는 다르게 내부에 튜플의 형태로 구성된 객체로 반환된다.
print(person.items()) # dict_items([('name', '홍길동'), ('age', 25), ('job', 'developer')])
print(list(person.items())) # [('name', '홍길동'), ('age', 25), ('job', 'developer')]
list() 메서드로 감쌌을때 튜플을 담은 리스트의 형태가 된다.