본문 바로가기

Programming Language/Python

python dictionary(딕서녀리)

* Python에서 사용하는 자료형인 dictionary란?

- dictinoary 타입은 immutable한 key와 mutable한 value으로 맵핌되어 있는 순서가 없는 집합니다.

- 중괄호{}로 되어있고, 키와 값이 있다.

- 예시

{"a": 1, "b": 2}

- key로는 immutable한 값은 사용할 수 있지만, mutable한 객체는 사용할 수 없다.

# immutable한 key(사용가능)
a = {1: 5, 2: 3}  # int
a = {(1,5): 5, (3,3): 3}   # tuple
a = {3,6: 5, "abc": 3}   # float, str
a = {True: 5, "abc": 3}   # bool


# mutable한 key(사용불가)
a = { {1, 3}: 5, {3, 5}: 3}  # set error
a = { [1,3]: 5, [3,5]: 3 }   # list error
a = {  {"a":1}: 5, "abc": 3 }   # dict error

 

- 값은 중복 가능하지만, key가 중복되면 마지막 값으로 덮어씌워진다

{"a": 1, "a": 2}   # reslut: {'a': 2}

 

- 순서가 없기 때문에 index로는 접근할 수 없고, 키로 접근할 수 있다

d = {"abc": 1, "def": 2}
d[0]  # KeyError
d["abc"]  # print result: 1

 

- mutable한 객체이므로 키로 접근하여 값을 변경할 수 있다

d = {"abc": 1, "def": 2}
d["abc"] = 5
d   # result: {"abc": 5, "def": 2}

 

- 새로운 키와 값을 dict name[new key] = new value 형식으로 추가해줄 수 있다

d = {"abc": 5, "def": 2}
d["ghi"] = 999
d   # result: {"abc": 5, "def": 2, "ghi": 999}

 

* dictionary(딕셔너리) 선언

- dictionary 선언할때는 빈 중괄호를 사용한다. (set 중괄호를 이용하지만 빈 중괄호를 이용하면 type은 dict)

- dictionary로 명시적으로 선언할 수도 있다

e = {}
type(e)   # <class 'dict'>
f = dict()
type(f)   # <class 'dict'>

- dict constructor를 통해서 아래와 같이 바로 키와 값을 할당하며 선언할 수 있다

newdict = dict(alice = 5, bob = 20, tony = 15, suzy = 30)
newdict   # {"alice": 5, "bob": 20, "tony": 15, "suzy": 30}

 

* dictionary 변환

- "리스트 속에 리스트나 튜플", "튜플속에 리스트나 튜플"의 값을 키와 value로 나란히 입력하면 dict로 변형할 수 있다

name_and_ages = [['alice', 5], ['bob', 13]]
dict(name_and_ages)   # {'alice': 5, 'bob': 13}

name_and_ages = [('alice', 5), ('bob', 13)]
dict(name_and_ages)  # {'alice': 5, 'bob': 13}

name_and_ages = (('alice', 5), ('bob', 13))
dict(name_and_ages)  # {'alice': 5, 'bob': 13}

name_and_ages = (['alice', 5], ['bob', 13])
dict(name_and_ages)  # {'alice': 5, 'bob': 13}

 

* dictionary 복사

- shallow copy 1

a = {'alice': [1, 2, 3], 'bob': 20, 'tony': 15, 'suzy': 30}
b = a.copy()
b['alice'].append(5)
print(b)   # {'alice': [1, 2, 3, 5], 'bob': 20, 'tony': 15, 'suzy': 30}
print(a)   # {'alice': [1, 2, 3, 5], 'bob': 20, 'tony': 15, 'suzy': 30}

id(a)   # 4373610288
id(b)   # 4374389816

id(a['alice'])   # 4374408136
id(b['alice'])   # 4374408136

 

 

- shallow copy 2

a = {'alice': [1, 2, 3], 'bob': 20, 'tony': 15, 'suzy': 30}
b = dict(a)
print(a)   # {'alice': [1, 2, 3], 'bob': 20, 'tony': 15, 'suzy': 30}
print(b)   # {'alice': [1, 2, 3], 'bob': 20, 'tony': 15, 'suzy': 30}

