[포스코 신재생에너지 IoT 개발자 5기] Python 7편 — 딕셔너리(Dictionary)

Doohee·2025년 11월 24일
post-thumbnail

파이썬의 딕셔너리(Dictionary)는 Key–Value 기반의 구조화된 데이터 타입으로,
JSON 형식과 1:1로 매칭되기 때문에 API 응답, 센서 데이터, 환경·에너지 로그, 사용자 설정값 등
대부분의 실무 데이터 처리에서 핵심적으로 사용된다.

본 문서는 딕셔너리의

  • 자료형 정의

  • 생성 방식

  • 접근 및 수정 규칙

  • 주요 메서드

  • 삭제 동작

  • 실무 활용 예시

향후 데이터 처리·자동화·모델링 과정 전반에서 일관된 기준을 제공하는 것을 목표로 한다.

1. 정의(Definition)

딕셔너리(dictionary)

딕셔너리는 key-value(키-값) 쌍으로 구성된 자료형이며, 파이썬에서 가장 널리 사용되는 구조화 데이터 타입 이다.

  • Python 공식 정의

    • “A dictionary is an unordered collection of key-value pairs, where keys are unique.”
  • Python 3.7+ 이후 ⇒ 입력 순서를 보장(Ordered)

  • key는 유일(unique)

  • value는 중복 가능

  • Mutable(변경 가능) 자료형

  • 내부 구조는 해시(Hash Table)기반

2. 특징(Characteristics)

1) 핵심 특징

  • key-value 구조

  • key는 변경 불가(immutable) 타입만 사용 가능 ⇒ 문자열(str), 정수(int), 투플(tuple) 등

  • value는 어떠한 자료형도 가능

  • 요소 추가·수정·삭제 가능

  • 딕셔너리는 내부적으로 해시 테이블(Hash Table) 구조를 사용하며, 키의 해시값을 기반으로 빠른 O(1) 조회를 제공한다.

  • JSON 구조와 1:1 대응됨

2) 장점

  • 빠른 검색

    • 키를 통해 값을 매우 빠르게 찾을 수 있음 (해시 기반)
  • 명확한 데이터 구조화

    • 각 항목이 어떤 의미를 가지는지 명확함(key로 의미 부여 가능)
  • 확장성과 유연성 우수

    • JSON과 호환성이 뛰어나고, 다양한 자료구조 표현 가능
  • API / BEMS / 센서 / 로드 등 실무 데이터와 호환성이 매우 높음

3. 생성(Creation)

1) 리터럴 방식 {}

  • 키는 문자열일 필요는 없으나, 문자열이 가장 일반적
  • 키에는 불변 자료형만 사용할 수 있음(문자열, 숫자, 튜플)

dict_1

dict_2

2) dict() 생성자

  • 함수 호출방식으로 딕셔너리 생성

  • 키는 문자열이어야 하고, 변수 이름처럼 쓸 수 있는 형식이어야 함

dict_3

3) 리스트 / 튜플의 (key, value) 쌍으로 생성

  • (key, value) 형태의 쌍을 요소로 가지는 리스트 또는 튜플을 통해 딕셔너리를 만들 수 있음

  • CSV 데이터 파싱 또는 키-값 쌍 리스트를 가공할 때 유용하게 사용됨

dict_4

4) zip() 사용

  • 서로 대응되는 두 리스트(혹은 이터러블)을 묶어서 딕셔너리를 만들 수 있음

dict_5

4. 접근(Access)

딕셔너리에서 값을 가져올 때는 키(key)를 사용하여 접근함

1) [] 연산자 - 일반적인 접근

  • 존재하는 키에 접근 하면 값을 반환함

  • 존재하지 않는 키에 접근하면 KeyError 예외가 발생

dict_6

2) get() 메서드

  • get(key)는 키가 없을 경우 None을 반환함

  • get(key, default)를 사용하면 기본값을 직접 지정할 수 있어 KeyError를 방지 할 수 있음
    ⇒ 사용자의 입력이나 외부 API 데이터 등 불확실한 키 접근에 유리

dict_7

