dictionary 응용하기

hou·2021년 12월 29일
0
2021년 12월 29일

dictionary란?

중괄호({ }) 안에 키: 값 형식으로 저장되어 있고 각 키와 값은 콤마(,)로 구분해준다.

game_character1 = {'health': 500, 'mana': 300, 'armor': 20}
# 게임 캐릭터를 예로 들었을 때 해당 캐릭터는 체력, 마나, 아머의 key와 
# key에 해당하는 value도 같이 갖고있다.

dictionary 추가하기

  • setdefault()
    키: 값 쌍으로 추가한다. 키만 지정하면 값에 None을 저장한다.
x = {'a': 1, 'b': 2, 'c': 3}
x.setdefault('d')
x
# x = {'a': 1, 'b': 2, 'c': 3, 'd': None}
x.setdefault('e', 5)
x
# x = {'a': 1, 'b': 2, 'c': 3, 'd': None, 'e': 5}

dictionary 수정하기

  • update()
    키의 값을 수정한다, 기존 리스트에 키가 없으면 키: 값 쌍으로 추가한다.
x = {'a': 1, 'b': 2, 'c': 3}
x.update(a = 10)
x
# x = {'a': 10, 'b': 2, 'c': 3}

키가 없을 경우에는 setdefault와 같이 추가된다.

x = {'a': 1, 'b': 2, 'c': 3}
x.update(a = 10, d = 4)
x
# x = {'a': 10, 'b': 2, 'c': 3, 'd': 4}
위는 key가 string 타입이다.

int형 key는 dictionary처럼 {키: '값'} 넣어야 한다.

y = {1: 'a', 2: 'b'}
y.update({1: 'A', 3: 'C'})
y
# y = {1: 'A', 2: 'b', 3: 'C'}

다음처럼 list와 tuple의 형태도 가능하다. [[키1, 값1], [키2, 값2]]

y = {1: 'a', 2: 'b'}
y.update([[3, 'c'], [4, 'd']])
y
# y = {1: 'a', 2: 'b', 3: 'c', 4: 'd'}

dictionary 삭제하기

  • pop()
    pop('key') 형태로 사용하고 key에 해당하는 value값을 리턴한다.
x = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
x.pop('a')
# 1
x
# {'b': 2, 'c': 3, 'd': 4}
  • del[]
    pop과 달리 []을 사용하고 리턴값이 없다.
x = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
del x['a']
x
# {'b': 2, 'c': 3, 'd': 4}
  • popitem()
    파이썬 버전에 따라 동작이 달라진다.
    3.5 버전 이하에서는 임의의 쌍을 삭제하고 3.6 이상은 마지막 쌍을 삭제한다.
    x.popitem()
  • clear()
    지정한 dictionary의 모든 쌍을 삭제한다.
    x.clear()

dictionary 가져오기

  • get()
    지정한 key의 value를 가져온다.
x = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
x.get('a')
# 1
  • items()
    지정한 dictionary의 키: 값을 다 가져온다.
x.items()
# dict_items([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
  • keys()
    키를 모두 가져온다.
x.keys()
# dict_keys(['a', 'b', 'c', 'd'])
  • values()
    값을 모두 가져온다.
x.values()
# dict_values([1, 2, 3, 4])

list와 tuple로 dictionary 만들기

  • dict.fromkeys()
    key가 들어있는 리스트에 value를 채워 넣을 수 있다.
    value 값을 채워주지 않으면 None이 채워진다.
apb = ['a', 'b', 'c']
x = dict.fromkeys(apb)
x
# {'a': None, 'b': None, 'c': None}

y = dict.fromkeys(apb, 1)
y
# {'a': 1, 'b': 1, 'c': 1}

dictionary 출력하기

  • key와 value 출력하기

for key, value in dictionary.items() 로 사용한다.

x = {'a': 1, 'b': 2, 'c': 3}
for key, value in x.items():
	print(key, value)
    
# a 1
# b 2
# c 3
  • key 출력하기
    for key, value in x.keys():
  • value 출력하기
    for key, value in x.values():

dictionary에 for, if 사용하기

  • for문으로 생성하기
    for문을 사용해서 dictionary를 생성할 수 있다.
keys = ['a', 'b', 'c']
x = {key: value for key, value in dict.fromkeys(keys).items()}
x

# {'a': None, 'b': None, 'c': None}

여기서 key: value 대신 특정 값을 넣으면 value의 값이 바뀐다.

  • if문으로 삭제하기
    특정 key를 찾아서 삭제하는 함수는 알았지만, 특정 value를 찾아서 삭제하려면 어떻게 할까?
    if문을 응용하면 할 수 있다.
x = {'a': 1, 'b': 2, 'c': 3}
x = {key: value for key, value in x.items() if value != 2}
x

# {'a': 1, 'c': 3,}

이중 dictionary

다음과 같이 이중 dictionary를 사용할 수 있다.
dictionary = {key1: {keyA: valueA}, key2: {keyB: valueB}}

이때 keyA에 접근하려면 이렇게 사용한다.
dictionary[key1][keyA] # valueA 출력


dictionary 할당, 복사

  • copy()
    dictionary를 x = y같이 할당해준 뒤 x값을 변경하면 어떻게 될까?
x = {'a': 1, 'b': 2, 'c': 3}
y = x

x is y
# True

x.setdefault('d', 4)
# x에 키와 값 추가

x is y
# True

x와 y를 같은 값으로 할당한 이후에 x에 값을 추가했는데, y의 값도 같이 바꼈다. 이를 확인해 보면 x와 y는 같은 주소를 포인터 하고 있음을 알 수 있다.

y = x.copy()

x is y
# False
x == y
# True

그래서 copy()를 사용하면 내용 그대로 dictionary는 독립되게 만들 수 있다.

  • deepcopy()
    중첩 dictionary도 copy()처럼 독립되게 만드려면 deepcopy()를 사용해야한다.
import copy

y = copy.deepcopy(x)
profile
할 수 있다

0개의 댓글