[Python] 딕셔너리 자료형

·2025년 6월 27일

Python

목록 보기
26/33

딕셔너리란?

딕셔너리는 키(key)와 값(value)으로 구성된 자료 구조

딕셔너리의 필요성

  1. 빠른 데이터 검색: 키를 가지고 값을 빨리 찾을 수 있음
  • 리스트 자료형보다 데이터를 체계적으로 잘 정리해서 저장
  • 정리가 잘 되어있으니까 데이터 검색을 빠르게 할 수 있음
  1. 테이블 생성 가능: 딕셔너리 자료형으로 테이블 생성이 가능
  • 오라클의 테이블이 파이썬과 R에서는 data frame
  • 판다스 데이터프레임으로 만들어놓기만 하면 쉽게 검색하고 시각화 가능

✔️ 예제. 딕셔너리 기본 사용법

기본 딕셔너리 생성

키:값

a = {
    '마이클 잭슨': '하루 6시간씩 꾸준히 춤 연습을 했어요.',
    '김연아': '공중 세바퀴 회전 1번 실패하면 65번씩 연습했어요.',
    '박태환': '하루에 15,000km 이상 수영해야 세계적인 선수들과 겨룰 수 있어요'
}

예제1. 특정 값 출력

김연아 명언만 출력하시오

print(a['김연아'])

예제2. 키값들만 출력

print(a.keys())	# dict_keys(['마이클 잭슨', '김연아', '박태환'])

예제3. 값들만 출력

print(a.values())	# dict_values(['하루 6시간씩 꾸준히 춤 연습을 했어요.', '공중 세바퀴 회전 1번 실패하면 65번씩 연습했어요.', '하루에 15,000km 이상 수영해야 세계적인 선수들과 겨룰 수 있어요'])

예제4. 키와 값을 함께 출력

print(a.items())	# dict_items([('마이클 잭슨', '하루 6시간씩 꾸준히 춤 연습을 했어요.'), ('김연아', '공중 세바퀴 회전 1번 실패하면 65번씩 연습했어요.'), ('박태환', '하루에 15,000km 이상 수영해야 세계적인 선수들과 겨룰 수 있어요')])
for i in a.items():
    print(i)	# 키값만: print(i[0]) # 값만: print(i[1])
    
# ('마이클 잭슨', '하루 6시간씩 꾸준히 춤 연습을 했어요.')
# ('김연아', '공중 세바퀴 회전 1번 실패하면 65번씩 연습했어요.')
# ('박태환', '하루에 15,000km 이상 수영해야 세계적인 선수들과 겨룰 수 있어요')

예제5. 새로운 데이터 추가

a['신유빈'] = '내가 늘 하던데로 하면 긴장이 안돼요'
print(a)

문제1. 딕셔너리에 데이터 추가

a 딕셔너리에 양궁선수 안산 선수의 명언을 입력하시오

a['안산'] = '쫄지말고 대충쏴 ~'
# print(a)

for i in a.items():
    print(i[0], ':', i[1])
    
# 마이클 잭슨 : 하루 6시간씩 꾸준히 춤 연습을 했어요.
# 김연아 : 공중 세바퀴 회전 1번 실패하면 65번씩 연습했어요.
# 박태환 : 하루에 15,000km 이상 수영해야 세계적인 선수들과 겨룰 수 있어요
# 신유빈 : 내가 늘 하던데로 하면 긴장이 안돼요
# 안산 : 쫄지말고 대충쏴 ~

문제2. 중첩 딕셔너리 활용

우리 반 학생들의 과목별 점수를 저장한 딕셔너리에서 각 학생의 평균 점수를 계산하여 새로운 딕셔너리를 만드세요.
round(값, 자릿수)
ex. round(값, 1): 소수점 첫번째 자리까지 남겨두고 반올림

student_scores = {
    '김철수': {'국어': 85, '수학': 90, '영어': 78},
    '이영희': {'국어': 92, '수학': 88, '영어': 95},
    '박지성': {'국어': 75, '수학': 82, '영어': 90},
    '최유리': {'국어': 88, '수학': 95, '영어': 70},
    '정민호': {'국어': 94, '수학': 80, '영어': 85}
}

b = {}  # 빈 딕셔너리 생성
for name, scores in student_scores.items():
    b[name] = round(sum(scores.values())/len(scores.values()), 1)

