[Python] dictionary 응용

2021. 9. 27. 13:24Programming/Python

    목차
반응형

dictionary에 key만 추가

: default는 추가만 가능하며 update는 불가능 함

  (update는 추가, 수정이 모두 가능함)

 

>>> x = {'a':10, 'b':20}
>>> x.setdefault('e')
>>> e
>>> x
{'a': 10, 'b': 20, 'e': None}
>>> x.setdefault('f', 100)
100
>>> x
{'a': 10, 'b': 20, 'e': None, 'f': 100}

 

값 수정

 

1) key에 값 대입

>>> x.update(e=50)
>>> x
{'a': 10, 'b': 20, 'e': 50, 'f': 100}
>>> x.update(a=900, f=60)
>>> x
{'a': 900, 'b': 20, 'e': 50, 'f': 60}

2) dictionary 혹은 list로 update

dictionary 갱신 및 더하기(추가) 수행

 

>>> y = {1:'one', 2:'two'}
>>> y.update({1:'ONE', 3:'THREE'})
>>> y
{1: 'ONE', 2: 'two', 3: 'THREE'}

>>> y.update([[2, 'TWO'], [4, 'FOUR']])
>>> y
{1: 'ONE', 2: 'TWO', 3: 'THREE', 4: 'FOUR'}


Python 3.5부터는 unpacking을 이용한 병합을 지원함
 

>>> x = {'a':1, 'b':2}
>>> y = {'c':3, 'd':4}
>>> {**x, **y}
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> x.update(y)
>>> x
{'a': 1, 'b': 2, 'c': 3, 'd': 4}


Key-Value 삭제


 


없는 key에 대한 pop
 

 : 그냥 pop(‘z’)하게되면 에러 발생 (KeyError), 아래와 같이 없는 경우의 기본 값(0) 지정 필요

 

>>> x.pop('z', 0)
0


del로 삭제
 

>>> x = {'a':10, 'b':20}
>>> del x['a']
>>> x
{'b': 20}

popitem

: 3.5 이하에서는 임의의 키/값을 삭제, 3.6이상에서는 마지막 쌍을 삭제

이후 이를 tuple로 반환

 

>>> x = {'a':10, 'b':20}
>>> x.popitem()
('b', 20)
>>>


clear : 모두 삭제
 

>>> x = {'a':10, 'b':20}
>>> x.clear()
>>> x
{}


값 가져오기

>>> x = {'a':10, 'b':20, 'c':30, 'd':40}
>>> x.get('a')
10
>>> x['a']
10

 


없는 값의 get 시 None 리턴 (기본 리턴 지정 시 기본 리턴 지정 값을 리턴)
 

>>> x.get('z')
>>>
>>> x.get('z', 0)
0


x[‘z’]
 

수행 시 에러 발생



모든 값 가져오기

>>> 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])

 

list와 tuple로 dictionary 만들기

>>> keys = ['a', 'b', 'c', 'd']
>>> x = dict.fromkeys(keys)
>>> x
{'a': None, 'b': None, 'c': None, 'd': None}
>>> x = dict.fromkeys(keys, 100)
>>> x
{'a': 100, 'b': 100, 'c': 100, 'd': 100}

 

defaultdict 사용

>>> from collections import defaultdict
>>> y = defaultdict(int)
>>> y
defaultdict(<class 'int'>, {})
>>> y['z']
0

 

defaultdict에는 특정 값을 반환하는 함수를 넣어주면 됨 

defaultdict(int) ← int함수를 넣어 준 것임

즉, 없는 값에 대해서는 모두 int() 를 수행함

>>> y = defaultdict(str)
>>> y['z']
''
>>> y = defaultdict(lambda: 'python')
>>> y['z']
'python'

 

dictionary 내 모든 값 출력

>>> x = {'a':10, 'b':20, 'c':30, 'd':40}
>>> for i in x:
...     print(i, end=' ')
...
a b c d >>>
>>>
>>> for key, val in x.items():
...     print(key, val)
...
a 10
b 20
c 30
d 40

>>> for key, val in {'a':10, 'b':20, 'c':30}.items():
...     print(key, val)
...
a 10
b 20
c 30


키, 값 별도 출력

>>> for key in x.keys():
...     print(key)
...
a
b
c
d
>>>
>>> for val in x.values():
...     print(val)
...
10
20
30
40

 


dictionary 표현식 사용


: dictionary 표현식 내에서 for문 if문 등을 사용해 생성 가능

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


dict.fromkeys(keys).items()가 리턴하는 키-값 쌍에서 key는 변수 key에, value는 변수 value에 넣어 dictionary를 만듦
 

 

