파이썬 딕셔너리, 메서드

Yeonu·2020년 11월 20일
0

Python 이론

목록 보기
12/30
post-thumbnail

딕셔너리에 키-값 쌍 추가하기

setdefault: 키-값 쌍 추가
update: 키의 값 수정, 키가 없으면 키-값 쌍 추가

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
>>> x.setdefault('e') # 키만 지정하고 값이 없으면 값은 None으로 들어감
>>> 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}



딕셔너리에서 키의 값 수정하기

update(키=값)

>>> x.update(a=900, f=60) #,로 여러 개 추가 가능
>>> x
{'a': 900, 'b': 20, 'c': 30, 'd': 40, 'e': 50, 'f': 60}

>>> x.update(e=50) #없던 키를 추가하도 알아서 들어감
>>> x
{'a': 90, 'b': 20, 'c': 30, 'd': 40, 'e': 50}

update(키=값)은 키가 문자열일 때만 사용할 수 있다.
키가 숫자인 경우 update(딕셔너리)나, update(리스트), update(튜플), update(반복가능한객체) 등으로 수정할 수 있다.

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

>>> y.update(zip([1, 2], ['one', 'two']))
>>> y # update(반복가능한객체)는 키-값 쌍으로 된 반복 가능한 객체로 값을 수정한다.
	#키 리스트와 값 리스트를 묶은 zip 객체로 값을 수정할 수 있다.
{1: 'one', 2: 'two', 3: 'THREE', 4: 'FOUR'}



딕셔너리에서 키-값 쌍 삭제하기

pop(키), del 딕셔너리[키]

popitem()은 딕셔너리에서 임의의 키-값 쌍을 삭제한 뒤 삭제한 키-값 쌍을 튜플로 반환한다. 파이썬 3.6 이상에서는 마지막 키-값 쌍을 삭제

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



딕셔너리의 모든 키-값 쌍을 삭제하기

clear()

딕셔너리에서 키의 값을 가져오기

get(키)

딕셔너리에서 키-값 쌍을 모두 가져오기

items: 키-값 쌍을 모두 가져옴
keys: 키를 모두 가져옴
values: 값을 모두 가져옴


리스트와 튜플로 딕셔너리 만들기

키 리스트를 만들어두고 dict.fromkeys 사용한다. dict.fromkeys(키리스트), dict.fromkeys(키리스트, 값)

>>> keys = ['a', 'b', 'c', 'd']
>>> x = dict.fromkeys(keys) # 값을 지정하지 않으면 None으로 들어간다.
>>> x
{'a': None, 'b': None, 'c': None, 'd': None}

>>> y = dict.fromkeys(keys, 100) #값을 지정하면 동일하게 모든 값이 100으로 들어감
>>> y
{'a': 100, 'b': 100, 'c': 100, 'd': 100}



반복문으로 딕셔너리의 키-값 쌍 모두 출력하기

평범한 리스트 출력처럼 하면 키값만 나온다.

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

변수를 두 개 주고 딕셔너리.items()를 해야 키-값 모두 나온다.

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

딕셔너리.values()를 하면 값만 출력할 수 있다.



딕셔너리 표현식(comprehension)사용하기

{키: 값 for 키, 값 in 딕셔너리}
dict({키: 값 for 키, 값 in 딕셔너리})

>>> 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} #키리스트만 있고 값은 없어서 None

>>> {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, 'c': 30, 'd': 40}.values()}
# key값에 value변수를 넣어 값을 키로 바꿔서 사용
{10: 0, 20: 0, 30: 0, 40: 0}

딕셔너리 표현식(comprehension)에 if문 사용하기

{키: 값 for 키, 값 in 딕셔너리 if 조건식}
dict({키: 값 for 키, 값 in 딕셔너리 if 조건식})

딕셔너리는 특정 키를 삭제하는 pop 메서드만 제공할 뿐 특정 값을 삭제하는 메서드는 제공하지 않는다. 특정 값을 찾아서 키-값 쌍을 삭제하기 위해 for 반복문으로 반복하면서 del로 삭제하는 방식 또한 사용할 수 없다.

x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
for key, value in x.items():
    if value == 20:    # 값이 20이면
        del x[key]     # 키-값 쌍 삭제
print(x)

키-값을 삭제하면 for문이 돌다 딕셔너리 길이가 바뀌어 오류 발생

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

if value != 20과 같이 if 조건문을 지정해 값이 20이 아닌 키-값 쌍으로 다시 딕셔너리를 만든다. 직접 키-값 쌍을 삭제하는 방식이 아니라 삭제할 키-값 쌍을 제외하고 남은 키-값 쌍으로 딕셔너리를 새로 만드는 것



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

딕셔너리 = {키1: {키A: 값A}, 키2: {키B: 값B}}

transport = {
    'bus': {
        'tarif': 3.5,
        'horaire': 10,
        'commodite': 1
    },
    'avion': {
        'tarif': 90,
        'horaire': 1,
        'commodite': 8
    },
    'voiture': {
        'tarif': 30000,
        'horaire': 5,
        'commodite': 9
    }
}
print(transport['avion']['tarif'])    # 90

딕셔너리 안에 들어있는 딕셔너리에 접근하려면 딕셔너리 뒤에 [ ]를 단계만큼 붙이고 키를 지정해주면 된다.
딕셔너리[키][키]
딕셔너리[키][키] = 값


딕셔너리의 할당과 복사

딕셔너리를 만든 뒤 다른 변수에 할당하면 같은 객체를 참조한다.
copy()하면 다른 객체가 만들어져 한쪽의 값을 변경해도 다른 딕셔너리에 영향을 미치지 않는다.

중첩 딕셔너리의 할당과 복사

중첩 딕셔너리는 copy메서드로 복사해도 같은 객체를 참조한다.
완전히 복사하려면 copy 모듈의 deepcopy 함수를 사용해야 한다.



@심사문제 25.8 도중

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' if value != 30}
print(x)

dict.fromkeys(리스트).items()로 하다 안돼서 바꿨다.
dict.fromkeys(리스트)는 리스트로 딕셔너리를 생성한다. 이미 만들어진 리스트(x)가 있으니 바로 items()로 키-값에 접근 가능

0개의 댓글