[3주차4일차] Chapter 04_자료구조/알고리즘 자료구조8~9

HA_·2023년 10월 25일
0

딕셔너리(Dictionary)

딕셔너리(Dictionary)란?

키(key)와 값(value)를 이용해서 자료를 관리한다.
cf) 키는 중복되지 말아야 하지만, 값은 중복 가능함.

딕셔너리 선언

'{}'를 이용해서 선언하고, '키:값'의 형태로 아이템을 정의한다.

  • key와 value에는 숫자, 문자(열), 논리형 뿐만 아니라 컨테이너 자료형도 올 수 있다.
  • 단, key에 immutable 값은 올 수 있지만 mutable 값은 올 수 없다.
# 실습
myInfo = {'이름': '박경진',
          '전공': 'computer',
          '메일': 'jin@naver.com',
          '학년': 3,
          '주소': '대한민국 서울',
          '취미': ['요리', '여행']}
print('myInfo: {}' .format(myInfo))
# print('myInfo: {}' .format(type(myInfo)))
# 결괏값:
myInfo: {'이름': '박경진', '전공': 'computer', '메일': 'jin@naver.com', '학년': 3, '주소': '대한민국 서울', '취미': ['요리', '여행']}
myInfo: <class 'dict'>

딕셔너리 조회

딕셔너리 조회

딕셔너리는 키(key)를 이용해서 값(value)을 조회한다.
존재하지 않는 키를 이용한 조회 시 에러(error)가 발생한다.

students = {'s1':'홍길동', 's2':'박찬호', 's3':'이용규', 's4':['박세리', '박공주']}

print(students['s1'])
print(students['s2'])
print(students['s3'])
print(students['s4'])
print(students['s4'][0])
print(students['s4'][1])
# 결괏값:
홍길동
박찬호
이용규
['박세리', '박공주']
박세리
박공주

get()를 이용한 조회

get(key)를 이용해서 값(value)을 조회할 수 있다.

students = {'s1':'홍길동', 's2':'박찬호', 's3':'이용규', 's4':['박세리', '박공주']}

print(students.get('s1'))
print(students.get('s2'))
print(students.get('s3'))
print(students.get('s4'))

print(students.get('444'))
# 결괏값:
홍길동
박찬호
이용규
['박세리', '박공주']
None

실습

나의 정보(이름, 전공, 메일, 주소 등)를 딕셔너리에 저장하고 '[]'와 'get()'함수를 이용해서 조회하고 출력하자.

myInfo = {
    '이름': '박경진',
    '전공': 'computer',
    '메일': 'jin@naver.com',
    '학년': 3,
    '주소': '대한민국 서울',
    '취미': ['요리', '여행']}

print(myInfo)

print(myInfo['이름'])
print(myInfo['메일'])
print(myInfo['취미'])

print(myInfo.get('이름'))
print(myInfo.get('메일'))
print(myInfo.get('취미'))

print(myInfo.get('주소2'))
# 결괏값:
{'이름': '박경진', '전공': 'computer', '메일': 'jin@naver.com', '학년': 3, '주소': '대한민국 서울', '취미': ['요리', '여행']}
박경진
jin@naver.com
['요리', '여행']
박경진
jin@naver.com
['요리', '여행']
None

딕셔너리 추가

딕셔너리 추가

'딕셔너리이름[키(key)] = 값(value)' 형태로 아이템을 추가한다.
추가하려는 키가 있다면 기존 값이 변경된다.

myInfo = {}

myInfo['이름'] = '박경진'
myInfo['전공'] = 'computer'
myInfo['메일'] = 'jin@gamil.com'
myInfo['학년'] = 3
myInfo['주소'] = 'korea seoul'
myInfo['취미'] = ['수영', '여행']

print(myInfo)

myInfo['메일'] = 'jin@naver.com'
print(myInfo)
#결괏값:
{'이름': '박경진', '전공': 'computer', '메일': 'jin@gamil.com', '학년': 3, '주소': 'korea seoul', '취미': ['수영', '여행']}
{'이름': '박경진', '전공': 'computer', '메일': 'jin@naver.com', '학년': 3, '주소': 'korea seoul', '취미': ['수영', '여행']}