3) get() 예제: 사용자 입력 처리

dict_8

5. 추가 및 수정(Insert & Update)

1) 기본방식

  • 파이썬 딕셔너리에서 데이터의 추가와 수정은 동일한 문법을 사용함

  • 만약 해당 키가 존재하지 않으면? 새로운 항목이 추가

  • 이미 존재하는 키라면? 해당 키의 값이 수정

dict_9

dict_10

2) update()

  • 내부적으로는 각 키마다 dict[key] = value를 반복하는 것과 동일한 효과

dict_11

3) 딕셔너리 복사(Copy)

딕셔너리는 mutable(변경 가능) 자료형이므로, 복사 시 주의가 필요하다.

특히 중첩 딕셔너리(nested dict)의 경우, 복사 방식에 따라 내부 데이터가 예상과 다르게 변경될 수 있다.

  • 얕은 복사(shallow copy)

copy() 메서드는 1단계까지만 복사하며, 내부에 포함된 딕셔너리·리스트 등은 원본 객체를 공유한다.

실무에서 중첩 구조를 사용할 때 값이 함께 변경되는 문제가 발생할 수 있다.

  • 깊은 복사(deepcopy)

copy.deepcopy()는 내부 구조까지 완전히 새로운 객체로 복사한다.

외부 API 응답, 센서 데이터, 구성(config) 정보 등 원본 보존이 중요한 데이터 처리에서 필수적이다.

6. 삭제(Delete)

1) del 키워드

  • del 객체 형태로 사용할 경우 객체 자체를 삭제함

dict_12

2) pop()

  • 저장한 키를 삭제하고, 삭제된 값을 반환

  • 존재하지 않는 키는 삭제하면 KeyError 발생
    ⇒ 두 번째 인자에 값을 넣으면 기본 값 출력 가능

dict_13

3) popitem()

  • 가장 마지막에 추가된 항목을 제거하고, (key, value) 쌍을 반환

  • 딕셔너리가 비어 있을 때 호출하면 KeyError 발생

dict_14

4) clear()

  • 딕셔너리 안의 모든 항목을 한 번에 삭제

  • 객체 자체는 유지 됨

dict_15

7. 주요 메서드(Primary Methods)

1) keys() - 모든 키를 반환

  • dict_keys 객체를 반환함 (리스트 처럼 보이지만 실제로는 리스트는 X)

  • 필요 시 list(dict.keys())로 변환

dict_16

2) values() - 모든 값을 반환

  • dict_values 객체를 반환함 (리스트 처럼 보이지만 실제로는 리스트는 X)

  • 리스트로 변환하고 싶다면 list() 함수로 변환

dict_17

3) items() - 모든(키, 값) 쌍을 반환

  • dict_items 객체를 반환함 (리스트 처럼 보이지만 실제로는 리스트는 X)

  • 리스트로 변환하고 싶다면 list() 함수로 변환

dict_18

8. 실무 적용 사례(Technical Use Cases)

1) BEMS 센서 데이터 구조

dict_19

✔ 부연 설명

  • 대부분의 BEMS(건물 에너지 관리 시스템) 장비는 센서 ID + 시계열 데이터로 구성됨

  • 실시간 데이터는 JSON으로 들어오기 때문에 파이썬에서는 dict 그대로 처리 가능

  • Pandas로 변환 시 DataFrame([sensor_data]) 형태로 바로 변환됨

  • 자동 제어 로직에서도 이 구조가 기본 입력값

2) 환경·온실가스(API) 응답 데이터

dict_20

✔ 부연 설명

  • ESG·환경 분야의 API 응답 데이터는 Key-Value 구조 고정

  • CO₂, NOx, SOx 같은 배출량 데이터는 후처리 시 dictDataFrame 변환이 가장 효율적

  • 자동 보고서 생성, 배출량 산정, Scope 1/ 2/ 3 분석 시 그대로 활용

  • 결측값이 있을 수 있어 .get(key, default) 사용이 실무에서 매우 중요

3) HVAC·설비 상태 모니터링 데이터

dict_21

