-
TIL. 18 Dictionary 조작하기TIL 2020. 10. 26. 23:23728x90
## 딕셔너리에 키와 기본값 저장하기
# setdefault(키, 값)
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
x.setdefault('e')
print(x)
:: {'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': None}
## '키' 만 입력할 경우 값은 None으로 저장
x.setdefault('f', 100)
print(x)
:: {'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': None, 'f': 100}
## 키 , 값 추가
## 여기서 IDLE을 사용할 경우 f 키 를 추가하고 값에 100을 저장한뒤 값 100을 다시 반환한다.
# >>> x.setdefault('f', 100)
# 100
## 딕셔너리 키와 값 수정하기
## update(키 = 값)
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
x.update(a = 90)
print(x)
:: {'a': 90, 'b': 20, 'c': 30, 'd': 40}
## a라는 키의 값을 90 으로 변경한다.
x.update(e = 50)
print(x)
:: {'a': 90, 'b': 20, 'c': 30, 'd': 40, 'e': 50}
## 만약 딕셔너리 x에 e라는 키가 없다면, 딕셔너리에 'e' : 50 을 추가한다.
x.update(a = 900, f = 60)
print(x)
:: {'a': 900, 'b': 20, 'c': 30, 'd': 40, 'e': 50, 'f': 60}
## 여러 키, 값 쌍 여러개를 ,(콤마)를 이용하여 수정, 추가 할 수 있다.
y = {1: 'one', 2: 'two'}
# y.update(1 : 'ONE') ## error -> update 메서드는 키 값이 문자열 일때만 쓸 수 있기 때문
y.update({1 : 'ONE', 2 : 'TWO', 3 : 'THREE'})
print(y)
:: {1: 'ONE', 2: 'TWO', 3: 'THREE'}
## 딕셔너리의 키 값이 숫자일 경우 update({딕셔너리})처럼 구성하여 값을 수정, 추가 할 수 있다. (중괄호)
y.update([[2,'two'],[4,'FOUR']]) # [리스트]// (튜플) 가능 # (((2,'two'),(4,'FOUR')))
print(y)
:: {1: 'ONE', 2: 'two', 3: 'THREE', 4: 'FOUR'}
## [[키1, 값1], [키2, 값2]] 과 같은 구조로 키와 값을 리스트 or 튜플로 만들고 이 리스트를 다시 리스트 안에 넣는 방법으로도 수정할 수 있다.
## 튜플도 같은 구조로 수정 가능.
y.update(zip([2, 3], ['TWOTWO', 'three']))
print(y)
:: {1: 'ONE', 2: 'TWOTWO', 3: 'three', 4: 'FOUR'}
## 특히나 update(반복 가능한 객체)는 키 값 쌍으로 된 반복 가능한 객체로 값을 수정한다, 즉 키 리스트와 값 리스트를 묶은 zip 객체를 이용해도 수정이 가능하다
## update(zip([키1, 키2], [값1, 값2]))
## setdefault 와 update의 차이점 ##
# setdefault는 키- 값 쌍을 "추가" 만 할 수 있고, "이미 들어있는 키의 값"은 수정할 수 없다.
# 반면 update는 키- 값 쌍 추가와 함께 "이미 들어있는 키의 값"을 수정 할 수 있다
## 딕셔너리 키, 값 쌍 삭제하기
# pop(키)
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
x.pop('b')
print(x)
:: {'a': 10, 'c': 30, 'd': 40}
## pop(키) 딕셔너리의 특정 키- 값 쌍을 삭제한 뒤에 삭제한 값을 '반환'한다. (IDLE사용시 확인가능)
# >>> x.pop('b')
# 20
x.pop('z', 0)
## 딕셔너리에 특정 키가 없을 경우 기본값을 반환 (IDLE)
## x.pop('Z') 만 입력시 키가 없는 경우 error 발생
# popitem()
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
x.popitem()
print(x)
:: {'a': 10, 'b': 20, 'c': 30}
## popitem 메서드는 python 3.6 이상의 버전에서는 딕셔너리의 "맨 마지막" 키, 값 쌍을 삭제한다.
## 3.5 이하 버전에서는 랜덤하게 지정하여 키, 값 쌍을 삭제한다.
# del
# del [키]
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
del x['c']
print(x)
:: {'a': 10, 'b': 20, 'd': 40}
## del [키] 로 키, 값 쌍 삭제가능
# clear
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
x.clear()
print(x)
:: {}
## 모든 키, 값 쌍을 삭제한 후 빈 딕셔너리로 만들어줌!
## 딕셔너리에서 키의 값 가져오기!
# get
# get(키)
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
print(x.get('a'))
:: 10
print(x.get('z'))
:: None
print(x.get('z', 0))
:: 0
## 딕셔너리에 없는 키를 요청할 경우 기본값을 반환 or 지정한 0을 반환
## 리스트와 튜플로 딕셔너리 만들기
## dict.fromkeys(키리스트, 값)
# 먼저, key 로 사용할 리스트, 튜플이 필요하다
keys = ['a', 'b', 'c', 'd']
x = dict.fromkeys(keys)
print(x)
:: {'a': None, 'b': None, 'c': None, 'd': None}
y = dict.fromkeys(keys, 100)
print(y)
:: {'a': 100, 'b': 100, 'c': 100, 'd': 100}
## 값이 없는 경우 모두 None으로 딕셔너리 생성됨 , 값이 있을 경우 값을 모두 나눠가지며 딕셔너리 생성함
## 반복문으로 딕셔너리의 키, 값 쌍 모두 출력하기
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
for i in x:
print(i, end=' ')
:: a b c d
for k,v in x.items():
print(k, v, end=' ')
:: a 10 b 20 c 30 d 40
for k, v in {'a': 10, 'b': 20, 'c': 30, 'd': 40}.items():
print(k, v, end=' ')
:: a 10 b 20 c 30 d 40
## 반복문 사용시 변수 하나 만으로 출력시 "키" 만 출력
## key와 values 를 동시에 출력할 수 있으며 // key, value, key + value 선택적으로 출력이 가능하다.
## 딕셔너리 표현식
## 리스트와 마찬가지로 for문 if 문을 사용하여 아래와 같은 표현식으로 딕셔너리를 사용할 수 있다.
## {키: 값 for 키, 값 in 딕셔너리} __python 다운 방법 추천
## dict({키: 값 for 키, 값 in 딕셔너리})
keys = ['a', 'b', 'c', 'd']
x = {key : value for key, value in dict.fromkeys(keys).items() }
print(x)
:: {'a': None, 'b': None, 'c': None, 'd': None}
## 딕셔너리 표현식을 사용할 경우 {키: 값 for 키, 값 in 딕셔너리}
## "딕셔너리"자리에 dict.fromkeys 함수 사용시 .keys(), .values(), .items()을 붙혀줘야 동작을 한다.
keys = ['a', 'b', 'c', 'd']
y = {key : value for key, value in dict.fromkeys(keys,100).items() }
print(y # error
## 또한 keys list == ['a', 'b', 'c', 'd'] 만으로는 키, 값 쌍 중 값을 넣어주는 형식으로는 불가능하다.
## (keys, 100).items() // (keys, 100) 모두 불가능
keys = ['a', 'b', 'c', 'd']
c = { key : 0 for key in dict.fromkeys(keys).keys()}
print(c)
:: {'a': 0, 'b': 0, 'c': 0, 'd': 0}
## "키"만 가져오는 법_1
d = { key : 100 for key in dict.fromkeys(['a', 'b', 'c', 'd']).keys()}
print(d)
:: {'a': 100, 'b': 100, 'c': 100, 'd': 100}
## "키"만 가져오는 법_2
key = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
e = { value : 0 for value in key.values()}
print(e)
:: {10: 0, 20: 0, 30: 0, 40: 0}
## "값"만 가져오는 법
## key와 같은 딕셔너리가 필요함
f = { value : key for key, value in key.items()}
print(f)
:: {10: 'a', 20: 'b', 30: 'c', 40: 'd'}
## values 와 keys 자리를 바꾸는 등의 응용편
### 딕셔너리 표현식으로 if 문 사용하기 ###
## {키: 값 for 키, 값 in 딕셔너리 if 조건식}___python 방법 추천
## dict({키: 값 for 키, 값 in 딕셔너리 if 조건식})
## 중요하게 집고 넘어가야할 점 ##
## 딕셔너리 표현식을 사용해보면 복잡하기만하고 dict.fromkeys 함수와 결과가 큰차이가 없다.
## 그럼에도 왜 표현식을 사용하는 걸까
## 답은 딕셔너리 표현식은 딕셔너리에서 특정 값을 찾아서 삭제할 때 유용하다
## 딕셔너리는 특정 "키"를 삭제하는 pop 메서드만 제공할뿐 특정 "값"을 삭제하는 메서드를 제공하지 않는다.
## 특정 값을 삭제하기 편하도록 for 와 if문을 생각할 수 있으나 for문으로는 특정 값을 삭제할수가 없는데
## 아래에서 이유를 알아보자.
## for문을 이용하여 목표 값이 20인 키, 값 쌍을 삭제해보자 ##
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
for key, value in x.items():
if value == 20:
del x[key]
print(x) ## error --> 반복도중 딕셔너리의 크기가 바뀌는 에러가 발생
## 즉 딕셔너리는 for 문으로 키-값쌍을 삭제하면 안됨.
## if 문을 이용하여 목표 값이 20인 키, 값 쌍을 삭제해보자 ##
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
x = {key : value for key, value in x.items() if value != 20}
print(x)
:: {'a': 10, 'c': 30, 'd': 40}
## 딕셔너리 표현식에서 if 문을 사용하여 삭제할 값을 제외시키면 된다!!
## 만약에 value 값이 20이 아닌 값들로만 key와 value 를 넘겨주세요 라는 뜻
## 동작 순서 if 문 부터 역순으로 시작 (표현식 모두 동일)
## 딕셔너리 안에서 딕셔너리 사용하기
## 딕셔너리 = {키1: {키A: 값A}, 키2: {키B: 값B}}
my_BF = {
'insu' : {
'height' : 150,
'weight' : 70,
'age' : 29
},
'gucastle' : {
'height' : 180,
'weight' : 80,
'age' : 29
},
'jery' : {
'height' : 160,
'weight' : 55,
'age' : 28
}
}
print(my_BF['gucastle']['weight'])
# 몸무게 80
## my_BF에서 gucastle을 먼저 찾고 다시한번 weight를 찾아 해당 값을 출력한다.
## 딕셔너리 = {'insu': {'height': 150, 'weight' : 70, 'age' : 29}, gucastle: {'height': 180, 'weight' : 80, 'age' : 29}...}
## 으로 되어 있는 상태
## 이러한 것을 중첩 딕셔너리라고도 부르며, 딕셔너리 안에 딕셔너리가 계속 들어갈 수 있다.
## 여기서는 딕셔너리가 두 단계로 구성되어 있어 대괄호를 두번 사용하였으며 , 각 키와 값 사이에 들어가는 ,(콤마)에 주의하자
## 딕셔너리의 할당과 복사
## 딕셔너리의 할당과 복사 (#리스트와 동일함#)
## 할당과 복사는 다르다.
## 할당
x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
y = x
print(y)
:: {'a': 0, 'b': 0, 'c': 0, 'd': 0}
## 할당 : 똑같은 장소가 있는데 그 장소를 x로 부르기도 하고 y로 부르기도 하는 것과 같다
## 현재 딕셔너리 1개 변수는 2개 (x, y) 인상태이다.
print(x is y)
:: True
## 변수 이름만 다를뿐 딕셔너리 x, y는 같은 객체이다.
y['a'] = 100
print(x)
print(y)
:: {'a': 100, 'b': 0, 'c': 0, 'd': 0}
:: {'a': 100, 'b': 0, 'c': 0, 'd': 0}
## 하나만 바꿔도 모두 반영
## 복사
# copy()
x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
y = x.copy()
print(x is y)
:: False
print(x == y)
:: True
## 복사 : 하나의 장소를 복사하는 것으로 장소 1 = x , 장소 2 = y 같은 의미
## 객체를 물어보는 is에서는 다른 객체임을 알려주며
## 딕셔너리 안의 키 또는 값 중 하나라도 달라질경우 False 출력한다.
y['a'] = 100
print(x)
:: {'a': 0, 'b': 0, 'c': 0, 'd': 0}
print(y)
:: {'a': 100, 'b': 0, 'c': 0, 'd': 0}
## 복사를 상태에서는 y만 변경이 이루어짐
## 중첩 딕셔너리에서의 할당과 복사
## 할당은 동일
## 복사
x = {'a': {'python': '2.7'}, 'b': {'python': '3.6'}}
y = x.copy()
print(x is y)
:: False
## 중첩 딕셔너리에서는 copy를 써도 서도 다른 객체로 인식!!
print(x == y)
:: True
y['a']['python'] = '2.7.15'
print(x)
:: {'a': {'python': '2.7.15'}, 'b': {'python': '3.6'}}
print(y)
:: {'a': {'python': '2.7.15'}, 'b': {'python': '3.6'}}
## 중첩 딕셔너리에서의 복사는 할당과 동일하다
## 하지만 copy 모듈의 deepcopy함수를 사용하면 다른 객체로 깊은 복사를 할 수 있다.
x = {'a': {'python': '2.7'}, 'b': {'python': '3.6'}}
import copy
y = copy.deepcopy(x) # copy.deepcopy() 함수를 사용한 깊은 복사
print(x is y)
:: False
print(x == y)
:: True
y['a']['python'] = '2.7.15'
print(x)
:: {'a': {'python': '2.7'}, 'b': {'python': '3.6'}}
print(y)
:: {'a': {'python': '2.7.15'}, 'b': {'python': '3.6'}}
출처 : dojang.io/
728x90'TIL' 카테고리의 다른 글
TIL. 20 set_조작하기_2 (0) 2020.10.28 TIL.19 set 조작하기 (0) 2020.10.27 TIL. 17 python 과제 (목차확인) (0) 2020.10.25 TIL. 16 문자열 서식 지정자 및 포매팅 사용하기 (0) 2020.10.24 TIL. 15 again python_문자열 메서드 (0) 2020.10.23