파이썬의 Filter와 Map 그리고 List Comprehension

Python // 2024년 05월 19일 작성 // 2024년 12월 26일 업데이트

파이썬에도 보통 함수형 언어들의 핵심 일꾼(?)으로 불리는 fillter와 map이 당연히 있다. 하지만 파이썬에서는 이 둘 보다는 다른 방법의 문법을 사용하는 경우도 자주 보이는데 이에 대해 간단히 정리해 보자.

filter와 map

filter는 여타 언어들 처럼 리스트에서 불필요한 부분을 걸러내기 위한 용도로 사용된다. 예를 들자면 아래와 같은 식이다.

result = filter(lambda x: iswhat(x), somelist)

여기서 lambda 함수의 결과가 True이면 리스트에 남고 False이면 리스트에서 제외된 채로 result로 반환된다.

map의 경우는 입력된 리스트를 가공하여 다른 형태의 리스트로 만들고 싶을 때 사용한다. 예를 들어 다음과 같은 식이다.

result = map(lambda x: dowhat(x), somelist)

여기서 lambda 함수의 결과를 이용해 리스트가 새로 구성되어서 result로 반환된다.

List Comprehension

한국어로는 뭐라고 표현해야 할 지를 잘 모르겠다. 어쨌든 이 문법을 이용하면 filter와 map 코드를 파이썬에 어울리는 방식으로 표현할 수 있다.

예를 들어 위의 filter 예제는 아래와 같은 식으로 바꿔서 쓸 수 있다.

[x for x in somelist if iswhat(x)]

보다시피 파이썬의 여러 문법이 한 번에 쓰여지고 있는데 생각보다 가독성이 나쁘지는 않다.

map 예제의 경우도 비슷하게 아래와 같은 식으로 바꿔 쓸 수 있다.

[dowhat(x) for x in somelist]

이런 식으로 풀어서 쓸 수 있다. 이런 방식이 코드도 약간은 줄어드는 느낌이다.

사족

reduce는 어디 갔다고 물어볼 사람이 있을 지도 모르겠는데, 개인적으로 reduce는 코드 읽기 측면에서 상당히 난해하고 가독성이 나쁜 코드를 만들어 낸다고 생각해서 안 쓰는 것이 좋지 않을까 생각된다. 정 필요하다면 루프를 동원해서 풀어서 쓰는 게 훨씬 낫지 않을까?