✔ 부연 설명

  • HVAC, AHU, 보일러 등은 상태(status)와 센서(sensor)를 중첩 딕셔너리로 구성하는 것이 일반적

  • error_codeNone 허용 → 고장 감지 로직에서 핵심

  • 상태 모니터링 → 경보 → 자동제어 로직까지 전부 이 구조 기반

  • dict 안의 dict 구조는 설정값/제어값을 함께 묶기 좋음

실습

문제1. 딕셔너리 핵심 개념 통합 실습

  • 1단계: 빈 딕셔너리 생성, user라는 이름의 빈 딕셔너리를 생성

  • 2던계: 사용자 기본 정보 추가

    • "Username":"Skywalker"

    • "Email":"sky@example.com"

    • "Level": 5

  • 3단계: 값 읽기 - "Email"값을 변수 email_value에 저장하고 출력

  • 4단계: 값 수정 - "Level"값을 6으로 수정

  • 5단계: 안전하게 조회 - 딕셔너리에 "Phone" 키가 없다면 "미입력"이라는 문자열을 출력

  • 6단계: 항목 추가 및 삭제

    • update()를 사용해 "Nickname":"Sky" 항목추가

    • "Email" 항목 삭제

    • "Signup_date" 키가 없다면, "2025-11-24"으로 추가 (setdefault()사용)

    • 최종 딕셔너리 출력

dict_22

✔ 출력 결과

2단계: {'Username': 'Skywalker', 'Email': 'sky@example.com', 'Level': 5}

3단계: sky@example.com

4단계: {'Username': 'Skywalker', 'Email': 'sky@example.com', 'Level': 6}

5단계: 미입력

6단계:

미입력
{'Username': 'Skywalker', 'Level': 6, 'Nickname': 'Sky', 'Signup_date': '2025-11-24'}

문제2. 학생 점수 관리

  • 1단계: 빈 딕셔너리 students 생성

  • 2단계: "Alice", "Bob", "Charlie" 세 학생의 점수를 각각 85, 90, 95로 추가

  • 3단계: "David" 학생의 점수 80 추가

  • 4단계: "Alice" 점수 88 수정

  • 5단계: "Bob"을 딕셔너리에서 삭제

  • 6단계: 최종 students 딕셔너리 출력

dict_23

✔ 출력 결과

2단계: {'Alice': 85, 'Bob': 90, 'Charlie': 95}

3단계: {'Alice': 85, 'Bob': 90, 'Charlie': 95, 'David': 80}

4단계: {'Alice': 88, 'Bob': 90, 'Charlie': 95, 'David': 80}

6단계: {'Alice': 88, 'Charlie': 95, 'David': 80}

9. 종합 정리(Summary)

파이썬의 딕셔너리(Dictionary)는 Key–Value 기반의 구조화 데이터 타입으로,

JSON과 1:1로 대응되기 때문에 API 응답, 센서 데이터, BEMS·HVAC 로그, 환경·에너지 데이터 처리 등 실무 전반에서 핵심적으로 사용된다.

  • Key는 유일, immutable 자료형만 사용

  • Value는 자유롭게 어떤 자료형도 가능

  • 삽입·수정·삭제 모두 O(1) 수준의 빠른 연산

  • Python 3.7+부터 입력 순서 보장

  • 내부 구조는 해시 테이블(Hash Table) 기반

  • 실무 활용성: JSON 파싱, 자동화 로직, 대시보드, Pandas 변환 등에서 필수

딕셔너리는 이후 조건문·반복문·함수·Pandas·모델링으로 자연스럽게 연결되는 파이썬 데이터 처리의 가장 중심적인 자료구조이다.

10. 아웃트로(Outro)

이 문서는 Python 딕셔너리의 구조·규칙·활용 방식으로 구성되었다.

딕셔너리는 파이썬 기반 업무(데이터 처리, 자동화, IoT, API, 분석)의 가장 근본적이며 필수적인 데이터 구조이며, 이후 조건문·반복문·함수·Pandas와 자연스럽게 연결된다.

profile
에너지 기획 전문가로 성장하고자 합니다.

0개의 댓글