상세 컨텐츠

본문 제목

[PYTHON] 파이썬 자료형(2) 사전(Dictionary)

PYTHON/기본

by ranlan 2021. 5. 12. 00:25

본문

728x90

 

딕셔너리 자료형

key(키), value(값)가 한 쌍 으로 되어있는 순서가 없는 자료형

- 키는 immutable(불변)  int, tuple, float, boolean 등

- 값은 mutable(가변) set, list, dict 등

my_dictionary = {}

# dict constructor
my_dictionary = dict()
my_dictionary = dict( 'key1' = 'value1', 'key2' = 'value2', 'key3' = 'value3' )

type(my_dictionary) # <class 'dict'>

값은 중복될 수 있지만 키는 중복될 수 없어 중복의 경우 마지막 값으로 덮어씌워짐

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

 

++ 추가)

사전형으로 변환

to_dict()

 

 

딕셔너리 메서드

조회

- 순서가 없기 때문에 인덱스로 조회할 수 없어 키로 조회 (*인덱싱 불가)

my_dictionary = { 5: 25, 2: 4, 3: 9 }
my_dictionary[5] # 25

- 해당 key가 없을 때도 실행

a = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}

a.get('name') # 'pey'
a.get('phone') # '0119993323'

a.get('address', '등록된 주소가 없습니다.') # '등록된 주소가 없습니다'

추가

my_dictionary[9] = 81
# { 5: 25, 2: 4, 3: 9, 9: 81 }

삭제

del my_dictionary[3]
# { 5: 25, 2: 4, 9: 81 }

수정

- 키로 접근하여 값 변경 가능

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

- 여러 값 변경 또는 추가 시 update 메서드 사용

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

# {'alice': [1, 2, 3], 'bob': 99, 'tony': 99, 'suzy': 30, 'kim': 30}

 

IN 메서드

딕셔너리의 존재 여부는 키의 한해서만 가능

my_dictionary = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3'
}

'key1' in my_dictionary # True
'key2' not in my_dictionary # False
'key4' not in my_dictionary # True

값의 존재 여부를 확인해야할 때

my_dictionary = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3'
}

'value1' in my_dictionary.values() # True
'value4' not in my_dictionary.values() # True

 

pprint 메서드

읽기 쉽게 보여줌

from pprint import pprint

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'}

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

 

 

딕셔너리 순회

순서가 없는 자료형이기 때문에 나오는 순서를 보장할 수 없음 (순서는 임의적)

value 순회

for value in my_dictionary.values():
    print(value)

key 순회

for key in my_dictionary.keys():
    print(key)
더보기

dict.keys()는 딕셔너리의 key만을 모아 dict_keys() 객체를 돌려준다

 

파이썬 2.7 버전까지는 dict.keys() 호출 시 반환 값으로 리스트 반환

파이썬 3.0 버전 이후로 메모리 낭비를 줄이기 위해 dict_keys 객체 반환

리스트가 필요한 경우 list(dict.keys()) 사용해야 함

 

value, key 순회

for key, value in my_dictionary.items():
    print(key, value)

 

 

딕셔너리 복사

얕은 복사(shallow copy) - 내용은 같으나 아이디가 같은 동일한 변수는 아님

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

b = a.copy()
b['alice'].append(5)

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

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

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

깊은 복사(deep copy) - 같은 아이디로 같은 변수 공유

import copy

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

b = copy.deepcopy(a)
b['alice'].append(5)

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

 

728x90

관련글 더보기

댓글 영역