[Python] 딕셔너리 정리

지우개·2024년 3월 6일

Python

목록 보기
3/3

딕셔너리

순서 X, 중복 X, 수정 O, 삭제 O


빈 딕셔너리 생성

empty_dic = {}
empty_dic = dict()

아무 값이 없는 빈 딕셔너리를 만들고, 값을이후에 추가하려면 위처럼 생성하면 됨.


딕셔너리 생성

딕셔너리명 = {key1:value1, key2:value2, ...}

dic = {3 : '치이카와', 100 : '농담곰', 55 : '하치와레'}

이때 키 값은 정수형만 가능한 것이 아니라 문자열도 넣을 수 있음.


리스트를 인덱스 값으로 접근한다면, 딕셔너리는 인덱스 역할을 key가 함.

딕셔너리명에 대괄호를 붙이고 그안에 key를 넣거나, get() 함수를 통해 key값에 해당하는 value값을 얻을 수 있음.

dic = {3 : '치이카와', 100 : '농담곰', 55 : '하치와레'}

print(dic[100])
print(dic.get(3))

결과

농담곰
치이카와

  • 값이 없을 경우 기본값 대체

get() 함수를 통해 key에 해당하는 값이 없으면 기본값을 사용하게 할 수 있음.

dic = {3 : '치이카와', 100 : '농담곰', 55 : '하치와레'}

print(dic.get(9, "비어있음"))

결과

비어있음

  • in 연산자 사용해서 key값 유무 확인

key가 딕셔너리에 있는지 확인할때는 in 연산자를 사용한다.

dic = {3 : '치이카와', 100 : '농담곰', 55 : '하치와레'}

print(3 in dic)
print(60 in dic)

결과

True
False

딕셔너리 초기화

  • dict()와 zip()으로 초기화
list1 = [3, 100, 55]
list2 = ['치이카와', '농담곰', '하치와레']

dic = dict(zip(list1, list2))

print(dic)

결과

{3: '치이카와', 100: '농담곰', 55: '하치와레'}

dict()와 zip()을 이용해 두개의 리스트의 요소들을 key와 value로 갖는 딕셔너리를 만들 수 있음.


이를 활용한 문제
백준 18870번 - 좌표 압축

import sys

n = int(sys.stdin.readline())
lst = list(map(int, sys.stdin.readline().split()))

sorted_lst = sorted(list(set(lst)))
idx_lst = [i for i in range(len(sorted_lst))]

dic = dict(zip(sorted_lst, idx_lst))

for i in lst:
    print(dic[i], end=" ")

  • dict()에 2차원 리스트를 인자로 전달하여 초기화
lst = [[3, '치이카와'], [100, '농담곰'], [55, '하치와레']]

dic = dict(lst)

print(dic)

결과

{3: '치이카와', 100: '농담곰', 55: '하치와레'}

dict() 인자에 2차원 리스트를 전달하면, 2차원 리스트의 요소들을 key와 value로 갖는 딕셔너리를 생성


  • fromkeys()로 딕셔너리 초기화
lst = [3, 100, 55]

dic = dict.fromkeys(lst)

print(dic)

결과

{3: None, 100: None, 55: None}

fromkeys()에 인자로 리스트를 전달하면, 리스트의 요소들을 key로 갖는 딕셔너리가 생성

value는 None으로 설정됨.

아래와 같이 두번째 인자를 전달하면 그 값을 기본값 value로 딕셔너리를 초기화함.

lst = [3, 100, 55]

dic = dict.fromkeys(lst, '치이카와')

print(dic)

결과

{3: '치이카와', 100: '치이카와', 55: '치이카와'}

  • Comprehension으로 딕셔너리 초기화

Comprehension을 이용

dic = {n: n*n for n in range(5)}

print(dic)

결과

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

  • enumerate로 딕셔너리 초기화
lst = ['치이카와', '농담곰', '하치와레']

dic = {index:value for index, value in enumerate(lst)}

print(dic)

결과

{0: '치이카와', 1: '농담곰', 2: '하치와레'}

딕셔너리 value 값 변경/추가/삭제

  • value 값 변경, 추가

key에 해당하는 값이 있을 때 -> 값 변경
key에 해당하는 값이 없을 때 -> 값 추가

dic = {3 : '치이카와', 100 : '농담곰', 55 : '하치와레'}

print(dic)

dic[60] = "랏코"
dic[55] = "모몽가"
print(dic)

결과

{3: '치이카와', 100: '농담곰', 55: '하치와레'}
{3: '치이카와', 100: '농담곰', 55: '모몽가', 60: '랏코'}

  • value 값 삭제
dic = {3 : '치이카와', 100 : '농담곰', 55 : '하치와레'}

del dic[55]

print(dic)

결과

{3: '치이카와', 100: '농담곰'}

  • 딕셔너리 전체 삭제
dic = {3 : '치이카와', 100 : '농담곰', 55 : '하치와레'}

dic.clear()

print(dic)

결과

{}

값 확인

key값들만 확인하고 싶을때 -> keys()
value값들만 확인하고 싶을때 -> values()
전체를 다 확인하고 싶을때 -> items()

dic = {3 : '치이카와', 100 : '농담곰', 55 : '하치와레'}

print(dic.keys())
print(dic.values())
print(dic.items())

결과

dict_keys([3, 100, 55])
dict_values(['치이카와', '농담곰', '하치와레'])
dict_items([(3, '치이카와'), (100, '농담곰'), (55, '하치와레')])

  • 딕셔너리에서 key 또는 value만 추출해서 list로 변환
dic = {3 : '치이카와', 100 : '농담곰', 55 : '하치와레'}

key_list=list(dic.keys())
value_list=list(dic.values())

print(key_list)
print(value_list)

결과

[3, 100, 55]
['치이카와', '농담곰', '하치와레']

딕셔너리 정렬

딕셔너리는 sort메서드가 없기 때문에 sorted함수를 사용해야함.

sorted() 함수는 정렬된 리스트를 반환하기 때문에
a = sorted(dic)를 하면 a에 정렬된 key값들이 리스트 형태로 반환됨

b = sorted(dic.keys()) 이것 또한 b에 정렬된 key값들이 리스트 형태로 반환됨.

c = sorted(dic.values())는 c에 정렬된 value값들이 리스트 형태로 반환됨.

d = sorted(dic.items())는 d에 key값 기준으로 정렬된 key, value값들이 튜플과 리스트 형태로 반환됨.

dic = { 2: 6, 3: 8, 5: 10, 1: 7, 4: 9 }

a = sorted(dic)
b = sorted(dic.keys())
c = sorted(dic.values())
d = sorted(dic.items())

print(a)
print(b)
print(c)
print(d)

결과

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[6, 7, 8, 9, 10]
[(1, 7), (2, 6), (3, 8), (4, 9), (5, 10)]

딕셔너리 정렬(?) 또한 lambda를 이용할 수 있음.

dic = { 2: 6, 3: 8, 5: 10, 1: 7, 4: 9 }

a = sorted(dic.items(), key=lambda x:x[0])
b = sorted(dic.items(), key=lambda x:x[1])
c = sorted(dic.items())

print(a)
print(b)
print(c)

결과

[(1, 7), (2, 6), (3, 8), (4, 9), (5, 10)]
[(2, 6), (1, 7), (3, 8), (4, 9), (5, 10)]
[(1, 7), (2, 6), (3, 8), (4, 9), (5, 10)]

0개의 댓글