Python에서 딕셔너리에 저장된 값들 중 0이 아닌 값만 골라 평균을 구해야 하는 경우가 종종 있습니다. 이때 가장 간단하고 직관적인 방법은 다음 세 단계로 처리하는 것입니다.
- 딕셔너리를 순회하면서 값이 0인 항목을 먼저 제거(필터링)합니다.
- 필터링된 값들의 합계를 구합니다.
- 합계를 필터링된 값의 개수로 나누어 평균을 계산합니다.
예제 코드
아래 예제는 리스트 컴프리헨션(list comprehension)을 사용해 0이 아닌 값만 추출한 뒤 평균을 구하는 코드입니다.
my_dict = {"foo": 100, "bar": 0, "baz": 200}
filtered_vals = [v for _, v in my_dict.items() if v != 0]
average = sum(filtered_vals) / len(filtered_vals)
print(average)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
150.0
코드 설명
my_dict.items()는 딕셔너리의 키-값 쌍을 순회할 수 있게 해줍니다.[v for _, v in ... if v != 0]부분에서 키(_)는 무시하고, 값이 0이 아닌 경우만 새 리스트에 담습니다.sum(filtered_vals) / len(filtered_vals)로 합계를 개수로 나누어 평균을 구합니다. Python 3에서는 나눗셈 결과가 자동으로 실수(float)로 반환됩니다.
참고: reduce 함수는 굳이 필요 없습니다
functools.reduce를 사용해 같은 작업을 수행할 수도 있지만, 이처럼 단순한 작업에는 오히려 과한(overkill) 선택입니다. 리스트 컴프리헨션을 활용하는 방식이 훨씬 읽기 쉽고 Python다운(Pythonic) 코드이므로, 특별한 이유가 없다면 위와 같은 방법을 사용하는 것을 권장합니다.