위처럼 key, value를 모두 얻을 수도 있고,

key나, value만 얻을 수도 있음

>>> {key:0 for key in dict.fromkeys(['a', 'b', 'c', 'd']).keys()}
{'a': 0, 'b': 0, 'c': 0, 'd': 0}

>>> {value:0 for value in {'a':10, 'b':20}.values()}
{10: 0, 20: 0}


key와 값의 자리 변경
 

>>> {value:key for key, value in {'a':10, 'b':20}.items()}
{10: 'a', 20: 'b'}


dictionary expression 내에서 if문 사용


 

아래와 같이 for 문 내에서 value로 key에 대한 항목을 del 시 runtime error 가 발생함

(그러나 제거됨)

>>> x = {'a':10, 'b':20, 'c':30, 'd':40}
>>> for key, value in x.items():
...     if value == 20:
...             del x[key]
...
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
>>>
>>> x
{'a': 10, 'c': 30, 'd': 40}

아래와 신규 생성 시 표현 식 내에서의 if문 처리로 처리 가능 

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


중첩 dictionary 사용

 

dictionary = {key1:{keyA:valueA}, key2:{keyB:valueB}}

terrestrial_planet = {
   'Mercury' : {
       'mean_radius' : 2439.7,
       'mass' : 3.3022E+23
   },
   'Venus' : {
       'mean_radius' : 6051.8,
       'mass' : 4.8676E+24
   }
}

print(terrestrial_planet['Venus']['mean_radius'])
6051.8

 



dictionary 할당 & 복사

>>> x = {'a':10, 'b':20, 'c':30, 'd':40}
>>> y = x
>>> x is y
True


할당 시, 두개가 아닌 하나의 dictionary를 함께 referencing 함
 

즉, x나 y로 값 변경 시 모두 변경된 값이 적용 됨

>>> y['a'] = 99
>>> x
{'a': 99, 'b': 20, 'c': 30, 'd': 40}


copy를 사용해야 복제본으로 할당됨
 

>>> x = {'a':10, 'b':20, 'c':30, 'd':40}
>>> y = x.copy()


is는 객체가 같은지 여부 확인
 

==는 값이 같은지 여부 확인

>>> x = {'a':10, 'b':20, 'c':30, 'd':40}
>>> y = x.copy()
>>> x is y
False
>>> x == y
True
>>> y['a'] = 99
>>> x
{'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> y
{'a': 99, 'b': 20, 'c': 30, 'd': 40}


단,
copy는 1차원의 것만 복사 - 중첩의 것은 referencing임 

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

>>> y['a'] = {'PYTHON' : '2.7'}
>>> x
{'a': {'python': '2.7.15'}, 'b': {'python': '3.6'}}
>>> y
{'a': {'PYTHON': '2.7'}, 'b': {'python': '3.6'}}


중첩까지 적용해서 복사하려면, deepcopy를 사용해야 함
 

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


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


>>> maria = {'korean' : 94, 'english' : 91, 'mathematics' : 89, 'science' : 83}
>>> avg = sum(maria.values())/len(maria)
>>> print(avg)


25.8 심사문제: 딕셔너리에서 특정 값 삭제하기
 

 

입력으로 dictionary를 만들고, 키가 ‘delta’인 것, 그리고 value가 30인 것을 제거하여 출력하시오.

표준입력:
alpha bravo charlie delta
10 20 30 40

표준출력:
{‘alpah’ : 10, ‘bravo’ : 20}
import copy

class in_set:
   def __init__(self, keys, vals):
       self.keys = copy.deepcopy(keys)
       self.vals = copy.deepcopy(vals)

test_set = []
test_set.append(in_set("alpha bravo charlie delta", "10 20 30 40"))
test_set.append(in_set("alpha bravo charlie delta echo foxtrot golf", "30 40 50 60 70 80 90"))

for test in test_set:
   keys = test.keys.split(' ')
   vals = test.vals.split(' ')
   srcdic = dict.fromkeys(keys)
   for i in range(len(keys)):
       srcdic[keys[i]] = int(vals[i])
   dstdic = {key:value for key, value in srcdic.items() if key != 'delta' and value != 30}
   print(dstdic)


 

keys = input().split()
vals = map(int, input().split())

x = dict(zip(keys, values))


 
 

반응형

'Programming > Python' 카테고리의 다른 글

Python access member as string  (0) 2021.12.10
Python access member with string  (0) 2021.12.10
openpyxl sheet  (0) 2021.12.10
openpyxl sheet  (0) 2021.12.10
[Python] #2 변수와 입력 사용하기  (0) 2021.09.27