사전은 프로그래밍언어에 따라 연관배열, 맵 등으로 불리기도 하며 매우 다양하게 활용된다. 집합과 사전은 해시 가능한 값만을 이용하기에 해시 가능성도 함께 소개한다. 이후에는 논리식을 이용하여 간편하게 리스트와 정의하는 조건제시법을 다룬다.
7.1사전 생성¶
사전 자료형은 키key와 값value의
쌍으로 구성된 항목들의 집합이며, 딕셔너리dictionary 라고도 불린다.
예를 들어, 'Hello' 와 'World' 를 키로, '안녕', '세계' 를 각각의 키에 대한 값으로
갖는 사전은 다음과 같다.
eng_dict = {'Hello': '안녕', 'World': '세계', 'Programming': '프로그래밍'}빈 사전
빈 사전은 아무것도 포함하지 않는 사전을 의미한다. 빈 사전를 만드는 방법은 아래와 같다.
empty_dict = {}
empty_dict{}다음 방식도 가능하다.
empty_dict = dict()
empty_dict{}dict() 함수
키-값의 튜플 형식의 항목을 갖는 모음 자료형을 사전으로 변환한다.
eng_words = [('Hello', '안녕'), ('World', '세계'), ('Programming', '프로그래밍')]
eng_dict = dict(eng_words)
eng_dict{'Hello': '안녕', 'World': '세계', 'Programming': '프로그래밍'}7.2사전 항목 추가, 업데이트, 삭제¶
아래와 같은 형식으로 사전에 항목을 추가하거나 업데이트 한다.
사전[key] = value예를 들어, dic에 Python : 파이썬 항목을 다음과 같이 추가할 수 있다.
eng_dict['Python'] = '파이썬'
eng_dict{'Hello': '안녕', 'World': '세계', 'Programming': '프로그래밍', 'Python': '파이썬'}이미 사용된 키를 이용하면 키와 연결된 값이 업데이트 된다.
eng_dict['World'] = '세상'
eng_dict{'Hello': '안녕', 'World': '세상', 'Programming': '프로그래밍', 'Python': '파이썬'}사전의 항목은 del 명령어에 키를 지정하여 삭제한다.
del eng_dict['World']
eng_dict{'Hello': '안녕', 'Programming': '프로그래밍', 'Python': '파이썬'}보다 실용적인 예제를 활용하기 위해
6명의 정보를 담은 리스트를 이용하여 키는 이름, 값은 해당 이름의 정보를 담은 리스트를 사용하는 사전을
가리키는 info_dict 변수를 정의하려 한다.
info_list = [['김강현', '010-1234-5678', 20, 172.5, '제주'],
['황현', '02-9871-1234', 19, 163.5, '서울'],
['남궁수현', '01-3456-7891', 21, 156.7, '경기'],
['최흥선', '070-4321-1111', 21, 187.2, '부산'],
['김선주', '010-3333-8888', 22, 164.6, '광주'],
['함중아', '010-7654-2345', 18, 178.3, '강원']]이를 위해 for 반복문과 6.5절의 리스트 해체를 이용한다.
먼저 info_list의 항목은 아래 형식임에 주의한다.
person = ['김강현', '010-1234-5678', 20, 172.5, '제주']위 리스트를 이름과 나머지로 구분하기 위해 다음과 같이 리스트 해체를 이용한다.
name, *rest = person그러면 name은 이름을, rest는 나머지 항목으로 구성된 리스트를 가리키게 되어
두 변수를 다음과 같이 선언한 것과 동일하다.
name = person[0]
rest = person[1:]print('name:', name)
print('rest:', rest)name: 김강현
rest: ['010-1234-5678', 20, 172.5, '제주']
지금까지의 설명을 정리해서 info_dict 변수를 아래와 같이 선언한다.
먼저 빈 사전 생성
info_list에 포함된 항목을 이름과 나머지로 쪼갠 후 사전에 항목 추가 진행
info_dict = dict() # 빈 사전 생성
for person in info_list: # info_list에서 한 사람씩 꺼내어 사전에 추가
name, *rest = person
info_dict[name] = restinfo_dict {'김강현': ['010-1234-5678', 20, 172.5, '제주'],
'황현': ['02-9871-1234', 19, 163.5, '서울'],
'남궁수현': ['01-3456-7891', 21, 156.7, '경기'],
'최흥선': ['070-4321-1111', 21, 187.2, '부산'],
'김선주': ['010-3333-8888', 22, 164.6, '광주'],
'함중아': ['010-7654-2345', 18, 178.3, '강원']}7.3사전 키 인덱싱¶
사전에 사용된 키를 이용한 인덱싱이 지원된다.
예를 들어, 아래 딕셔너리 info_dict에서 '김선주'의 정보를 보고 싶으면
다음과 같이 인덱싱을 실행하면 된다.
info_dict['김선주']['010-3333-8888', 22, 164.6, '광주']존재하지 않는 키로 값을 추출하려고 하면 오류가 발생한다.
에를 들어 '김성주' 라고 이름을 잘못 입력하여
키 목록에 없는 값으로 인덱싱을 시도하면 경우 오류가 발생한다.
info_dict['김성주']---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
Cell In[71], line 1
----> 1 info_dict['김성주']
KeyError: '김성주'7.4사전 연산¶
in 연산자
사전의 키로 사용되었는 여부를 알려주는 논리 연산자다.
'김강현' in info_dictTrue'김성주' in info_dictFalsein의 부정은 not in을 사용한다. 즉
키로 사용되지 않았는지 여부를 뭍는다.
'김성주' not in info_dictTruelen() 함수
사전에 포함된 항목의 개수를 반환한다.
len(info_dict)67.5사전 메서드¶
사전 자료형이 제공하는 주요 메서드는 아래와 같다.
Table 1:사전 주요 메서드
기능 | 메서드 | 설명 |
|---|---|---|
키 확인 |
| 사전에 사용된 키로 구성된 순차 자료형 값 반환 |
값 확인 |
| 사전에 사용된 값으로 구성된 순차 자료형 값 반환 |
키와 값 확인 |
| 사전에 사용된 키와 값의 순서쌍으로 구성된 순차 자료형 값 반환 |
값 반환 |
| 지정된 키에 대한 값 반환 |
keys() 메서드: 키로 이루어진 모음 자료형 반환
info_dict.keys()dict_keys(['김강현', '황현', '남궁수현', '최흥선', '김선주', '함중아'])values() 메서드: 값으로 이루어진 모음 자료형 반환
info_dict.values()dict_values([['010-1234-5678', 20, 172.5, '제주'], ['02-9871-1234', 19, 163.5, '서울'], ['01-3456-7891', 21, 156.7, '경기'], ['070-4321-1111', 21, 187.2, '부산'], ['010-3333-8888', 22, 164.6, '광주'], ['010-7654-2345', 18, 178.3, '강원']])items() 메서드: (키, 값) 모양의 쌍으로 이루어진 모음 자료형 반환
info_dict.items()dict_items([('김강현', ['010-1234-5678', 20, 172.5, '제주']), ('황현', ['02-9871-1234', 19, 163.5, '서울']), ('남궁수현', ['01-3456-7891', 21, 156.7, '경기']), ('최흥선', ['070-4321-1111', 21, 187.2, '부산']), ('김선주', ['010-3333-8888', 22, 164.6, '광주']), ('함중아', ['010-7654-2345', 18, 178.3, '강원'])])get() 메서드: 지정된 키와 연관된 값 반환
info_dict.get('황현')['02-9871-1234', 19, 163.5, '서울']존재하지 않는 키를 사용하면 기본값으로 None이 사용된다.
info_dict.get('김성주')키가 포함되지 않았을 때 반환되는 값을 바꾸려면 둘째 인자를 지정한다.
info_dict.get('김성주', "이름 목록에 없어요.")'이름 목록에 없어요.'get() 메서드는 키 목록에 없는 값에 대한 인덱싱이 오류를 발생시키지 않도록 할 때 유용하게 활용된다.
예를 들어, 아래 코드의 name_age() 함수는
info_dict 를 활용하여 이름을 물으면 나이를 확인해준다.
def name_age(name):
info = info_dict[name]
return info[1]name_age('남궁수현')21하지만 부적절한 키를 사용하면 오류가 발생한다.
name_age('남궁현')---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
Cell In[88], line 1
----> 1 name_age('남궁현')
Cell In[86], line 2, in name_age(name)
1 def name_age(name):
----> 2 info = info_dict[name]
3 return info[1]
KeyError: '남궁현'프로그램은 실행하면서 오류가 발생하여 멈춰버리는 일은 일반적으로 바람직하지 않다.
이를 방지하기 위한 여러 대책이 필요하다.
여기서는 인덱싱 대신 get() 메서드를 활용하여 오류 대신
다른 정보를 주도록 하는 방식을 선택한다.
아래 수정된 name_age() 함수는 get() 메서드를 먼저
입력된 이름에 적용하여 반환값이 있는 경우와 그렇지 않은 경우를
구분해서 처리한다.
def name_age(name):
info = info_dict.get(name)
if info: # 정보가 있는 경우
return info[1]
else: # 정보가 없는 경우
return "정보없음"이름이 키 목록에 있는 경우엔 원하는 정보를 반환한다.
name_age('남궁수현')21그렇지 않은 경우엔 정보가 없다는 정보를 대신 전달한다.
name_age('남궁현')'정보없음'7.6사전 조건제시법¶
리스트의 경우와 유사하게 조건제시법을 이용하여 사전을 생성할 수 있다. 아래 코드는 0부터 10 사이의 홀수를 키로, 홀수의 제곱은 값으로 갖는 항목으로 구성된 사전을 생성한다.
odd_squares = {x : x**2 for x in range(11) if x%2 == 1}
odd_squares{1: 1, 3: 9, 5: 25, 7: 49, 9: 81}반면에 아래 코드는 문장에 포함된 단어를 키로, 단어의 길이를 값으로 갖는 항목들로 구성된 사전을 생성한다.
words = '파이썬은 범용 프로그래밍 언어입니다.'.split()
print(words)['파이썬은', '범용', '프로그래밍', '언어입니다.']
len_dict = {k : len(k) for k in words}
len_dict{'파이썬은': 4, '범용': 2, '프로그래밍': 5, '언어입니다.': 6}