Python 강좌 / 리스트·딕셔너리·집합 컴프리헨션 사용하기

컴프리헨션은 기존 항목을 변환하거나 조건에 맞는 항목만 골라 새 컬렉션을 만드는 문법입니다. 짧고 단순한 변환에 사용하고, 여러 단계의 예외 처리나 부수 효과가 필요하면 일반 반복문을 사용합니다.

변환식과 필터의 위치

리스트 컴프리헨션의 기본 형태는 [변환식 for 항목 in 모음 if 조건]입니다. 뒤의 if는 항목을 포함할지 결정합니다. 변환식 안의 a if 조건 else b는 각 항목의 값을 선택하는 조건식으로, 제외 필터와 역할이 다릅니다.

관련 동작과 지원 조건은 리스트·딕셔너리·집합 컴프리헨션 사용하기 관련 공식 문서에서 확인할 수 있습니다.

원본이 변경되는 문법은 아닙니다. 새 결과가 어떤 값을 참조하는지는 변환식에 따라 달라지므로 내부 딕셔너리까지 자동 복제된다고 생각해서는 안 됩니다.

전체 예제와 실행 결과

별도의 실습 폴더에서 아래 파일을 UTF-8로 저장합니다. 가상환경을 선택한 터미널에서 python comprehensions.py 명령으로 실행합니다. macOS·Ubuntu에서 가상환경을 사용하지 않는 경우 명령 이름을 python3으로 바꿉니다.

comprehensions.py 파일의 전체 내용입니다.

amounts = [3500, -1, 8000, 0]
valid = [x for x in amounts if x >= 0]
labels = ["paid" if x > 0 else "free" for x in valid]
records = [("food", 3500), ("bus", 2500)]
by_name = {name: amount for name, amount in records}
remainders = {x % 3 for x in valid}
print(valid)
print(labels)
print(by_name)
print(sorted(remainders))

예상 결과는 다음과 같습니다.

[3500, 8000, 0]
['paid', 'paid', 'free']
{'food': 3500, 'bus': 2500}
[0, 2]

딕셔너리와 집합의 중복 처리

딕셔너리 컴프리헨션에서 같은 키가 반복되면 나중 값이 앞 값을 덮습니다. 분류별 합계가 필요할 때 {category: amount ...}만 사용하면 합산되지 않습니다. 집합 컴프리헨션은 중복을 제거하므로 항목 수가 원본보다 줄 수 있습니다.

일반 반복문으로 먼저 정확하게 만든 뒤 한 번의 변환이나 필터로 표현되는지 확인하면 좋습니다. 읽기 어려운 중첩 컴프리헨션은 줄 수가 짧아도 유지보수가 쉽지 않습니다.

빈 결과와 부수 효과 점검하기

모든 항목이 필터에서 제외되면 빈 리스트가 됩니다. 이후 평균 계산에서 0으로 나누거나 첫 항목을 읽지 않도록 빈 결과의 의미를 정합니다. print나 파일 저장만 수행하려고 리스트 컴프리헨션을 쓰면 의미 없는 결과 목록이 생기므로 for문으로 작성합니다.

음수 필터를 > 0으로 바꾸어 0이 사라지는지 확인합니다. records에 같은 이름을 추가해 딕셔너리 값이 교체되는지 관찰한 다음, 합계가 필요할 때 일반 반복문을 선택해야 하는 이유를 설명해 보세요.