[python] dictionary 선언, 접근, 수정, 삭제, 변환, 복사

2022. 1. 19. 13:29개발 관련/python

목차


     

    Dictionary

    immutable한 key와 mutable한 value로 맵핑되어 있는 순서가 없는 집합

     

     

    특징

    1. 순서가 없다. = index로 접근할 수 없다.
    2. key값은 중복될 수 없다.
    3. key값으로 value(값)에 접근한다.

     

    요약

    dic = {}
    dic = {'a' : 1, 'b' : 2, 3 : 3, 'c' : 'c', 'milk' : [0, 1, 2, 3, 5]}
    
    dic['a'] = 0
    dic['milk'].append(22)
    
    'a' in dic		# True
    'a' not in dic		# False
    
    for k, v in dic.items() :
      print(k, v)
    
    id_list = ['01001', '01220']
    dic2 = {id : 0 for id in id_list}	# key값은 id_list, value값은 0으로 초기화
    dic3 = {id : [] for id in id_list}	# key값은 id_list, value값은 list로 초기화
    
    del dic['a']
    
    dic_copy = dic.copy()	# shallow copy
    
    import copy
    dic_deep_copy = copy.deepcopy(dic)		# deep copy
    
    dict( (['a', 0], ['b', 1], ['c', 2]) )		# dict로 변환

     

     

     

     

     

    * pprint : dictionary 값을 편하게 볼 수 있게 해주는 print 메소드 ( 길이가 길어야 개행되어 나온다.)

    from pprint import pprint as pp
    dic = {'aaaaaaaaaaaaaaaa': 1, 'bbbbb': 1, 'list' : [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3] }
    pp(a)
    
    # {'aaaaaaaaaaaaaaaa': 1,
    #  'bbbbb': 1,
    #  'list': [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]}

     

    선언 : { }

    • key값은 중복될 수 없다.
      • 만일 키가 중복된다면, 마지막 값으로 덮어씌워진다.
    • 키는 immutable한 값은 사용할 수 있지만 mutable한 객체는 사용할 수 없다.
      • immutable : 상수(int, float, string, bool 등의 타입을 갖는 데이터), tuple
      • mutable : 추가하여 변할 수 있는 값. list, dictionary 등
    • value값에 list, tuple, dict 등도 올 수 있다.
    dic1 = dict()
    dic2 = {}	# 빈 dictionary 객체 선언
    print(type(dic1), type(dic2))	# <class 'dict'> <class 'dict'>
    
    dic = {"key1" : 0, "key2" : 11}		# 초기화
    
    key_list = ["key1", "key2"]
    dic = {key : 0 for key in key_list}		# 주어진 key_list를 key값으로, value는 0으로 하도록 초기화
    
    dic = {key : [] for key in key_list}		# 주어진 key_list를 key값으로, value는 빈 list로 하도록 초기화
    
    
    dic = {0.1 : 1, 5 : 5, "key1" : 5}	# key값은 숫자형도 가능하다. value는 중복될 수 있다. key값의 타입을 맞출 필요가 없다.
    dic = {(0, 1) : 1, ('str', 1) : 2 }		# key값은 tuple형도 가능하다.
    dic = { True: 5, "a" : 2, 0.1 : 1 }		# key값은 bool형도 가능하다.
    
    dic = {"a" : 1, "a" : 2 }	# key값이 중복된다면 마지막 값으로 저장(덮어씌워지게)된다.
    
    dic = {"a" : {"a":1}, "b" : {"a" : 1}}	# dict의 value에 dic가 올 수 있다.

     

     

    접근 ( access ) , 수정 ( update ), 삭제 ( delete )

    • 순서가 없다. = index로 접근할 수 없다.
    • key로만 접근 가능하다!!
    dic = {'a' : 1, 'b' : 2, 3 : 2, 'c' : 'c', 'milk' : [0, 1, 2, 3, 5]}
    
    print(dic['a'])		# 1
    print(dic[3])		# 2
    print(dic['milk'])	# [0, 1, 2, 3, 5]
    
    dic['milk'] = 'cool'	# value 수정
    print(dic['milk'])	# 'cool'
    
    'a' in dic		# True
    'a' not in dic		# False
    
    dic[0]		# KeyError 발생!!!!

     

    • dic.update를 통해 여러값 수정, 추가를 할 수 있다.
      • 해당 key값이 없을 때는 추가된다.
    dic = {'a': 0, 'b': 1, 'list' : [1, 2, 3] }
    
    dic.update({'a' : 100, 'list' : [0], 'new_tuple' : (0, 1)})
    
    print(dic)
    # {'a': 100, 'b': 1, 'list': [0], 'new_tuple': (0, 1)}

     

    • 삭제
      • 존재하지 않는 key를 delete하면 KeyError 발생!!
    dic = {'a': 0, 'b': 1, 'list' : [1, 2, 3] }
    
    del dic['a']
    
    print(dic)	# {'b': 1, 'list' : [1, 2, 3] }
    
    # not exist.
    del dic['a']	# KeyError!!! 없는 값을 delete하였다.

     

     

    for문 ( 접근, 순회 )

     

    dic = {'a' : 1, 'b' : 2, 3 : 3, 'c' : 'c', 'milk' : [0, 1, 2, 3, 5]}
    
    for key in dic :		# 각 key마다 개행되어 나온다. 한줄에 하나의 key로 나온다
      print(key)	# a b 3 c milk
      
    for key in dic.keys() :		# 위와 같게 나온다.
      print(key)	# a b 3 c milk
    
    # list comprehension
    print([key for key in dic.keys()])	# ['a', 'b', 3, 'c', 'milk']
    
    print([key for key in dic.values()])	# [1, 2, 3, 'c', [0, 1, 2, 3, 5]]
    
    print([key for key in dic.items()])
    # [('a', 1), ('b', 2), (3, 3), ('c', 'c'), ('milk', [0, 1, 2, 3, 5])]

     

     

    복사 ( shallow copy, deep copy )

    • shallow copy
      • 주소값을 복사한 것이기 때문에 복사본 혹은 원본에 값을 추가(수정)한다면 두 곳 모두 추가(수정)된다.
      • a의 'list' key의 값에 5 추가
      • dic의 'list' key의 값에 7 추가
      • => 두 딕셔너리의 'list' key 모두에 5와 7이 추가되었다.
    dic = {'a': 0, 'b': 1, 'list' : [1, 2, 3]}
    
    a = dic.copy()		# shallow copy 1 
    a = dict(dic)		# shallow copy 2
    
    dic['list'].append(7)
    a['list'].append(5)
    
    # dic(원본)는 {'a': 0, 'b': 1, 'list': [1, 2, 3, 5, 7]}
    # a(복사본)는 {'a': 0, 'b': 1, 'list': [1, 2, 3, 5, 7]}
    
    # a == dic

     

     

    • deep copy
      • 새로운 주소값을 할당한다. = 새로 선언된 값
      • dic의 'list' key의 값에 7 추가
      • a의 'list' key의 값에 5 추가
      • => 두 딕셔너리의 각각에 7과 5가 추가되었다.
    import copy
    
    dic = {'a': 0, 'b': 1, 'list' : [1, 2, 3]}
    a = copy.deepcopy(dic)		# deep copy
    
    dic['list'].append(7)
    a['list'].append(5)
    
    # dic : {'a': 0, 'b': 1, 'list': [1, 2, 3, 7]}
    # a : {'a': 0, 'b': 1, 'list': [1, 2, 3, 5]}
    
    # dic != a

     

     

     

    list, tuple -> dictionary 변환

     

    list_in_list = [[1, 2], [3, 4]]		# {1: 2, 3: 4}
    print( dict(list_in_list) )
    
    tuple_in_tuple = ( ('a', 1), ('c', 2) )
    print( dict(tuple_in_tuple) )		# {'a': 1, 'c': 2}
    
    
    list_in_tuple = ( [1, 'a'], ['c', 3] )		
    print( dict(list_in_tuple) )		# {1: 'a', 'c': 3}
    
    tuple_in_list = [ (1, 'a'), ('c', 3) ]
    print( dict(tuple_in_list) )		# {1: 'a', 'c': 3}
    
    tuple_in_list2 = [ (1, 'a'), ('c', 3), ('d', 'a') ]
    print( dict(tuple_in_list2) )		# {1: 'a', 'c': 3, 'd': 'a'}
    
    
    tuple_in_tuple = (('a', 1, 2), ('c', 2, 4))
    print( dict(tuple_in_tuple) )		# ValueError!!! 2개의 요소만 dictionary로 변환 가능
    
    
    # list to dictionary도 가능 (dict -> list)
    dic = {1: 'a', 'c': 3}
    list(dic)		# [1, 'c']

     


    참고 

    wikidocs, 17. dictionary(딕셔너리), https://wikidocs.net/16043

     

    17. dictionary(딕셔너리)

    ## 1. dictionary(딕셔너리) - 딕셔너리 타입은 immutable한 키(key)와 mutable한 값(value)으로 맵핑되어 있는 순서가 없는 집합입니다. ...

    wikidocs.net