ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL. 18 Dictionary 조작하기
    TIL 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

    '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
Designed by Tistory.