실습1

학생 정보(이름, 학년, 메일, 주소)를 입력받아 딕셔너리에 추가해보자.

studentInfo = {}

studentInfo['name'] = input('이름 입력: ')
studentInfo['grade'] = input('학년 입력: ')
studentInfo['mail'] = input('메일 입력: ')
studentInfo['addr'] = input('주소 입력: ')

print(f'studentInfo : {studentInfo}')
# 결괏값:
이름 입력: 홍길동
학년 입력: 2
메일 입력: gildong@gmail.com
주소 입력: korea seoul
studentInfo : {'name': '홍길동', 'grade': '2', 'mail': 'gildong@gmail.com', 'addr': 'korea seoul'}

실습2

0부터 10까지의 각각의 정수에 대한 팩토리얼을 딕셔너리에 추가해보자.

factorialDic = {}
for i in range(11):
    if i == 0:
        factorialDic[i] = 1
    else:
        for j in range(1, (i+1)):
            factorialDic[i] = factorialDic[i-1] * j

print(f'factorialDic : {factorialDic}')
# 결괏값:
factorialDic : {0: 1, 1: 1, 2: 2, 3: 6, 4: 24, 5: 120, 6: 720, 7: 5040, 8: 40320, 9: 362880, 10: 3628800}

딕셔너리 수정

딕셔너리 수정

'딕셔너리이름[키(key)] = 값(value)' 형태로 아이템을 수정한다.

실습1

학생의 시험 점수가 60점 미만이며 'F(재시험)'으로 값을 변경해보지.

scores = {'kor': 88, 'eng': 55, 'mat': 85, 'sci': 57, 'his': 82}
print(f'scores : {scores}')

minScore = 60
fStr = 'F(재시험)'
if scores['kor'] < minScore: scores['kor'] = fStr
if scores['eng'] < minScore: scores['eng'] = fStr
if scores['mat'] < minScore: scores['mat'] = fStr
if scores['sci'] < minScore: scores['sci'] = fStr
if scores['his'] < minScore: scores['his'] = fStr
print(f'scores : {scores}')
# 결괏값:
scores : {'kor': 88, 'eng': 55, 'mat': 85, 'sci': 57, 'his': 82}
scores : {'kor': 88, 'eng': 'F(재시험)', 'mat': 85, 'sci': 'F(재시험)', 'his': 82}

실습2

하루에 몸무게(kg)와 신장(cm)이 각각 -0.3kg, +0.001m씩 변한다고 할 때, 30일 후의 몸무게와 신장의 값을 저장하고 BMI 값도 출력하는 프로그램을 만들어보자.

myBodyInfo = {'이름':'gildong', '몸무게':83.0, '신장':1.8}
myBMI = myBodyInfo['몸무게'] / (myBodyInfo['신장'] ** 2)
print(f'myBodyInfo: {myBodyInfo}')
print(f'myBMI: {round(myBMI, 2)}')

date = 0
while True:
    date += 1

    myBodyInfo['몸무게'] = round((myBodyInfo['몸무게'] - 0.3 ), 2)
    print('몸무게 : {}' .format(myBodyInfo['몸무게']))

    myBodyInfo['신장'] = round((myBodyInfo['신장'] + 0.001), 3)
    print('신장 : {}s'.format(myBodyInfo['신장']))

    myBMI = myBodyInfo['몸무게'] / (myBodyInfo['신장'] ** 2)

    if date >= 30:
        break

