Python

딕셔너리 응용

haventmetyou 2023. 10. 10. 17:27
딕셔너리 만들기 기본
>>> d1 = dict( name='cat', age=3 )
>>> print(d1)
{'name': 'cat', 'age': 3}
>>>
>>> d2 = dict( zip(['name', 'age'], ['cat', 3]) )
>>> print(d2)
{'name': 'cat', 'age': 3}
>>>
>>> d3 = dict( [('name', 'cat'), ('age', 3)] )
>>> print(d3)
{'name': 'cat', 'age': 3}
>>>
>>> d4 = dict( {'name':'cat', 'age':3} )
>>> print(d4)
{'name': 'cat', 'age': 3}

 

딕셔너리 응용
>>> # 딕셔너리에 키-값 쌍 추가, 기본값 저장
>>> x = {'a':10, 'b':20, 'c':30, 'd':40}
>>> x.setdefault('e')    # 키만 입력
>>> x
{'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': None}
>>> x.setdefault('f', 100)    # 키-값 쌍 추가
100
>>> x
{'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': None, 'f': 100}

제대로 추가가 되었을 시 입력한 값 반환

>>> # 딕셔너리에서 키 값 수정
>>> x={'a':10, 'b':20, 'c':30, 'd':40}
>>> x.update(a = 90)
>>> x
{'a': 90, 'b': 20, 'c': 30, 'd': 40}
>>> x.update('a' = 90)    # 따옴표 등을 붙이면 에러
  File "<stdin>", line 1
    x.update('a' = 90)    # 따옴표 등을 붙이면 에러
             ^^^^^
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
>>> x.update(e = 50)
>>> x
{'a': 90, 'b': 20, 'c': 30, 'd': 40, 'e': 50}
>>>
>>> x.update(a=900, f=60)
>>> x
{'a': 900, 'b': 20, 'c': 30, 'd': 40, 'e': 50, 'f': 60}
>>> y = {1:'one', 2:'two'}
>>> y.update( {1:'ONE', 3:'THREE'} )
>>> y
{1: 'ONE', 2: 'two', 3: 'THREE'}
>>> y.update(4='FOUR')    # 키가 숫자일 경우 딕셔너리 형태가 아니면 에러
  File "<stdin>", line 1
    y.update(4='FOUR')
             ^^
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
>>> y.update(four = 4)
>>> y
{1: 'ONE', 2: 'two', 3: 'THREE', 'four': 4}
>>>
>>> y = {1:'one', 2:'two'}
>>> y.update( {1:'ONE', 3:'THREE'} )
>>>
>>> y.update( [[2, 'TWO'], [4, 'FOUR']] )
>>> y
{1: 'ONE', 2: 'TWO', 3: 'THREE', 4: 'FOUR'}
>>>
>>> y.update( zip([1, 2], ['one', 'two']) )
>>> y
{1: 'one', 2: 'two', 3: 'THREE', 4: 'FOUR'}
>>> # 딕셔너리에서 키-값 쌍 삭제
>>> x={'a':10, 'b':20, 'c':30, 'd':40}
>>> x.pop('a')
10
>>> x
{'b': 20, 'c': 30, 'd': 40}
>>>
>>> x.pop()    # 순서가 없으므로 키를 입력하지 않으면 에러
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pop expected at least 1 argument, got 0
>>> x.pop('z', 100)
100
>>> x
{'b': 20, 'c': 30, 'd': 40}
>>>
>>> x={'a':10, 'b':20, 'c':30, 'd':40}
>>> del x['a']
>>> x
{'b': 20, 'c': 30, 'd': 40}
>>>
>>> x={'a':10, 'b':20, 'c':30, 'd':40}
>>> x.pop('a')    # 키가 'a'인 키-값 쌍 삭제
10
>>> x
{'b': 20, 'c': 30, 'd': 40}
>>> x.popitem()   # 마지막 키-값 쌍 삭제
('d', 40)         # 튜플 형태로 반환
>>> x
{'b': 20, 'c': 30}

키가 a인 쌍이 여러 개일 때

>>> x={'a':10, 'a':10.0, 'b':20, 'c':30, 'd':40}
>>> x.pop('a')    # 키가 'a'인 키-값 쌍 삭제
10.0
>>> x
{'b': 20, 'c': 30, 'd': 40}

제일 앞에 있는 것만 삭제되는 것이 아닌 두 개 모두 삭제됨

>>> # 딕셔너리의 모든 키-값 쌍 삭제
>>> x={'a':10, 'b':20, 'c':30, 'd':40}
>>> x.clear()
>>> x
{}
>>> # 딕셔너리에서 키의 값 가져오기
>>> x={'a':10, 'b':20, 'c':30, 'd':40}
>>> x.get('a')
10
>>> x.get('z')
>>> x.get('z', 100)
100
>>>
>>> # 딕셔너리에서 키-값 쌍 모두 가져오기
>>> x={'a':10, 'b':20, 'c':30, 'd':40}
>>> x.items()        # 딕셔너리의 키-값 쌍 가져오기
dict_items([('a', 10), ('b', 20), ('c', 30), ('d', 40)])
>>> x.keys()         # 키를 모두 가져오기
dict_keys(['a', 'b', 'c', 'd'])
>>> x.values()       # 값을 모두 가져오기
dict_values([10, 20, 30, 40])

 

