Try to 개발자 EthanJ의 성장 로그

Python Data type (dictionary) 파이썬 자료형 (딕셔너리) 본문

CS & DS/Basic Python with Data Crawling

Python Data type (dictionary) 파이썬 자료형 (딕셔너리)

EthanJ 2022. 10. 8. 18:45

Python Data type 파이썬 자료형

 

6) 딕셔너리(dictionary)

  • 문법 : {key1 : value1, key2 : value2, key3 : value3 ... }
  • 생성 함수 : dict()
  • key로 가질 수 있는 데이터 타입 : 문자, 숫자, 튜플(tuple)
  • value로 가질 수 있는 데이터 타입 : 문자, 숫자, 리스트(list), 딕셔너리(dict), ...
  • 아이템 = key:value 하나의 쌍
  • 종류
    - item이 없는 dictionary
    - 1차원 dictionary
    - 다차원 dictionary
  • 특징
    - key, value의 차이점
    - 인덱스 번호를 가지지 않는다.

 

1. 생성하기

# 딕셔너리 생성하기
# 문법 : {k1:v1, k2:v2, ...}

d1 = {1:10, 2:20, 3:30}
type(d1)
dict

 

# 함수 dict() > dictionary 생성 가능

d2 = dict()
print(type(d2))
print(d2)
<class 'dict'>
{}

 

# 2차원 data list > dict(list)로 변환 가능

x = [['a', 'b'],
    ['a1', 'b1'],
    ['a2', 'b2']]
print(type(x))
print(x)

x = dict(x)
print(type(x))
print(x)
<class 'list'>
[['a', 'b'], ['a1', 'b1'], ['a2', 'b2']]
<class 'dict'>
{'a': 'b', 'a1': 'b1', 'a2': 'b2'}

 

# dict의 value의 자료형 > 제약 없음

dict1 = {1:[1, 2, 3], 2:{'a', 'b'}}
print(dict1)
{1: [1, 2, 3], 2: {'a', 'b'}}

 

# key vs. value
# key값 > 중복 data item 할당 불가능
# 중복 key로 선언 > 가장 마지막 하나만 반영됨

dict2 = {"name1":"김철수", "name2":"김영희", "name1":"홍길동"}
print(dict2)
{'name1': '홍길동', 'name2': '김영희'}

 

2. 인덱싱(indexing)

  • 인덱싱 문법
  • 일차원 vs. 다차원 인덱싱
  • dict 내장함수로 인덱싱
# 기존의 인덱싱 방벙 > 객체[index]

a = [1, 2, 3]
print(a[0])
1

 

# 문자열(sring), 리스트(list)와의 차이점 > 기준값으로 인덱스번호가 아닌 key값 사용

dict1 = {'a':10, 'b':20, 'c':30}
print(dict1['a'], dict1['c'])
10 30

 

# 인덱싱 방식 > 없는 key값을 조회하면 Error

dict1['d'] # > KeyError
KeyError: 'd'

 

# dict 내장함수 dict.get(key) > value 반환
# 없는 key값 조회시 > Error가 아니라 None 반환

print(dict1.get('d'))
None

 

# dict는 슬라이싱이 불가능
# 슬라이싱 대신 반복문 사용해야 함

dict1[:] # > TypeError
TypeError: unhashable type: 'slice'

 

> 연습문제

아래와 같은 다차원 딕셔너리를 만들고 제시한 값을 출력해보세요.
    {'a' : [1, 2, 3], 'b' : 100, 'c' : {'key1' : ['파인애플', '포도', '바나나'], 'key2' : (55, 66)}}
1) 3 출력하기
2) ['파인애플', '포도', '바나나'] 출력하기
3) 포도 출력하기
4) 55 출력하기

 

n_dict = {'a' : [1, 2, 3],
     'b' : 100,
     'c' : {'key1' : ['파인애플', '포도', '바나나'],
            'key2' : (55, 66)}}

# 1) 3 출력하기

print(n_dict['a'][2])
3

 

# 2) ['파인애플', '포도', '바나나'] 출력

print(n_dict['c']['key1'])
['파인애플', '포도', '바나나']

 

# 3) 포도 출력

print(n_dict['c']['key1'][1])
포도

 

# 4) 55 출력

print(n_dict['c']['key2'][0])
55
 

3. 아이템 추가하기

  • 인덱싱 방식으로 새로운 아이템 추가
  • 메소드 update() 사용

 

# 새로운 key값(indexing)에 value값 할당 > item 추가

dict1 = {'a':1, 'b':2, 'c':3}
dict1['d'] = 4
print(dict1)
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

 

# 기존에 존재하던 key값에 value 할당 > item 갱신