print(b)

# 결과: {'김철수': 84.3, '이영희': 91.7, '박지성': 82.3, '최유리': 84.3, '정민호': 86.3}

⭐ 문제3. 딕셔너리를 데이터프레임으로 변환

print(b)

import pandas as pd

df2 = pd.DataFrame(b.items(), columns=['이름', '점수'])
df2	# {'김철수': 84.3, '이영희': 91.7, '박지성': 82.3, '최유리': 84.3, '정민호': 86.3}


# 이름이 박지성인 사람의 점수를 출력
df2.loc[df2.이름 == '박지성', : ]   # df2.loc[행,열]

	이름	점수
2	박지성	82.3

문제4. 아래의 중첩 딕셔너리를 판다스 데이터프레임으로 생성

student_scores = {
    '김철수': {'국어': 85, '수학': 90, '영어': 78},
    '이영희': {'국어': 92, '수학': 88, '영어': 95},
    '박지성': {'국어': 75, '수학': 82, '영어': 90},
    '최유리': {'국어': 88, '수학': 95, '영어': 70},
    '정민호': {'국어': 94, '수학': 80, '영어': 85}
}

import pandas as pd

all_data = []   # 빈 리스트 생성
for name, scores in student_scores.items():
    print(name, scores['국어'], scores['수학'], scores['영어'])
    all_data.append([name, scores['국어'], scores['수학'], scores['영어']])

print(all_data)

df = pd.DataFrame(all_data, columns=['이름', '국어', '수학', '영어'])
df

문제. 아래의 중첩 딕셔너리를 판다스 데이터 프레임으로 구성하시오

# 오라클 성능 관련 중첩 딕셔너리
oracle_performance = {
    'DB_SERVER_01': {
        'CPU_사용률': 85.2,
        '메모리_사용률': 72.5,
        '디스크_IO': 1250,
        '세션_수': 120,
        '응답시간_ms': 45
    },
    'DB_SERVER_02': {
        'CPU_사용률': 78.9,
        '메모리_사용률': 68.3,
        '디스크_IO': 980,
        '세션_수': 95,
        '응답시간_ms': 38
    },
    'DB_SERVER_03': {
        'CPU_사용률': 92.1,
        '메모리_사용률': 85.7,
        '디스크_IO': 1580,
        '세션_수': 145,
        '응답시간_ms': 62
    },
    'DB_SERVER_04': {
        'CPU_사용률': 65.4,
        '메모리_사용률': 58.9,
        '디스크_IO': 750,
        '세션_수': 80,
        '응답시간_ms': 28
    },
    'DB_SERVER_05': {
        'CPU_사용률': 88.7,
        '메모리_사용률': 79.2,
        '디스크_IO': 1320,
        '세션_수': 110,
        '응답시간_ms': 52
    }
}

import pandas as pd

all_data = []   # 빈 리스트 생성
for k, v in oracle_performance.items():
    print(k, v['CPU_사용률'], v['메모리_사용률'], v['디스크_IO'], v['세션_수'], v['응답시간_ms'])
    all_data.append([k, v['CPU_사용률'], v['메모리_사용률'], v['디스크_IO'], v['세션_수'], v['응답시간_ms']])

print(all_data)

df = pd.DataFrame(all_data, columns=['서버명', 'CPU_사용률', '메모리_사용률', '디스크_IO', '세션_수', '응답시간_ms'])
df

✔️ 예제. 값이 여러개인 딕셔너리

딕셔너리의 값이 여러개인 경우, 리스트 형식으로 구성하면 됨

예제1. 급여 정보 딕셔너리

salary = {
    '초급': ['500만원~600만원', '0~3년'],
    '중급': ['600만원~700만원', '3~6년'],
    '고급': ['700만원~900만원', '6~9년']
}

예제2. 딕셔너리에 데이터 추가

salary['특급'] = ['900만원~1000만원', '9년~12년']
print(salary)

# {'초급': ['500만원~600만원', '0~3년'], '중급': ['600만원~700만원', '3~6년'], '고급': ['700만원~900만원', '6~9년'], '특급': ['900만원~1000만원', '9년~12년']}

예제3. 딕셔너리를 데이터프레임으로 변환

import pandas as pd

grade = []
sal = []
care = []

for i in salary.items():
    # print(i[0], i[1][0], i[1][1])
    grade.append(i[0])
    sal.append(i[1][0])
    care.append(i[1][1])