>>> # 리스트와 튜플로 딕셔너리 만들기
>>> keys = ['name', 'age', 'location']
>>> x = dict.fromkeys(keys)
>>> x
{'name': None, 'age': None, 'location': None}
>>> y = dict.fromkeys(keys, 'cat')
>>> y
{'name': 'cat', 'age': 'cat', 'location': 'cat'}
>>>

 

>>> # 반복문으로 딕셔너리의 키-값 쌍을 모두 출력
>>> x={'a':10, 'b':20, 'c':30, 'd':40}
>>> for i in x:
...     print(i, end=' ')
...
a b c d >>>
>>>
>>> x={'a':10, 'b':20, 'c':30, 'd':40}
>>> for key, value in x.items():    # 키-값 모두 출력
...     print(key, value)
...
a 10
b 20
c 30
d 40
>>> for i in x.items():
...     print(i)
...
('a', 10)
('b', 20)
('c', 30)
('d', 40)
>>> for i in x.keys():      # 키만 출력
...     print(i)
...
a
b
c
d
>>> for i in x.values():    # 값만 출력
...     print(i)
...
10
20
30
40

 

딕셔너리 표현식 사용
>>> # 딕셔너리 표현식
>>> keys = ['a', 'b', 'c', 'd']
>>> x = { key: value for key, value in dict.fromkeys(keys).items() }
>>> x
{'a': None, 'b': None, 'c': None, 'd': None}
>>>
>>> y = dict.fromkeys(keys)
>>> y
{'a': None, 'b': None, 'c': None, 'd': None}
>>>
>>> # 딕셔너리 표현식에서 if 조건문 사용
>>> x = {'a':10, 'b':20, 'c':30, 'd':40}
>>> for k, v in x.item():
...     if v == 20:
...         del x[k]
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'item'. Did you mean: 'items'?
>>>
>>> x = {'a':10, 'b':20, 'c':30, 'd':40}
>>> x = {key: value for key, value in x.items() if value != 20}
>>> x
{'a': 10, 'c': 30, 'd': 40}
>>>
>>> # 딕셔너리 안에서 딕셔너리 사용
>>> terrestrial_planet = {
... 'Mercury': {
... 'mean_radius': 2439.7,
... 'mass': 3.3022E+23,
... 'orbital_period': 87.969
... },
... 'Venus': {
... 'mean_radius': 6051.8,
... 'mass': 4.8676E+24,
... 'orbital_period': 224.70069,
... },
... 'Earth': {
... 'mean_radius': 6371.0,
... 'mass': 5.97219E+24,
... 'orbital_period': 365.25641,
... },
... 'Mars': {
... 'mean_radius': 3389.5,
... 'mass': 6.4185E+23,
... 'orbital_period': 686.9600,
... }
... }
>>> print( terrestrial_planet['Venus']['mean_radius'])
6051.8

 

>>> # 딕셔너리의 할당, 복사
>>> x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> y = x
>>>
>>> print(x is y)
>>> True
>>>
>>> y['a'] = 99
>>> print(x)
>>> {'a': 99, 'b': 0, 'c': 0, 'd': 0}
>>> print(y)
>>>{'a': 99, 'b': 0, 'c': 0, 'd': 0}
>>>
>>> x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
>>> y = x.copy()
>>>
>>> print(x is y)
>>> False
>>> print(x == y)
>>> True

 

x = {    'a': {'python': '2.7'},
         'b': {'python': '3.6'}    }
y = x.copy()
y['a']['python'] = '2.7.15'
print(x)
print(y)
print()

# 중첩 딕셔너리를 완전히 복사 deepcopy() 사용
import copy
x = {    'a': {'python': '2.7'},
         'b': {'python': '3.6'}    }
y = copy.deepcopy(x)
y['a']['python'] = '2.7.15'
print(x)
print(y)

 

연습 문제 예제

# 25.7번 연습 문제: 평균 점수 구하기

# 코드
maria = {'korean':94, 'english':91, 'mathmatics':89, 'science':83}
average = sum(maria.values()) / len(maria)
print(average)

# 실행 결과
89.25

# 25.8번 심사 문제: 딕셔너리에서 특정 값 삭제하기
# 표준 입력으로 문자열 여러 개와 숫자 여러 개가 두 줄로 입력되고
# 첫 번째 줄은 키, 두 번째 줄은 값으로 하여 딕셔너리 생성
# 딕셔너리에서 키가 'delta'인 키-값 쌍과 값이 30인 키-값 쌍을 삭제하도록 만드세요

# 코드
keys = input().split()
values = map(int, input().split())

x = dict(zip(keys, values))

x = {key: value for key, value in x.items() if key != 'delta' and value != 30}

print(x)

# 실행 결과 - 예제 1
alpha bravo charlie delta    # 입력 값
10 20 30 40                  # 입력 값
{'alpha': 10, 'bravo': 20}   # 출력 값

# 실행 결과 - 예제 2
alpha bravo charlie delta echo foxtrot golf    # 입력 값
30 40 50 60 70 80 90                           # 입력 값 
{'bravo': 40, 'charlie': 50, 'echo': 70, 'foxtrot': 80, 'golf': 90}    # 출력 값