[python] 딕셔너리 응용하기

딕셔너리 조작하기

# setdefault: 키-값 쌍 추가, 이미 들어있는 키의 값은 수정할 수 없다.
# update: 키의 값 수정, 키가 없으면 키-값 쌍 추가
from collections import defaultdict

d = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
d.setdefault('e')
print(d)  # 값을 정하지 않으면 None으로
d.setdefault('f', 60)
print(d)

# update(키=값) 은 딕셔너리에서 키의 값을 수정, 키가 없다면 키를 추가하고 값 설정
d.update(e=50)
print(d)
d.update(g=70)
print(d)
d.update(a=100, b=200)  # 한번에 여러 개의 값 수정도 가능하다
print(d)

# 리스트와 튜플을 이용해 수정할 수도 있다.
# update(리스트), update(튜플)로 값을 수정하는데,
# [[키1, 값1], [키2, 값2], ...]의 형식처럼 키와 값을 리스트로 만들고 그 리스트를 다시 리스트 안에 넣어서 나열한다.
# 튜플도 리스트와 같은 방식으로 가능하다.
d.update([['h', 80], ['i', 90]])
print(d)

# update는 키-값 쌍으로 된 반복 가능한 객체로 값을 수정한다.
# 따라서, 키 리스트와 값 리스트를 묶은 zip 객체로도 값 수정이 가능하다
d.update(zip(['c', 'd'], [300, 400]))
print(d)

# pop(키) 는 딕셔너리에서 특정 키-값 쌍을 삭제한 뒤 삭제한 값을 반환한다.
# 키가 없을 때는 0을 반환한다.
print(d.pop('i'))
print(d.pop('z', 100))  # 해당 키가 없으면 반환할 기본값 설정

# popitem()은 딕셔너리에서 마지막 키-값 쌍을 삭제하고, 그것을 튜플로 반환
print(d.popitem())

# clear()로 모든 키-값 쌍을 삭제할 수 있다.
d.clear()
print(d)

# get(키) 로 딕셔너리에서 특정 키의 값을 가져온다.
d = {'a': 10, 'b': 20}
print(d.get('a'))
print(d.get('z', 0))  # get(키, 기본값) 처럼 기본값 설정하면 키가 있을 때는 해당 키의 값 반환하지만 없으면 기본값 반환

# items() 로 키-값 쌍을 모두 가져올 수 있다.
print(d.items())

# keys() 로 키를 모두 가져올 수 있다.
print(d.keys())

# values() 로 값을 모두 가져올 수 있다.
print(d.values())

# dict.fromkeys(리스트 또는 튜플) 로 딕셔러니를 생성하며 값은 모두 None으로 설정한다.
keys = ['a', 'b', 'c', 'd']
d = dict.fromkeys(keys)
print(d)
d = dict.fromkeys(keys, 100)  # 값을 지정하면 해당 값이 키의 값으로 저장
print(d)

# 여태 없는 키에 접근했을 때에는 에러가 떴는데
# from collections import defaultdict 를 한 후에
# defaultdict를 사용하면 없는 키에 접근하면 에러 발생 없이 기본값을 반환한다.
d = defaultdict(int)  # int로 기본값 생성
print(d['z'])

# 0이 아닌 다른 값을 기본값으로 설정하려면 defaultdict(lambda: 'python') 와 같이 하면 된다.
d = defaultdict(lambda: 'python')
print(d['z'])

반복문으로 키-값 쌍 모두 출력하기

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# 이렇게 i를 출력하면 키만 출력된다.
for i in d:
    print(i, end=' ')
print()

# 키, 값을 모두 가져오려면 items()로 사용
for k, v in d.items():
    print(k, v)

# 키만 가져오려면 keys() 사용
for k in d.keys():
    print(k, end=' ')
print()

#  값만 가져오려면 values() 사용
for v in d.values():
    print(v, end=' ')

딕셔너리 표현식 사용하기

# 리스트처럼 딕셔너리도 표현식을 이용해 만들 수 있다.
keys = ['a', 'b', 'c', 'd']
d = {key: value for key, value in dict.fromkeys(keys).items()}
print(dict.fromkeys(keys).items())
print(d)

# 키만 가져온 뒤 특정 값 넣거나, 값을 가져온 뒤 키로 사용할 수도 있다.
d = {key: 0 for key in dict.fromkeys(keys).keys()}
print(d)

d = {value: key for key, value in {'a': 1, 'b': 2, 'c': 3}.items()}
print(d)

# 딕셔너리는 특정 키를 삭제하는 메소드는 있지만 특정 값을 삭제하는 메소드는 없다.
# 이를 for문으로 다음과 같이 하려고 한다면 오류가 난다.
x = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# for key, value in x.items():
#     if value == 2:
#         del x[key]
# 따라서, 다음과 같이 삭제를 할 수 있다.
x = {key: value for key, value in x.items() if value != 2}
print(x)

딕셔너리 안에서 딕셔너리 사용하기

# 값 부분에 다시 딕셔너리를 넣어 중첩 딕셔너리를 만들 수 있다.
person = {
    'Park': {
        'height': 178,
        'age': 24
    },
    'Kim': {
        'height': 160,
        'age': 23
    }
}
print(person['Kim']['height'])

딕셔너리의 할당과 복사

import copy

# 그냥 = 으로 할당을 하면 딕셔너리는 두개가 될 것 같지만 실제로는 딕셔너리가 한개이다.
# 즉, d_와 d는 같은 객체이다
d = {'a': 1, 'b': 2, 'c': 3}
d_ = d
print(d_ is d)

# 복사를 완벽히 하려면 copy() 를 이용하면 된다.
d_ = d.copy()
print(d_ is d)
print(d_ == d)  # 안의 내용은 같으므로 True

# 중첩 딕셔너리는 copy만으로는 해결이 안된다.
person = {
    'Park': {
        'height': 178,
        'age': 24
    },
    'Kim': {
        'height': 160,
        'age': 23
    }
}
person_ = person.copy()
print(person is person_)  # False
print(person['Park'] is person_['Park'])  # True
person_['Park']['height'] = 200
print(person)  # person_ 에서 바꾼 값이 person 에 반영된다.

# import copy 후 deepcopy 를 사용해야 한다.
person_ = copy.deepcopy(person)
print(person is person_)  # False
print(person['Park'] is person_['Park'])  # False
person_['Park']['height'] = 180
print(person)  # person_ 에서 바꾼 값이 person 에 반영되지 않는다.

Updated:

Leave a comment