여기서는 "컴프리헨션을 짧게 쓰는 법"보다 최종 결과가 dict인지, set인지, 아니면 그냥 list인지를 먼저 봅니다.
키와 값을 가진 새 매핑이 필요하면 dict comprehension, 중복 없는 값 모음이 필요하면 set comprehension이 맞습니다.
숏컷 코드
scores = {"mina": 91, "jin": 77, "sora": 88}
passed = {name: score for name, score in scores.items() if score >= 80}
normalized = {name.lower() for name in ["Mina", "Jin", "Mina"]}문법
기본형은 dict 결과, set 결과, 필터가 있는 형태까지 같이 보면 됩니다.
{key: value for key, value in pairs}
{expr for item in items}
{key: value for key, value in pairs if condition(key, value)}
{expr for item in items if condition(item)}컴프리헨션을 읽을 때는 앞쪽 결과 식과 뒤쪽 for, if를 나눠 보면 됩니다.
앞쪽은 "무엇을 넣는가", 뒤쪽은 "무엇을 순회하고 누구를 남기는가"입니다.
결과 구조
키-값 결과를 바로 만들면 dict comprehension이다
원본에서 값을 읽어 새 딕셔너리를 만들고 싶다면 {key: value for ...}가 가장 빠릅니다.
prices = {"apple": 3, "banana": 5}
with_tax = {name: round(price * 1.1, 2) for name, price in prices.items()}이 패턴은 "어떤 키에 어떤 값을 넣는가"가 한 줄에서 바로 보인다는 점이 강점입니다.
특히 items()를 같이 읽으면 입력 구조와 출력 구조가 동시에 보입니다.
중복 제거
중복 없는 값 모음을 만들면 set comprehension이다
값을 변환한 뒤 중복 없이 남겨야 하면 set comprehension이 자연스럽습니다.
emails = ["Mina@example.com", "jin@example.com", "mina@example.com"]
normalized = {email.lower() for email in emails}리스트를 만든 뒤 다시 set(...)로 감싸는 것보다 의도가 더 선명합니다.
membership 테스트용 집합이나 중복 제거된 파생 값이 필요할 때 특히 잘 맞습니다.
읽는 순서
뒤쪽 if는 필터고, 결과 식은 앞쪽에서 만든다
컴프리헨션을 읽을 때는 결과 식과 필터를 나눠 보는 편이 좋습니다.
active_users = {
user["id"]: user["name"]
for user in users
if user["active"]
}즉 앞쪽은 "무슨 결과를 넣는가", 뒤쪽은 "누구를 남기는가"입니다. 이 구분이 잡히면 dict/set comprehension도 list comprehension과 같은 방식으로 읽을 수 있습니다.
경계
중복 키를 모으거나 로직이 길어지면 comprehension보다 루프가 낫다
dict comprehension은 같은 키가 여러 번 나오면 마지막 값만 남습니다.
그래서 집계나 그룹핑처럼 여러 값을 같은 키 아래 모아야 하는 문제에는 잘 맞지 않습니다.
pairs = [("a", 1), ("a", 2)]
result = {key: value for key, value in pairs}
print(result) # {'a': 2}이런 경우는 setdefault(), defaultdict, Counter 같은 누적 패턴이 더 낫습니다.
조건이 많고, 변환 로직이 길고, 예외 처리까지 붙기 시작하면 일반 루프가 더 읽기 쉽습니다.
result = {}
for user in users:
if not user["active"]:
continue
key = user["email"].strip().lower()
result[key] = user["name"].title()컴프리헨션은 "결과 구조가 한눈에 보일 때" 강합니다. 반대로 전처리와 분기가 늘어나면 짧음보다 가독성을 우선하는 편이 안전합니다.
주의할 점
dict comprehension은 중복 키를 자동으로 모아 주지 않습니다. 같은 키가 다시 나오면 뒤에서 계산된 값이 앞 값을 덮어씁니다.
# ❌ 같은 키의 여러 값을 잃어버림
pairs = [("a", 1), ("a", 2)]
result = {key: value for key, value in pairs}
# ✅ 여러 값을 모아야 하면 누적 로직 사용
grouped = {}
for key, value in pairs:
grouped.setdefault(key, []).append(value)참고 링크
2 sources