본문 바로가기

흔한말 (collection)/Python

Python 리스트 컴프리헨션 맛보기(할-짝)

300x250

파이썬으로 for문을 써서 여러가지를 하는 데 익숙해진 분들은 점점 자신감이 붙으면서도,

여러 줄로 작성되는 코드가 조금 거추장스럽게 느껴질 수도 있습니다. 저도 그랬으니까요.

 

 

for문이 하는 일을 러프하게 정의하자면, 내가 가진 어떤 리스트의 원소를 하나씩 꺼내서

조건에 맞는지 확인하고, 맞으면 특정한 조작을 가해서 새로운 리스트 안에 집어넣는,

뭐 일련의 이런 과정이 많을 겁니다.

그러니 결과가 익숙해지면 과정이 좀 축약되었으면 좋겠다라는 생각을 하는 것이죠.

이럴 때 아주 유용한 것이 바로 리스트 컴프리헨션 문법입니다.

리스트 컴프리헨션이란?

흔히 사용되는 순회문의 문법이 한줄로 축약되는 문법이라고 보시면 됩니다.

코드가 간결해짐과 동시에, 제너레이터를 반환하기 때문에 lazy evaluation으로 동작한다는 장점도 있습니다. (이 부분이 무슨 말인지는 추후 다른 글로 설명하겠습니다.)

기존의 for 문에서는..

 

위에는 간단한 for 문 샘플이 있습니다.

prelist에서 원소를 하나씩 꺼내어서 a라는 변수에 담고,

받은 원소를 짝수인지 검사한 뒤에,

짝수라면 제곱을 해서,

postlist에 집어넣습니다.

우리가 for문을 이용해 흔히 하는 행위들이죠?

[16, 36, 64] 라는 결과 값을 얻기 위해서는 코드 6줄이 필요합니다.

리스트 컴프리헨션 문법으로 작성해보자

 

리스트 컴프리헨션으로 작성된 코드입니다. 딱 한줄로 끝났습니다.

무조건 짧은 코드가 반드시 좋은 것은 아니지만, 루틴하게 사용되는 작업들을 처리할 때는

상당히 간결한 느낌을 줍니다.

문법은 다음과 같습니다.

[반환규칙 for 원소 in 순회대상리스트 (if 조건)]

조건이 없는 경우에는 소괄호 안의 내용은 생략이 가능합니다.

 

위의 그림은 조건을 바꾸어 홀수인 경우 제곱하여 반환하도록 짠 코드입니다. 간결하죠?

유의할 점

간단하고 쉬운 문법인데다가 지연연산까지 지원하니 참 좋긴한데,

이중 for 문을 구현하거나, 다중 조건을 활용한 내용의 코드를 작성하려면

가독성이 확 낮아져버리는 단점이 있긴 합니다.

하지만 그런 복잡한 for 문 들 이외에, 구조가 간단하고 빈번하게 등장하는 for 문들을 처리하기에는

이만한 문법도 없는 것 같습니다.

반응형