TIL

TIL. 18 Dictionary 조작하기

codermun 2020. 10. 26. 23:23
728x90
반응형

## 딕셔너리에 키와 기본값 저장하기

 

# 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 = 900f = 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([23], ['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/

 

코딩 도장

 

dojang.io

728x90
반응형