파이썬의 Filter와 Map 그리고 List Comprehension
파이썬에도 보통 함수형 언어들의 핵심 일꾼(?)으로 불리는 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는 코드 읽기 측면에서 상당히 난해하고 가독성이 나쁜 코드를 만들어 낸다고 생각해서 안 쓰는 것이 좋지 않을까 생각된다. 정 필요하다면 루프를 동원해서 풀어서 쓰는 게 훨씬 낫지 않을까?