파이썬 자료구조 :: 딕셔너리 dict *

프로그래머스 기초 단계 6일차를 풀면서 자료구조가 많이 부족함을 느껴서 정리를 해볼려고 한다. 

[딕셔너리 dict 정리편]







참고 사이트 : 제대로 파이썬 (위키독스)


Container 타입 객체 

Iterable객체처럼 type으로 확인되지 않는 객체이고, 특성 속성을 가진 객체를 Container 객체라고 이야기한다. 

파이썬에 내장되어있는 Container 타입은 dict, set 이 있다.  

Container 객체는 순서정보를 포함하지 않아서, 선언할때랑 출력할때랑 값의 순서가 달라질 수 도 있다. 

Container타입들중에 순서를 가진 객체를 Sequence객체라 한다. list, tuple, str이 이에 해당 된다. 



dictionary  (dict) 

이 객체는 dict 타입이면서 동시에 Container 타입이고, iterable이다.  

이름처럼 사전과 비슷하다. 

단어에 뜻이 연결되어있는 사전처럼, dict는 key에 value 값들이 각각 매핑되어 있는 객체

dict 타입은 *매핑타입이기도 하다. 

* 매핑타입이란, key와 value 값이 한 쌍을 이루는 데이터 구조. key와 value를 연결(map)하는 데이터 구조를 매핑타입이라고 한다. 


dict 문법: 

dict_ex = { key1 : value1, key2 : value2 }

중괄호 안에, 키워드와 키워드에 매칭되는 값은 콜론(:)을 이용해 연결하고, 컴마(,)를 통해 key-value 값 구분


dict 선언: 

dict_1 = { }     #빈 dict 생성 

dict_2 = dict()         #dict 클래스를 활용한 dict 생성


dict 출력

key 값을 인덱스로 삼고, value 값을 출력한다.

dict[key] 

members = { 'name': 'aldonza', 'age': 20, 'nickname': 'dulcinea'}

#value 값 출력
print(members['name'])	         #출력 'aldonza'
print(members['age'])	         #출력 20
print(members['nickname'])      #출력 'dulcinea'

찾을려는 value 가 없으면, 에러가 난다.



dict 추가

빈 dict를 선언한 이후에 값 추가 가능

리스트의 append, insert 같은 추가 기능을 하는 메서드를 사용하지 않고, 
dict[key] = value 하면, 값이 추가가 된다. 
members = {}
members['name'] = 'aldonza'
members['age']  = 20
members['nickname'] = 'dulcinea'

print(members) #출력 {'name': 'aldonza', 'age': 20, 'nickname': 'dulcinea'}


만약, 기존에 있는 key 값에 새로운 value 를 주면 업데이트가 됨 (기존값은 사라짐)
a = {'x': 1}
a['x'] = 100
print(a)	#{'x': 100}



dict 제거

1. del members[key] 

위의 members와 x 딕셔너리를 활용한다고 했을때, del 키워드로 값을 제거 가능

메서드나 함수가 아닌 키워드이기 때문에 dict 객체 앞에 del를 써야한다. 


2. members.pop(key)

dict의 pop 제거 함수는 리스트, 튜플, 집합때랑 다르게 pop() 으로 하면 오류가 난다. 

매개변수로 key값을 입력해야한다 


3. members.popitem()

마지막 요소의 쌍을 한번에 삭제시킨다.


member = {'이름': ['홍길동', '승연'], '나이': [100, 20]}
del member['이름']
# {'나이': [100, 20]}

member = {'이름': ['홍길동', '승연'], '나이': [100, 20]}
member.pop('이름')
# {'나이': [100, 20]}

member = {'이름': ['홍길동', '승연'], '나이': [100, 20]}
member.popitem()
# {'이름': ['홍길동', '승연']} 





dict 메서드 

1. dict.setdefault(key, value) 

dict안에 만약 이미 해당 key값으로 값이 지정되어 있다면,

값을 덮어쓰지 않고, 기존에 있는 값을 리턴

만약 dict안에 해당 key가 없었다면, 지정한 값을 리턴해주고 dict안에 값을 세팅

>>> a = {'x':1, 'y':2}
>>> a.setdefault('x', 100)
1
>>> a
{'y': 2, 'x': 1}
>>> a.setdefault('z', 3)
3
>>> a
{'y': 2, 'z': 3, 'x': 1}




2. dict.get(key) 

dict안에 키워드에 매칭되는 값이 없다면 None을 리턴해주고, 키워드에 매칭되는 값이 있다면 해당 값을 리턴

get 메서드를 안쓰면, key 값에 매칭되는 값이 없을때 error를 발생하는데

get 메서드를 쓰면, 값이 없더라도 Error발생하지 않기때문에 유용함

>>> a = {'x': 1, 'y': 2}
>>> a
{'y': 2, 'x': 1}
>>> print(a.get('x'))
1
>>> print(a['z'])
KeyError 발생!
>>> print(a.get('z'))
None



3. dict1.update(dict2) 

dict1 에 dict2 를 합치는 것 

>>> a = {'x': 1, 'y: 2}
>>> b = {'z': 3}
>>> a.update(b)
>>> a
{'x':1, 'y':2, 'z': 3}



4. dict.keys() key 값만 뽑을때

5. dict.values() value 값만 뽑을때

6. dict.items() key, value 값 둘 다 뽑을때



정리코드
a = {'x':1 ,'y':2 , 'z': 3}

#dict
for key in a:
     print(key) 	#x - y - z
     print(a[key]) 	#1 - 2 - 3

#dict.values()
for value in a.values():
     print(value)	#1 - 2 - 3

#dict.items()
for twin in a.items() : 
     print(twin)	#('x', 1)-('y', 2)-('z', 3)

for key, value in a.items():
     print(key, value) 	#x 1 - y 2 - z 3


dict를 쓰는 문제는 대부분, A는 a다. B는 b다. 처럼 서로 대응되는 값일때 주로 사용하는 듯하다. 

출처: https://wikidocs.net/198057

출처: https://wikidocs.net/162243






댓글

이 블로그의 인기 게시물

[KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

KT 에이블스쿨 : 핀테크 아이디어 공모전

KT 에이블스쿨 : 6-7차 미니프로젝트 - 제안서 기반 솔류션 기획 및 설계