dict1['a'] = 10
print(dict1)
{'a': 10, 'b': 2, 'c': 3, 'd': 4}

 

 

# 하나 이상의 아이템(key:value) 추가/수정 > dict.update(data)
# data type > dict or dict로 변환 가능한 list

# dict.update(dict)

dict1.update({'e':5, 'f':6, 'g':7})
print(dict1)
{'a': 10, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7}

 

# dict.update(list)

data_list = [['h', 8],
            ['i', 9],
            ['j', 10]]

dict1.update(data_list)
print(dict1)
{'a': 10, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10}

 

# dict.update(list) > dict로 변환되는 2차원 data list만 가능

dict(data_list)
{'h': 8, 'i': 9, 'j': 10}

 

# list(dict) > key value로만 list 구성

list(dict1)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

 

4. 삭제하기

  • 하나의 아이템 삭제하기
  • 모든 아이템 삭제하기 > 빈 딕셔너리만 남음

 

# 하나의 item 삭제하기 : del 키워드 + 딕셔너리 indexing

print(dict1)

del dict1['d']
print(dict1)
{'a': 10, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10}
{'a': 10, 'b': 2, 'c': 3, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10}

 

# 단, dict.get(key)을 이용한 삭제 불가능

del dict1.get('c') # > SyntaxError
SyntaxError: cannot delete function call

 

# 딕셔너리 통째로 비우는 함수 > dict.clear()
# del dict > 딕셔너리 객체를 삭제
# dict.clear() > 빈 dict 객체 남김

dict1.clear()
dict1
{}

 

# 주의 : del itme > item 객체 자체 삭제

print(dict2)
del dict2
print(dict2) # NameError
{'name1': '홍길동', 'name2': '김영희'}
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Input In [60], in <cell line: 5>()
      3 print(dict2)
      4 del dict2
----> 5 print(dict2)

NameError: name 'dict2' is not defined

 

5. 딕셔너리 내장함수 & 관련 연산자 > return != None > 원본 dict 영향 X

  • dict.keys()
  • dict.values()
  • dict.items()
  • in 연산자
# 딕셔너리가 가지고 있는 key만 리스트 형식으로 반환 : dict.keys()

dict1 = {'name':'홍길동', 'age':18, 'job':'학생'}
list_keys = dict1.keys()
print(list_keys)
dict_keys(['name', 'age', 'job'])

 

# list() 리스트 함수를 통해 자료형 변환이 쉽다.

list(dict1.keys())
['name', 'age', 'job']

 

# dict가 가지고 있는 value만 list로 반환 : dict.values()

print(dict1.values())
dict_values(['홍길동', 18, '학생'])

 

# dict가 가진 item(key:value 쌍)을 tuple로 묶은 list로 반환 : dict.items()

print(dict1.items())
print(list(dict1.items()))
dict_items([('name', '홍길동'), ('age', 18), ('job', '학생')])
[('name', '홍길동'), ('age', 18), ('job', '학생')]

 

# in 키워드 > 특정 key값의 존재 여부 check 가능

'age' in dict1
True

 

> 연습문제

아래와 같은 딕셔너리를 생성하고 해당 딕셔너리의 value 중 최소값을 구하여 형식에 맞게 출력하세요.

생성 딕셔너리 : {'A':9, 'B':80, 'C':70}

  • 조건1. 생성한 딕셔너리에 " 'D' : 20, 'E' : 100, 'F' : 10 " 아이템 3개를 추가하세요.
  • 조건2. key 'A'의 값을 9 에서 90 으로 변경하세요.
  • 조건3. '최소 값 10을 가진 key는 F입니다.'로 포맷팅을 사용하여 출력하고 10을 포맷팅 값으로 사용하세요.
  • 조건4. 최소 값은 딕셔너리에 속한 내장함수와 파이썬 내장함수를 둘 다 사용하여 한번에 구해보세요.
my_dict = {'A':9, 'B':80, 'C':70}

# 조건1

my_dict['D'] = 20
my_dict.update({'E':100, 'F':10})

print(my_dict)
{'A': 9, 'B': 80, 'C': 70, 'D': 20, 'E': 100, 'F': 10}

 

# 조건 2

my_dict['A'] = 90
print(my_dict)
{'A': 90, 'B': 80, 'C': 70, 'D': 20, 'E': 100, 'F': 10}

 

# 조건 3

print("'최소 값 %d를 가진 key는 %s입니다.'" %(my_dict['F'], 'F'))
'최소 값 10를 가진 key는 F입니다.'

 

# 조건 4
# min(list) : 리스트 내의 가장 작은 값 하나 반환

print(min(my_dict.values()))
10
Comments