* 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
'Programming Language > Python' 카테고리의 다른 글
conda environment - CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. (0) | 2020.01.02 |
---|---|
python opencv - window 위치 조절하기 (0) | 2019.12.31 |
Remote server에서 html file 열기, 확인하기 (0) | 2019.12.19 |
matplotlib.pyplot - subplot, 여러 개의 그래프 그리기 (0) | 2019.12.19 |
Python matplotlib.pyplot - imshow(), show() (0) | 2019.12.19 |