20260318 오늘의 학습: 딕셔너리 활용

Yesol Lee·2026년 3월 18일

COS Python

목록 보기
4/22

어제 학습 요약

  • 리스트 심화: 슬라이싱 step, 2차원 배열, 메서드 정리
  • 11문제 전부 정답, 슬라이싱 완전 정복
  • 하드코딩/음수 초기값 주의점 피드백

오늘 수업 계획

딕셔너리 기초 → Counter/lambda → 딕셔너리 정렬 → 연습 문제 6문제


학습 내용 정리

1. 딕셔너리 기초 — Java HashMap과 비교

작업Java (HashMap)Python (dict)
생성new HashMap<>(){} 또는 dict()
값 넣기m.put("a", 1)d["a"] = 1
값 가져오기m.get("a")d["a"] 또는 d.get("a")
키 존재 확인m.containsKey("a")"a" in d
삭제m.remove("a")del d["a"]
전체 순회for (var e : m.entrySet())for k, v in d.items():

d["key"] vs d.get("key")

d = {"apple": 3}

d["cherry"]           # KeyError! 에러 발생
d.get("cherry")       # None 반환
d.get("cherry", 0)    # 0 반환 (기본값 지정)

get(key, 0)은 빈도 카운팅의 핵심 패턴!

2. 빈도 카운팅 — 2가지 방법

방법 1: 직접 카운팅 (빈칸 채우기/디버깅 문제에 출제)

freq = {}
for ch in "banana":
    freq[ch] = freq.get(ch, 0) + 1
# {'b': 1, 'a': 3, 'n': 2}

방법 2: collections.Counter (함수 작성 문제에서 활용)

from collections import Counter

counter = Counter("banana")
# Counter({'a': 3, 'n': 2, 'b': 1})

Counter는 자동으로 개수를 세어주는 특수 딕셔너리다. 일반 dict와 달리 없는 키에 접근해도 에러가 나지 않고 0을 반환한다.

Counter의 핵심: most_common()

counter = Counter(["apple", "banana", "apple", "cherry", "banana", "apple"])

counter.most_common(1)   # [('apple', 3)] — 가장 많은 1개
counter.most_common()    # 전부 빈도순 정렬

최빈값을 꺼낼 때는 튜플 언패킹을 활용한다:

most_item, most_count = counter.most_common(1)[0]
# most_item = 'apple', most_count = 3

수업 중 질문: "most_item에 apple이 들어가는 건 알겠는데, most_count에 3은 언제 할당된 거지?"

counter.most_common(1)[0]의 결과는 'apple'이 아니라 ('apple', 3) 튜플 전체다. [0]은 리스트의 첫 번째 원소를 꺼낸 것이지, 튜플 안의 첫 번째 값을 꺼낸 게 아니다. 그리고 most_item, most_count = ('apple', 3) 이렇게 왼쪽에 변수를 쉼표로 나열하면 Python이 튜플을 자동으로 풀어서 순서대로 할당한다. 이것이 튜플 언패킹이라는 Python 고유 문법이다.

# 튜플 언패킹 — Java에는 없는 문법
x, y = (10, 20)       # x=10, y=20
a, b, c = [1, 2, 3]   # a=1, b=2, c=3

# for문에서도 자주 사용
for key, value in d.items():
    print(key, value)

주의: 왼쪽 변수 개수와 오른쪽 값 개수가 다르면 ValueError!

수업 중 질문: "주피터에서 sorted한 리스트를 넣어도 Counter에선 정렬이 안 되던데, 무조건 빈도순인 거지? 그리고 items()로 key순 정렬하면 튜플 리스트가 되던데, 딕셔너리 형태를 유지하는 정렬법은 없나?"

→ 맞다. Counter는 입력 순서와 무관하게 항상 빈도 높은 순으로 저장한다. 그리고 sorted()의 결과가 튜플 리스트가 되는 건 맞는데, dict()로 감싸면 딕셔너리로 복원할 수 있다.

# sorted → 튜플 리스트
sorted(counter.items())       # [('a', 3), ('b', 1), ('n', 2)]

# dict()로 감싸면 → 딕셔너리 복원!
dict(sorted(counter.items())) # {'a': 3, 'b': 1, 'n': 2}

Python 3.7+에서는 일반 dict도 삽입 순서를 보장하므로, dict(sorted(...))하면 정렬된 순서가 유지된다. 단, Counter 타입이 아닌 일반 dict가 되므로 most_common() 같은 Counter 전용 메서드는 못 쓴다.

3. lambda 함수

lambda는 이름 없는 한 줄짜리 함수. Java의 화살표 함수와 거의 같다.

// Java
(x) -> x[1]
# Python
lambda x: x[1]

lambda 매개변수: 반환값 — 이게 전부. return을 안 쓴다.

sorted()key 파라미터에 "뭘 기준으로 정렬할지"를 함수로 전달할 때 주로 사용:

people = [("철수", 25), ("영희", 20)]
sorted(people, key=lambda x: x[1])
# [('영희', 20), ('철수', 25)] — 나이순 정렬

4. 딕셔너리 정렬 치트시트

목적코드
키 오름차순sorted(d.items())
키 내림차순sorted(d.items(), reverse=True)
값 오름차순sorted(d.items(), key=lambda x: x[1])
값 내림차순sorted(d.items(), key=lambda x: -x[1])
결과를 dict로dict(sorted(...))

5. 순회 중 삭제 패턴

딕셔너리를 순회하면서 항목을 삭제하면 RuntimeError가 발생한다.

# 에러 발생!
for key in scores:
    if scores[key] < 60:
        del scores[key]   # RuntimeError

# 해결: 키 리스트 복사본을 순회
for key in list(scores):   # list()로 키를 복사
    if scores[key] < 60:
        del scores[key]    # 안전!

수업 중 질문: "dict은 key-value 형태인데 리스트로 변환하면 무조건 key값 리스트가 되는 거야?"

→ 맞다. 딕셔너리를 list(), for문, in 등에 넣으면 기본 동작이 키 기준이다. Java의 HashMapkeySet()이 기본인 것처럼, Python은 아무것도 안 붙이면 키가 나온다.

d = {"a": 1, "b": 2}

list(d)       # ['a', 'b']     — 키만 나옴
for x in d:   # x는 키
"a" in d      # 키에서 검색

# 값이나 쌍이 필요하면 명시적으로
list(d.values())   # [1, 2]
list(d.items())    # [('a', 1), ('b', 2)]

수업 중 질문: "Counter에서 most_common()을 핵심으로 소개했는데, 다른 함수도 있어?"

→ Counter끼리 +, - 연산, elements(), update() 등이 있긴 하다. 하지만 COS Pro에서 나오는 건 거의 most_common()이라 핵심만 다뤘다. 나머지는 Phase 2에서 실전 문제 풀다가 필요하면 그때 다시 정리할 예정.


오늘의 결과

  • 총 6문제 풀이, 1차 정답률 83% (힌트 1회 사용)
  • 딕셔너리, Counter, lambda, 정렬 패턴 학습 완료
  • 다음 학습: 문자열 처리 (split, join, replace 등)
profile
문서화를 좋아하는 개발자

0개의 댓글