Python: 자료형 딕셔너리 (dictionary)

dev-swd·2020년 10월 25일
0

python

목록 보기
6/23
post-thumbnail
post-custom-banner

자료형: 딕셔너리 (dictionary)

  • 연관 배열 또는 해쉬(Hash)라고도 하는 자료형으로 키와 값을 가지고 있다.
  • 키 값에 대해서 연관되는 값을 저장해서 사용하고 싶을 때 사용한다.
  • 딕셔너리의 형태는 아래와 같다.
dic = {
  "자료형1":"숫자",
  "자료형2":"문자열",
  "자료형3":"리스트",
  "자료형4":"튜플",
  .
  .
}
  • 딕셔너리에서 key는 고유한 값이어야 한다.
  • key 값이 중복되서 들어갈 수 있지만, 특정 키에 매치되는 값을 얻고 싶을 때 문제가 될 수 있다.

딕셔너리의 key 값으로 들어갈 수 있는 자료형

  • 딕셔너리의 키 값으로 튜플은 사용이 가능하다.
  • 하지만 리스트와 딕셔너리는 사용할 수 없다. 변경 될 수 있는 값은 키 값으로 쓰일 수 없기 때문이다.
  • 키 값으로 사용할 수 있는가는 변경이 불가한지의 여부이다.

딕셔너리 생성 방법

""" 빈 딕셔너리 """
dic1 = {}
dic1 = dict()


""" {} 사용할 떄 """
dic = {
  "키":"값",
}


""" dict() 사용할 때"""
# 이 방식은 key 의 값이 자동으로 스트링 값으로 바뀐다. 따라서 숫자 혹은 "" 넣으면 에러 발생
dict(key=val, key=val)


"""dict(zip([], [])) 사용할 때"""
# 키와 값이 들어있는 각각의 리스트를 파라미터로 넘겨주면, 자동으로 키와 값 쌍으로 들어감.
# 이 때 키나 값의 요소의 갯수가 정확하게 맞지 않는다면, 넘치는 쪽이 무시된다.
dir2 = dict(zip(["name", "height", "weight"], ["sss", 182]))
dir3 = dict(zip(["name", "height", "weight"], ["sss", 182, 88 , "developer"]))
print(dir2) # {'name': 'sss', 'height': 182}
print(dir3) # {'name': 'sss', 'height': 182, 'weight': 88}


""" dict([(key, val), (key, val)] """
# 하나의 리스트 안에 여러 개의 튜플을 저장해서 생성
dir4 = dict([("name", "sss"), ("height", 180)])
print(dir4) # {'name': 'sss', 'height': 180}


""" dict({key : val, key : val}) """
# dict() 내장 함수 안에 {} 를 사용

딕셔너리 값 할당하기