id(a)   # 4334645680
id(b)   # 4334648920

id(a['alice'])   # 4374408136
id(b['alice'])   # 4374408136

 

- deep copy

import copy
a = {'alice': [1, 2, 3], 'bob': 20, 'tony': 15, 'suzy': 30}
b = copy.deepcopy(a)
b['alice'].append(5)
print(b)   # {'alice': [1, 2, 3, 5], 'bob': 20, 'tony': 15, 'suzy': 30}
print(a)   # {'alice': [1, 2, 3], 'bob': 20, 'tony': 15, 'suzy': 30}

 

- shallow copy(얕은 복사), deep copy(깊은 복사)란?

단순복제는 완전히 동일한 객체이다. 포인터가 가리키는 주소도 같다.

얕은복사는 복합객체(껍데기)만 복사하고 그 내용은 동일한 객체이다. 즉 껍데기 리스트의 주소는 다르지만, 그 안의 내부 객체는 동일한 객체이고 포인터도 같다.

깊은복사는 복합객체(껍데기) 복사+그 내용도 재귀적으로 복사하는 것이다. 즉 껍데기 리스트의 주소도 다르고, 그 안에 내부 객체또한 다른 포인터이다.

 

* dictionary update(여러값 수정)

- 단일값 수정은 키로 접근하여 값을 할당

a = {'alice': [1, 2, 3], 'bob': 20, 'tony': 15, 'suzy': 30}
a['alice'] = 5
a   # {'alice': 5, 'bob': 20, 'tony': 15, 'suzy': 30}

 

- 여러값 수정은 update method 이용, 키가 없는 값이면 추가된다

a = {'alice': [1, 2, 3], 'bob': 20, 'tony': 15, 'suzy': 30}
a.upate({'bob': 99, 'tony': 99, 'kim': 30}
a   # {'alice': [1, 2, 3], 'bob': 99, 'tony': 99, 'suzy': 30, 'kim': 30}

 

* dictionary for문

- for문을 통해 dictionary를 적용하면 key값이 할당된다

- 순서는 임의적이고, 같은 순서를 보장할 수 없다

a = {'alice': [1, 2, 3], 'bob': 20, 'tony': 15, 'suzy': 30}
for key in a:
	print(key)
    
    
# print result
# alice
# bob
# tony
# suzy

 

- value 값으로 for문을 반복하기 위해서는 values()를 사용해야한다

for val in a.values():
	print(val)
    
    
 
# print result
# [1, 2, 3]
# 20
# 15
# 30

 

- key와 value를 한꺼번에 for문에 적용하려면 items()를 사용해야한다

for key, val in a.items():
	print("key = {key}, value = {value}".format(key=key, value=val))
    
    

# print result
# key = alice, value = [1, 2, 3]
# key = bob, value = 20
# key = tony, value = 15
# key = suzy, value = 30

 

* dictionary의 in

- dictionary의 in은 key에 한해서 동작한다.

'alice' in a   # True
'teacher' in a   # False
'teacher' not in a   # True

 

 

* dictionary의 요소 삭제

list와 마찬가지로 del 사용

a = {'alice': [1, 2, 3], 'bob': 20, 'tony': 15, 'suzy': 30}
del a['alice']
a   # {'bob': 20, 'tony': 15, 'suzy': 30}

 

* dictionary를 읽기 쉽게 표현해주는 pprint

from pprint import pprint as pp
a = {'alice': [1, 2, 3], 'bob': 20, 'tony': 15, 'suzy': 30,"dodo": [1,3,5,7], "mario": "pitch"}
print(a)
# {'alice': [1, 2, 3], 'bob': 20, 'tony': 15, 'suzy': 30, 'dodo': [1, 3, 5, 7], 'mario': 'pitch'}

pp(a)
# {'alice': [1, 2, 3],
#  'bob': 20,
#  'dodo': [1, 3, 5, 7],
#  'mario': 'pitch',
#  'suzy': 30,
#  'tony': 15}

 

 

 

 

 

출처: https://wikidocs.net/16043

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net