[python] dictionary 선언, 접근, 수정, 삭제, 변환, 복사
2022. 1. 19. 13:29ㆍ개발 관련/python
목차
Dictionary
immutable한 key와 mutable한 value로 맵핑되어 있는 순서가 없는 집합
특징
- 순서가 없다. = index로 접근할 수 없다.
- key값은 중복될 수 없다.
- 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