IT_Python

[파이썬기초] 딕셔너리 dictionary. 추가/변경/병합/삭제/확인/조회/튜플 변경. update/del/pop/clear/in/get/items

soyounism 2021. 12. 11. 10:15

dictionary

변수={'key':'value', ...}

  • 딕셔너리는 파이썬에서 가장 많이쓰는 타입
  • 키와 값을 갖는 데이터 구조
  • 키는 내부적으로 hash값으로 저장 ->키값이 인덱스로 바뀌어서 저장이 됨. 중복이 없다.
  • 순서를 따지지 않음. 즉, 인덱스가 없음
"""리스트의 경우 그 인덱스를 알고 있으면 바로 접근이 가능
"""
a=[0,1,2,3,4]
print(a[0])
print(a[2])

결과:

0

2

 

a = {'Korea': 'Seoul', 
     'Canada': 'Ottawa', 
     'USA': 'Washington D.C'}
b = {0:1, 1:6, 7:9, 8:10}
print(type(a))
print(type(b))
print('--------')

#딕셔너리 key를 이용해서 값(value) 찾기
print(a['Korea']) #대소문자 유의!(키값과 동일하게!)
print(b[0]) #0은 key! 인덱스가 아님!

결과:

<class 'dict'>

<class 'dict'>

--------

Seoul

1

 

  • 항목 추가 및 변경
    • 기존에 키가 존재 하면, 새로운 값으로 업데이트
    • 존재하지 않으면, 새로운 키, 값 생성
a = {'Korea': 'Seoul', 
     'Canada': 'Ottawa', 
     'USA': 'Washington D.C'}

#새로운 값 추가
a['Japan'] = 'Tokyo'

# 중복x. 동일한 키는 덮어쓰기됨 
a['Japan'] = 'Kyoto'

#value는 중복이 가능
a['Japan2'] = 'Kyoto'


print(a)

결과:

{'Korea': 'Seoul', 'Canada': 'Ottawa', 'USA': 'Washington D.C', 'Japan': 'Kyoto', 'Japan2': 'Kyoto'}
 
 
 
  • update()
    • 두 딕셔너리를 병합함
    • 겹치는 키가 있다면 parameter로 "전달되는" 키 값이 overwrite된다.
a = {'a': 1, 'b': 2, 'c' : 3}
b = {'a': 2, 'd': 4, 'e': 5}

a.update(b)
#중복된 a키는 "b의 값으로" 덮어쓰기됨(overwrite)

print(a)
 
결과:
{'a': 2, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
 
 
  • key삭제
    • del 키워드 사용 <-범용적으로 다 지워짐
    • pop 함수 이용
a1 = {'a': 1, 'b': 2, 'c' : 3}
print(a1)

#a에서 b키 삭제
a1.pop('b') 
print(a1)
 
결과:
{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'c': 3}
 
a1 = {'a': 1, 'b': 2, 'c' : 3}
print(a1)

del a1['b']
print(a1)
 
결과:
{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'c': 3}
 

pop vs del

#pop은 지워진 인덱스의 값을 반환한다. del은 x
a1 = {'a': 1, 'b': 2, 'c' : 3}
r1=a1.pop('b')
print(a1)
print(r1)
print(a1['a'])

 결과:

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

2

1

 

  • clear()
    • 딕셔너리의 모든 값을 초기화
a = {'a': 1, 'b': 2, 'c' : 3}
print(a)
a.clear()
print(a)

 결과:

{'a': 1, 'b': 2, 'c': 3}

{}

  

 

  • in
    • key값 존재 확인
    • O(1) 연산 - 딕셔너리의 크기와 관계없이 항상 연산의 속도가 일정하다는 의미
    • 리스트나, 딕셔너리에서 기능상에서는 차이가 x. 성능상 차이.
    • dict in은 dict원소가 몇개든 바로 결과를 가져옴. 리스트에서 in은 원소가 많으면 성능저하
a = {'a': 1, 'b': 2, 'c' : 3}
print(a)

print('b' in a) #b 키가 a딕셔너리에 있나
print(2 in a) #2는 값이야. dict는 키로 찾아야함
print('---------')

#리스트에서도 사용
b = [1, 2, 3, 4, 5, 6, 7, 9, 10, 100]
print(100 in b)

 결과:

{'a': 1, 'b': 2, 'c': 3}

True

False

---------

True

 

 

  • value access
    • dict[key]로 접급, 키가 없는 경우 에러 발생
    • .get() 함수로 접근, 키가 없는 경우 None반환
a = {'a': 1, 'b': 2, 'c' : 3}
print(a['b']) #a에서 b키의 값은?

#없는 키에 대해서
#print(a['d']) <-프로그램이 죽어버리니까
print(a.get('d')) #get을 이용해서 프로그램이 죽지않고, 없는 값에는 none을 반환

# 나중에 이런식으로도 확인가능
# if 'd' in a:
#     print(a['d'])
 
결과:
2
None
 
 

모든 keys, values 접근

  • keys() - 키만 반환
  • values() - 값만 반환
  • items() - 키, 값의 튜플을 반환

 

print(a)
print('----------')

print(a.keys()) #a의 key 값
print(a.values()) #a의 value 값
print('----------')

#리스트로 변환시켜서 사용가능
print(list(a.keys()))
print(list(a.values()))
print('----------')

#키,값 모두 가져와서 튜플로 변환되어 리스트
list(a.items())
 
결과:
{'a': 1, 'b': 2, 'c': 3} 
---------- 
dict_keys(['a', 'b', 'c']) 
dict_values([1, 2, 3]) 
---------- 
['a', 'b', 'c'] 
[1, 2, 3] 
----------
[('a', 1), ('b', 2), ('c', 3)]