"" [] 를 활용하여 키에 접근해서 값 할당 """
dic1 = dict({
  "name":"sss",
  "height": 180
})

dic1["name"] = "aaa"
print(dic1) # {'name': 'aaa', 'height': 180}


""" setdefault(key, value) 메서드를 사용해서 키와 값 할당 """
# 키만 지정하면 값은 None
dic2 = {}
dic2.setdefault("name")
print(dic2) # {'name': None}


""" update(key = value) """
dic2.update(name = "sss")
print(dic2)

# 해당하는 키의 값을 수정한다.
# 키가 없다면 추가한다.
# , 를 통해서 여러 개를 한꺼번에 수정하거나 추가할 수 있다.
# 키가 문자열 일 때만 사용할 수 있다.
# 키가 숫자일 경우네는 update(딕셔너리) 형태로 수정할 수 있다.
# update({1:"a", 2:"b"})


""" 리스트와 튜플을 활용하기 """ 
# 이 때 리스트와 튜플은 키-값 쌍으로 이루어져 있어야 한다.
# update([키, 값], [키, 값])
# update((키, 값), (키, 값))

""" update(zip([], [])) """
# dic.update(zip([], []))

딕셔너리 값 삭제

""" pop() """
# 문법 오류. 리스트와 햇갈리지 말자.
x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
x.pop() # TypeError: pop expected at least 1 argument, got 0


""" pop(키) """ 
# 해당하는 키의 값와 값을 딕셔너리에서 삭제하면서, 값을 반환한다.
# 키 값이 없다면 key error 발생
x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
y = x.pop("a")


""" pop(키, 기본 값) """
# 키가 없을 때, 지정한 기본 값을 반환한다.
x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
y = x.pop("A", 1)
print(x) # 삭제되지 않음
print(y) # 1


""" del dic[키] """
# 생략


""" popitem() 임의의 키-값 쌍 삭제하기 """
# 임의의 키-값 쌍을 삭제하고, 삭제한 키-값 쌍을 튜플로 반환.
# 3.6 이상 버전에서는 마지막 키-값 쌍을 삭제.
# 3.5 이하 버전에서는 임의의 키-값 쌍을 삭제.
x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
a = x.popitem()
print(x)
print(a)


""" clear() 모든 키와 값 삭제 """
# 생략

딕셔너리 키, 값 가져오기

x = {'a': 0, 'b': 0, 'c': 0, 'd': 0}

""" get(키) """
# 해당 키의 값 가져오기
# 값을 가져옴
x.get("a") # 0


""" items() """
# 키 값 쌍 모두 가져오기
x.items() # dict_items([('a', 0), ('b', 0), ('c', 0), ('d', 0)])


""" keys() """
# 모든 키 가져오기
x.keys() # dict_keys(['a', 'b', 'c', 'd'])


""" values() """
# 모든 값 가져오기
x.values() # dict_values([0, 0, 0, 0])

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

""" 리스트와 튜플로 딕셔너리 만들기 """
""" fromkeys(iter) """
keys = ["a", "b", "c", "d"]

# 키만 넣으면 기본 값 None 으로 생성
dic = dict.fromkeys(keys)
# >> {'a': None, 'b': None, 'c': None, 'd': None}


# 지정한 값으로 설정하기
dic = dict.fromkeys(keys, 100)
# >> {'a': 100, 'b': 100, 'c': 100, 'd': 100}

없는 키에 접근했을 때 KeyError 가 발생하지 않도록

""" defaultdict 사용 """
from collections import defaultdict

dic = defaultdict(int) # int 로 기본값 생성
dic['asdfasdfasdf'] # 0


""" 0이 아닌 다른 값을 기본값으로 설정하기 (기본값 생성 함수를 만들어야 함) """
dic = defaultdict(lambda: "default") # int 로 기본값 생성
dic['asdfasdfasdf'] # "default"

키가 있는지 없는지를 검사하고 싶은 경우에는 in 을 사용한다

dic1 = dict({
  "name":"sss",
  "height": 180
})

print("name" in dic1) # True, 키가 없는 경우 False 를 반환한다.

딕셔너리의 갯수를 구하면, 키의 갯수가 나타난다.

dic1 = dict({
  "name":"sss",
  "height": 180
})

print(len(dic1)) # 2

딕셔너리 표현식

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

리스트 표현식과 마찬가지로 딕셔너리도 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}

  • 딕셔너리 표현식을 사용할 때는 for in 다음에 딕셔너리를 지정하고, items() 를 사용한다.
x = {key: value for key, value in dict.fromkeys(keys).items()}

{key: 0 for key in dict.fromkeys(['a', 'b', 'c', 'd']).keys()} # 키만 가져옴

{value: 0 for value in {'a': 10, 'b': 20, 'c': 30, 'd': 40}.values()} # 값을 키로 사용

{value: key for key, value in {'a': 10, 'b': 20, 'c': 30, 'd': 40}.items()}  # 키-값 자리를 바꿈

딕셔너리 표현식에서 if 조건문 사용하기

  • {키: 값 for 키, 값 in 딕셔너리 if 조건식}
  • dict({키: 값 for 키, 값 in 딕셔너리 if 조건식})
x = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
x = {key: value for key, value in x.items() if value != 20}

{'a': 10, 'c': 30, 'd': 40}

딕셔너리는 특정 키를 삭제하는 pop 메서드만 제공하고 특정 값을 삭제하는 메서드는 제공하지 않는다.
또한 아래와 같이 반복문을 사용해서 특정 값을 삭제하려고 해도, 삭제되는 순간 딕셔너리의 크기가 바뀌기 때문에 에러가 발생할 수 있다. 따라서 위와 같이 특정 값을 가진 데이터를 제외하여, 재할당하는 식으로 삭제가 가능하다.

출처: 코딩도장 파이썬 (https://dojang.io/mod/page/view.php?id=2309)

profile
개발을 취미로 할 수 있는 그 때 까지
post-custom-banner

0개의 댓글