2021. 9. 27. 13:24ㆍProgramming/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 |