all_data = [grade, sal, care]
print(all_data)

df = pd.DataFrame(all_data, index=['등급', '급여', '경력'])
df.T    # df 데이터 프레임의 행과 열을 전치시킴
df2 = df.T
df2

문제1. 회사 부서별 정보 데이터프레임 변환

department = {
    '개발팀': ['1억 2천만원', '15명'],
    '마케팅팀': ['8천만원', '10명'],
    '영업팀': ['9천만원', '12명'],
    '경영지원팀': ['6천만원', '8명']
}

import pandas as pd

team = []   # 부서
sal = []    # 예산
cnt = []    # 인원

for i in department.items():
    team.append(i[0])
    sal.append(i[1][0])
    cnt.append(i[1][1])

all_data = [team, sal, cnt]
df = pd.DataFrame(all_data, index=['부서', '예산', '인원'])
df2 = df.T  # 행 열 바꿈
df2

딕셔너리 리스트 값 수정

  • 새로운 직업 추가
job = {'사라질 직업' : ['텔레마케터', '법률보조원']}
job['새로운 직업'] = ['자동화 구현 개발자', '딥러닝 개발자']
print(job)

# {'사라질 직업': ['텔레마케터', '법률보조원'], '새로운 직업': ['자동화 구현 개발자', '딥러닝 개발자']}
  • 기존 키의 값에 요소 추가
job['새로운 직업'].append('데이터 엔지니어')
job['사라질 직업'].append('운전기사')
print(job)

#{'사라질 직업': ['텔레마케터', '법률보조원', '운전기사'], '새로운 직업': ['자동화 구현 개발자', '딥러닝 개발자', '데이터 엔지니어']}
  • 특정 요소 삭제
del job['사라질 직업'][2]
print(job)

# {'사라질 직업': ['텔레마케터', '법률보조원'], '새로운 직업': ['자동화 구현 개발자', '딥러닝 개발자', '데이터 엔지니어']}

✔️ 예제. 여러 리스트로 딕셔너리 구성

여러개의 리스트의 데이터를 한번에 딕셔너리로 구성하여
비정형화된 데이터를 손쉽게 테이블 형태로 구성할 수 있음

예제1. 아티스트-음악 리스트 데이터로 딕셔너리 생성

artist = ['비틀즈', '비틀즈', '아이유', '아이유', '마이클 잭슨', '마이클 잭슨']
music = ['yesterday', 'imagine', '너랑나', '마슈멜로우', 'beat it', 'smooth criminal']

music_dict = {'비틀즈': [], '아이유' : [], '마이클 잭슨' : []}

for a, m in zip(artist, music):
    music_dict[a].append(m) # 리스트[]니까 append 써줘야 됨

print(music_dict)

import pandas as pd

df = pd.DataFrame(list(music_dict.items()), columns=['가수', '음악'])
df

문제1. 감독-영화 딕셔너리

# 감독 리스트
directors = ['크리스토퍼 놀란', '크리스토퍼 놀란', '스티븐 스필버그', 
             '스티븐 스필버그', '마틴 스콜세지', '마틴 스콜세지']

# 영화 리스트
movies = ['인셉션', '다크 나이트', '쥬라기 공원', 'ET', '아이리시맨', '위대한 개츠비']

movies_dict = {'크리스토퍼 놀란': [], '스티븐 스필버그': [], '마틴 스콜세지': []}

for d, m in zip(directors, movies):
    movies_dict[d].append(m)

print(movies_dict)

문제2. 딕셔너리를 데이터프레임으로 변환

import pandas as pd

df = pd.DataFrame(list(movies_dict.items()), columns=['감독', '영화'])
df

🔹핵심 정리

딕셔너리는 데이터 분석에서 매우 중요한 자료형

  • 기본 구조: 키-값 쌍으로 구성된 효율적인 데이터 저장
  • 빠른 검색: 키를 통한 O(1) 시간복잡도의 빠른 데이터 접근
  • 유연한 구조: 중첩 딕셔너리, 리스트를 값으로 하는 복잡한 구조 지원
  • 데이터 전처리: 비정형 데이터를 구조화된 형태로 변환하는 도구
  • 현업 활용: 로그 분석, 데이터 집계, API 응답 처리 등에 널리 사용

0개의 댓글