print(f'myBodyInfo: {myBodyInfo}')
print(f'myBMI: {round(myBMI, 3)}')
# 결괏값:
myBodyInfo: {'이름': 'gildong', '몸무게': 83.0, '신장': 1.8}
myBMI: 25.62
몸무게 : 82.7
신장 : 1.801s
몸무게 : 82.4
신장 : 1.802s
몸무게 : 82.1
신장 : 1.803s
몸무게 : 81.8
신장 : 1.804s
몸무게 : 81.5
신장 : 1.805s
몸무게 : 81.2
신장 : 1.806s
몸무게 : 80.9
신장 : 1.807s
몸무게 : 80.6
신장 : 1.808s
몸무게 : 80.3
신장 : 1.809s
몸무게 : 80.0
신장 : 1.81s
몸무게 : 79.7
신장 : 1.811s
몸무게 : 79.4
신장 : 1.812s
몸무게 : 79.1
신장 : 1.813s
몸무게 : 78.8
신장 : 1.814s
몸무게 : 78.5
신장 : 1.815s
몸무게 : 78.2
신장 : 1.816s
몸무게 : 77.9
신장 : 1.817s
몸무게 : 77.6
신장 : 1.818s
몸무게 : 77.3
신장 : 1.819s
몸무게 : 77.0
신장 : 1.82s
몸무게 : 76.7
신장 : 1.821s
몸무게 : 76.4
신장 : 1.822s
몸무게 : 76.1
신장 : 1.823s
몸무게 : 75.8
신장 : 1.824s
몸무게 : 75.5
신장 : 1.825s
몸무게 : 75.2
신장 : 1.826s
몸무게 : 74.9
신장 : 1.827s
몸무게 : 74.6
신장 : 1.828s
몸무게 : 74.3
신장 : 1.829s
몸무게 : 74.0
신장 : 1.83s
myBodyInfo: {'이름': 'gildong', '몸무게': 74.0, '신장': 1.83}
myBMI: 22.097

keys()와 values()

keys()와 values()

전체 키(key)와 값(value)를 조회할 수 있다.

memInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3, '취미':['농구', '게임']}

ks = memInfo.keys()
print(f'ks : {ks}')
print(f'ks type : {type(ks)}')

print(' ')

vs = memInfo.values()
print(f'vs : {vs}')
print(f'vs type : {type(vs)}')

print(' ')

items = memInfo.items()
print(f'items : {items}')
print(f'items type : {type(items)}')
# 결괏값:
ks : dict_keys(['이름', '메일', '학년', '취미'])
ks type : <class 'dict_keys'>
 
vs : dict_values(['홍길동', 'gildong@gmail.com', 3, ['농구', '게임']])
vs type : <class 'dict_values'>
 
items : dict_items([('이름', '홍길동'), ('메일', 'gildong@gmail.com'), ('학년', 3), ('취미', ['농구', '게임'])])
items type : <class 'dict_items'>

리스트(list())로 변환하기

memInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3, '취미':['농구', '게임']}

ks = memInfo.keys()
ks = list(ks)
print(f'ks : {ks}')
print(f'ks type : {type(ks)}')

print(' ')

vs = memInfo.values()
vs = list(vs)
print(f'vs : {vs}')
print(f'vs type : {type(vs)}')

print(' ')

items = memInfo.items()
items = list(items)
print(f'items : {items}')
print(f'items type : {type(items)}')
# 결괏값:
ks : ['이름', '메일', '학년', '취미']
ks type : <class 'list'>
 
vs : ['홍길동', 'gildong@gmail.com', 3, ['농구', '게임']]
vs type : <class 'list'>
 
items : [('이름', '홍길동'), ('메일', 'gildong@gmail.com'), ('학년', 3), ('취미', ['농구', '게임'])]
items type : <class 'list'>

for문을 이용한 조회

memInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3, '취미':['농구', '게임']}

for key in memInfo.keys():
    print(f'{key}: {memInfo[key]}')
# 결괏값:
이름: 홍길동
메일: gildong@gmail.com
학년: 3
취미: ['농구', '게임']

딕셔너리 삭제

del

del과 key를 이용한 item 삭제

memInfo = {'이름':'홍길동',
           '메일':'gildong@gmail.com',
           '학년':3,
           '취미':['농구', '게임']}

print(memInfo)

del memInfo['이름']
print(memInfo)

del memInfo['취미']
print(memInfo)
# 결괏값:
{'이름': '홍길동', '메일': 'gildong@gmail.com', '학년': 3, '취미': ['농구', '게임']}
{'메일': 'gildong@gmail.com', '학년': 3, '취미': ['농구', '게임']}
{'메일': 'gildong@gmail.com', '학년': 3}

