Python 딕셔너리 컴프리헨션으로 리스트를 키-값 쌍으로 바꾸고 중복 키 동작 확인하기

2026. 10. 23. 09:47·Python
728x90

왜 이 내용을 정리하나

리스트로 받은 데이터를 조회하기 쉬운 딕셔너리로 바꾸는 작업은 실무에서 자주 나온다. API 응답에서 ID 목록을 받아 이름을 찾거나, CSV 한 줄씩 읽은 레코드를 키 기준으로 정리하거나, 설정 값 목록을 이름으로 찾는 상황이 대표적이다. 이때 딕셔너리 컴프리헨션을 쓰면 반복문 없이 한 줄로 변환할 수 있다. 다만 같은 키가 여러 번 나오면 어떤 값이 남는지 모르고 쓰면 데이터가 조용히 사라지기 때문에, 이 동작을 직접 확인해 두는 것이 중요하다. 이 노트에서는 딕셔너리 컴프리헨션의 기본 문법과 중복 키에서 마지막 값이 남는 이유, 그리고 그 동작을 확인하는 방법을 정리해 본다.

개념 설명

딕셔너리 컴프리헨션은 리스트 컴프리헨션과 같은 형태로 쓴다. 중괄호 안에 키표현식: 값표현식 for 변수 in 반복가능객체 형태로 적으면 된다. 반복을 돌면서 각 원소에서 키와 값을 계산해 딕셔너리에 하나씩 넣는다.

핵심은 딕셔너리에 같은 키를 다시 넣으면 새 항목이 추가되지 않고 기존 키의 값이 덮어써진다는 점이다. 따라서 컴프리헨션이 왼쪽에서 오른쪽으로 원소를 처리하므로, 중복된 키가 있으면 나중에 나온 원소의 값이 최종적으로 남는다. 이것을 흔히 마지막 값이 이긴다고 표현한다.

이 동작은 딕셔너리의 일반적인 대입 규칙과 같다. 컴프리헨션이 특별히 다르게 처리하는 것은 없다. 즉 d[k] = v를 반복 실행한 결과와 컴프리헨션 결과는 같다는 점을 기억하면 된다.

코드 예제

students = [
    ('kim', 85),
    ('lee', 92),
    ('park', 78),
    ('kim', 99),
    ('choi', 88),
    ('lee', 70),
]

# 기본 변환: 이름을 키, 점수를 값으로 사용
score_map = {name: score for name, score in students}
print('변환 결과:', score_map)

# 중복 키 확인: 같은 키가 몇 번 나오는지 센다
counts = {}
for name, _ in students:
    counts[name] = counts.get(name, 0) + 1
duplicates = {name: c for name, c in counts.items() if c > 1}
print('중복 키와 등장 횟수:', duplicates)

# 중복 키마다 모든 값을 기록해 덮어쓰기 전 값을 확인
all_values = {}
for name, score in students:
    all_values.setdefault(name, []).append(score)
print('키별 전체 값:', all_values)

# 마지막 값이 남는지 검증
last_seen = {}
for name, score in students:
    last_seen[name] = score
print('마지막 값과 일치하는가:', score_map == last_seen)
print('kim의 최종 값:', score_map['kim'])

첫 번째 출력은 'kim'과 'lee'가 두 번씩 나왔지만 딕셔너리에는 각각 한 항목만 남는다는 것을 보여준다. 'kim'은 85가 아니라 뒤에 나온 99가 최종 값이 되고, 'lee'는 92가 아니라 70이 남는다. 두 번째 출력은 어떤 키가 중복되었는지와 등장 횟수를 확인해서 데이터 손실이 생길 수 있는 지점을 미리 찾을 수 있게 해준다. 세 번째 출력은 키별로 모든 값을 리스트에 모아 두어, 덮어써지기 전의 값들이 실제로 무엇이었는지 눈으로 확인하게 한다. 마지막 출력은 컴프리헨션 결과가 단순 대입을 반복한 결과와 같다는 것을 검증한다.

헷갈리는 점

첫째, 중복 키가 있어도 에러가 나지 않는다. 파이썬은 경고 없이 덮어쓰기 때문에 결과가 이상해도 실행은 정상적으로 끝난다. 그래서 데이터가 중복될 가능성이 있다면 위 예제처럼 개수를 세거나 값을 모아 두는 검증 코드를 함께 두는 것이 안전하다.

둘째, 처음 값을 남기고 싶다면 컴프리헨션만으로는 바로 되지 않는다. 한 가지 방법은 역순으로 순회해서 앞쪽 값이 마지막에 덮어쓰게 하는 것이다. 다른 방법은 setdefault나 if name not in d 조건으로 이미 있는 키를 건너뛰는 것이다. 어떤 방식이든 의도를 코드에 명시해야 나중에 읽는 사람이 헷갈리지 않는다.

셋째, 키로 쓰는 값은 해시 가능해야 한다. 리스트나 딕셔너리를 키로 쓰면 TypeError가 난다. 중복 판단 기준이 되는 값이 실제로 변하지 않는 타입인지도 함께 확인해야 한다.

정리

딕셔너리 컴프리헨션은 리스트를 키-값 쌍으로 한 줄에 바꾸는 간결한 방법이다. 중복 키가 나오면 딕셔너리의 대입 규칙에 따라 나중 값이 앞의 값을 덮어쓰고, 최종적으로 마지막에 나온 값만 남는다. 이 동작은 에러 없이 조용히 일어나므로, 개수 세기나 값 모으기 같은 검증 코드로 실제 결과를 확인하는 습관이 필요하다. 이 노트에서는 컴프리헨션 문법, 중복 키의 덮어쓰기 동작, 그리고 그 동작을 확인하는 여러 방법을 정리해 보았다.

#파이썬 #딕셔너리 #컴프리헨션 #중복키 #자료구조

728x90
LIST

'Python' 카테고리의 다른 글

Python 함수 정의와 리스트 순회 기본 예제 정리  (0) 2026.10.23
파이썬 제너레이터와 yield로 대용량 파일을 메모리 효율적으로 읽기  (0) 2026.10.22
'Python' 카테고리의 다른 글
  • Python 함수 정의와 리스트 순회 기본 예제 정리
  • 파이썬 제너레이터와 yield로 대용량 파일을 메모리 효율적으로 읽기
Mr. Joo
Mr. Joo
  • Mr. Joo
    삽질의 시작
    Mr. Joo
  • 전체
    오늘
    어제
    • 분류 전체보기 (241) N
      • Python (3) N
      • 개발 요약 (10)
      • Flutter (73) N
      • Android (9)
      • Swift (6) N
      • React (12) N
      • 인공지능 (4)
      • 대학원 (3)
      • CS (10)
      • 개발 뉴스 (108)
      • IT 기기 (1)
      • 알면 유용한 정보 (2)
  • 인기 글

  • 태그

    앱 개발
    Swift
    Flutter
    이슈
    앱
    오늘의 기술 뉴스
    오늘의 뉴스
    개발
    오늘의 개발 뉴스
    react
    오늘의 이슈
    DART
    Dart 기초
    개발 이슈
    뉴스
    플러터
    개발 뉴스
    기술 뉴스
    android
    기술
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
Mr. Joo
Python 딕셔너리 컴프리헨션으로 리스트를 키-값 쌍으로 바꾸고 중복 키 동작 확인하기
상단으로

티스토리툴바