-딕셔너리에 키-값 쌍 추가하는 두가지 메서드
1) setdefault: 키 값-쌍 추가
2) update: 키의 값 수정, 키가 엇으면 키-값 쌍 추가
-setdefault에 키만 주면 값은 None이 된다.
setdefault 예시)
x = {'a':1, 'b':2, 'c':3}
x.setdefault('d')
x.setdefault('e', 5)
5
print(x)
{'a': 1, 'b': 2, 'c': 3, 'd': None, 'e': 5}
-update(키=값)은 딕셔너리 키의 값 수정함.
-만약 키가 없으면 키-값 쌍을 추가함
update 예시
x = {'a':1, 'b':2, 'c':3}
x.update(a=10, d=4)
print(x)
{'a': 10, 'b': 2, 'c': 3, 'd': 4}
***update(키=값)은 키가 문자열 일때문 사용 가능하다+++
-만약 키가 숫자일 경우엔 update(딕셔너리)를 사용해 값을 수정할 수 있다.
x = {1: 'hi', 2:'bye'}
>>> x.update({1 : 'one', 2: 'two'})
>>> print(x)
{1: 'one', 2: 'two'}
-update(리스트), update(튜플)은 리스트와 튜플로 값을 수정한다.
-리스트는 [[키1, 값1]], [키2, 값2]]형식으로 키와 값을 리스트로 만들고 이 리스트를 다시 리스트 안에 넣어서 키-값 쌍을 나열해줌(튜플도 같은 형식)
x ={1: 'one', 2: 'two'}
>>> x.update([[1, 'ONE'], [2, 'TWO']])
>>> print(x)
{1: 'ONE', 2: 'TWO'}
-특히 update(반복가능한객체)는 키-값 쌍으로 된 반복 가능한 객체로 값을 수정함.
-다음과 같이 키 리스트와 값 리스트를 묶은 zip 객체로 값을 수정할 수 있다.
x.update(zip([1, 2], ['one', 'two']))
>>> print(x)
{1: 'one', 2: 'two'}
-pop사용(삭제한 뒤 삭제한 값 반환됨)
x ={1: 'one', 2: 'two'}
>>> x.pop(1)
'one'
>>> print(x)
{2: 'two'}
-pop(키, 기본값)처럼 기본값을 지정하면 딕셔너리에 키가 있을 때는 해당 키-값쌍을 삭제한 뒤 삭제한 값을 반환하지만 키가 없을 때는 기본값만 반환함.
x ={1: 'one', 2: 'two'}
>>> x.pop('z', 0)
0
-del도 사용가능
x ={1: 'one', 2: 'two'}
>>> del x[1]
>>> print(x)
{2: 'two'}
-popitem()은 딕셔너리에서 임의의 키-값쌍 삭제한 뒤 그 쌍을 튜플로 반환한다.
-참고로 파이썬 3.5와 그 이하 버전에서 popitem()사용하면 임의의 키-값 삭제.
x ={1: 'one', 2: 'two', 3: 'three'}
>>> x.popitem()
(3, 'three')
>>> print(x)
{1: 'one', 2: 'two'}
-clear()는 딕셔너리 모든 키-값쌍 삭제
x ={1: 'one', 2: 'two', 3: 'three'}
>>> x.clear()
>>> print(x)
{}
get(키)
x ={1: 'one', 2: 'two', 3: 'three'}
>>> x.get(1)
'one'
-참고로 해당 키가 딕셔너리에 없을 땐 기본값 반환
x ={1: 'one', 2: 'two', 3: 'three'}
>>> x.get(6, 0) #0을 기본값으로 할당
0
-다양한 메서드가 있다
1) items: 키-값쌍 모두 가져옴
2) keys: 키를 모두 가져옴
3) values: 값을 모두 가져옴.
x ={1: 'one', 2: 'two', 3: 'three'}
>>> x.items()
dict_items([(1, 'one'), (2, 'two'), (3, 'three')])
>>> x.keys()
dict_keys([1, 2, 3])
>>> x.values()
dict_values(['one', 'two', 'three'])
-dict.fromkeys(키리스트)는 키 리스트로 딕셔너리 생성하며 값은 모두 None이 된다.
keys = [1,2,3,'a','b']
>>> x = dict.fromkeys(keys)
>>> print(x)
{1: None, 2: None, 3: None, 'a': None, 'b': None}
-dict.fromkeys(키리스트,값)으로 키리스트와 값을 지정해당 해당 값이 키의 값으로 저장된다.
keys = [1,2,3,'a','b']
y = dict.fromkeys(keys, 10)
>>> print(y)
{1: 10, 2: 10, 3: 10, 'a': 10, 'b': 10}
>>>
키만 출력
for i in x:
print(i, end=' ')
a b c d
키, 값 출력
-문법:
for 키, 값 in 딕셔너리.items():
반복할 코드
예시
x = {'a':1, 'b':2, 'c':3, 'd':4}
>>> for hi, bye in x.items():
print(hi, bye)
a 1
b 2
c 3
d 4
키-값, 키, 값만 출력
items: 키-값 쌍 모두 출력
keys: 키를 모두 가져옴
values: 값을 모두 가져옴
key만 출력하기 예시)
x = {'a':1, 'b':2, 'c':3, 'd':4}
>>> for key in x.keys():
print(key)
a
b
c
d
value만 출력하기 예시)
>>> for zz in x.values():
print(zz)
1
2
3
4
-리스트와 마찬가지로 딕셔너리도 for와 if문 사용해서 딕셔너리 생성가능.
문법:
-문법: {키: 값 for 키, 값 in 딕셔너리}
-문법: dict({키: 값 for 키, 값 in 딕셔너리})
score = ['math', 'science', 'art', 'english']
>>> x = {key : value for key, value in dict.fromkeys(score).items()}
>>> print(x)
{'math': None, 'science': None, 'art': None, 'english': None}
>>>
-딕셔너리 표현식을 사용할 때는 for in 다음에 딕셔너리를 지정하고 items를 사용한다.
-키, 값을 가져온 뒤에는 키: 값 형식으로 변수나 값을 배치하여 딕셔너리를 생성함.
-keys로 키만 가져온 뒤 특정 값을 넣거나, values로 값을 가져온 뒤 값을 키로 이용 가능.
{key: 0 for key in dict.fromkeys(['a', 'b', 'c', 'd']).keys()}
{'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> {value: 0 for value in {'a':10, 'b': 20, 'c': 30, 'd': 40}.values()}
{10: 0, 20: 0, 30: 0, 40: 0}
-키와 값의 자리를 바꾸는 등 여러 가지로 응용할 수 있음
-키, 값자리 바꾸는 예시)
{value : key for key, value in {'a':10, 'b':20, 'c':30, 'd':40}.items()}
{10: 'a', 20: 'b', 30: 'c', 40: 'd'}
>>>
-딕셔너리 표현식은 딕셔너리에서 특정 값을 찾아서 삭제할 때 유용.
-dic은 특 정 키를 삭제하는 pop 메서드만 제공할 뿐, 특정 값을 삭제하는 메서드는 제공하지 않음.
-간단하게 for 반복문으로 반복하면서 del로 삭제하는 방식을 떠올릴 수 있음.
-하지만 아래처럼 하면 에러 발생.
dic은 for문 안에서 키-값 쌍 삭제하면 안됨.
ifr조건문 사용해서 삭제해야됨!
x = {'a':10, 'b':20, 'c':30, 'd':40}
>>> for key, value in x.items():
if value ==20:
del x[key]
오류발생
그러므로 아래와 같이 해야된다.
-문법1:{키: 값 for 키, 값 in 딕셔너리 if 조건식}
-문법2:dict({키: 값 for 키, 값 in 딕셔너리 if 조건식})
x ={'math': 'a', 'science': 'b', 'art': 'c', 'english': 'a'}
>>> x = {key : value for key, value in x.items() if value != 'a'}
>>> print(x)
{'science': 'b', 'art': 'c'}
내가만든 에시
score = {
'kim' : {
'math' : 100,
'art' : 90,
'music' : 80
},
'lee' : {
'math' : 90,
'art' : 70,
'music' : 60
},
'park' : {
'math' : 60,
'art' : 50,
'music' : 100
}
}
print(score['kim']['art'])
-딕셔너리 x를 y에 할당하면 두 딕셔너리는 완전히 같아진다. 하나를 변경하면 다른 하나도 변경됨
x ={'math': 'a', 'science': 'b', 'art': 'c', 'english': 'a'}
>>> y = x
>>> x is y
True
>>> y['math']='f'
>>> print(x)
{'math': 'f', 'science': 'b', 'art': 'c', 'english': 'a'}
-내용은 같지만 독립인 딕셔너리를 만들려면 copy()를 이용한다.
x ={'math': 'a', 'science': 'b', 'art': 'c', 'english': 'a'}
>>> y = x.copy()
>>> x is y
False
>>> x == y
True
-중첩 dic은 copy로 복사해도 서로 완전히 하나가 된다.
하나를 변경하면 다른 하나도 변경됨
score = {
'kim' : {
'math' : 100,
'art' : 90,
'music' : 80
},
'lee' : {
'math' : 90,
'art' : 70,
'music' : 60
},
'park' : {
'math' : 60,
'art' : 50,
'music' : 100
}
}
>>> y = score.copy()
>>> y['kim']['math'] = 10
>>> print(score['kim']['math'])
10
>>>
-중첩 딕셔너리를 완전히 복사하려면 copy메서드 대신 copy 모듈의 deepcopy 함수를 사용해야 함.
score = {
'kim' : {
'math' : 100,
'art' : 90,
'music' : 80
},
'lee' : {
'math' : 90,
'art' : 70,
'music' : 60
},
'park' : {
'math' : 60,
'art' : 50,
'music' : 100
}
}
>>> import copy
>>> y = copy.deepcopy(score)