pop()

pop()와 key를 이용한 item 삭제

memInfo = {'이름':'홍길동',
           '메일':'gildong@gmail.com',
           '학년':3,
           '취미':['농구', '게임']}

print(f'memInfo: {memInfo}')

returnValue = memInfo.pop('이름')
print(f'memInfo: {memInfo}')
print(f'returnValue: {returnValue}')
print(f'returnValue type: {type(returnValue)}')

returnValue = memInfo.pop('취미')
print(f'memInfo: {memInfo}')
print(f'returnValue: {returnValue}')
print(f'returnValue type: {type(returnValue)}')
# 결괏값:
memInfo: {'이름': '홍길동', '메일': 'gildong@gmail.com', '학년': 3, '취미': ['농구', '게임']}
memInfo: {'메일': 'gildong@gmail.com', '학년': 3, '취미': ['농구', '게임']}
returnValue: 홍길동
returnValue type: <class 'str'>
memInfo: {'메일': 'gildong@gmail.com', '학년': 3}
returnValue: ['농구', '게임']
returnValue type: <class 'list'>

실습

딕셔너리에 저장된 점수 중 최저 및 최고 점수를 삭제하는 프로그램을 만들어보자.

scores = {'score1' :8.9, 'score2' :8.1, 'score3' :8.5, 'score4' :9.8, 'score5' :8.8}

minScore = 10; minScoreKey = ''
maxScore = 0; maxScoreKey = ''

for key in scores.keys():
    if scores[key] < minScore:
        minScore = scores[key]
        minScoreKey = key

    if scores[key] > maxScore:
        maxScore = scores[key]
        maxScoreKey = key

print('minScore : {}' .format(minScore))
print('minScoreKey : {}' .format(minScoreKey))

print('maxScore : {}' .format(maxScore))
print('maxScoreKey : {}' .format(maxScoreKey))

del scores[minScoreKey]
del scores[maxScoreKey]

print('scores : {}' .format(scores))
# 결괏값:
minScore : 8.1
minScoreKey : score2
maxScore : 9.8
maxScoreKey : score4
scores : {'score1': 8.9, 'score3': 8.5, 'score5': 8.8}

딕셔너리 유용한 기능

in, not in

키(key) 존재 유/무 판단한다.

memInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3, '취미':['농구', '게임']}

print('이름' in memInfo)
print('메일' in memInfo)
print('학년' in memInfo)
print('취미' in memInfo)

print(' ')

print('name' not in memInfo)
print('mail' not in memInfo)
print('grade' not in memInfo)
print('hobby' not in memInfo)
# 결괏값:
True
True
True
True
 
True
True
True
True

len()

딕셔너리 길이(아이템 개수)를 알 수 있다.

memInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3, '취미':['농구', '게임']}

print('len(memInfo) : {}' .format(len(memInfo)))
# 결괏값:
len(memInfo) : 4

clear()

모든 아이템을 삭제한다.

memInfo = {'이름':'홍길동', '메일':'gildong@gmail.com', '학년':3, '취미':['농구', '게임']}

print('memInfo : {}' .format(memInfo))

memInfo.clear()
print('memInfo : {}' .format(memInfo))
# 결괏값:
memInfo : {'이름': '홍길동', '메일': 'gildong@gmail.com', '학년': 3, '취미': ['농구', '게임']}
memInfo : {}

실습

개인 정보에 '연락처'와 '주민등록번호'가 있다면 삭제하는 코드를 작성해보자.

myInfo = {'이름':'Hong Gildong', '나이':'30', '연락처': '010-1234-5678', '주민등록번호':'840315-1234567', '주소':'대한민국 서울'}
print(myInfo)

deleteItem = ['연락처', '주민등록번호']

for item in deleteItem:
    if (item in myInfo):
        del myInfo[item]

print(myInfo)
# 결괏값:
{'이름': 'Hong Gildong', '나이': '30', '연락처': '010-1234-5678', '주민등록번호': '840315-1234567', '주소': '대한민국 서울'}
{'이름': 'Hong Gildong', '나이': '30', '주소': '대한민국 서울'}

0개의 댓글