[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