[Pythonic한 코드 작성하기] 리스트 컴프리헨션 (list comprehension)
참고 : 이펙티브 파이썬
1. map과 filter 함수 대신 리스트 컴프리헨션을 사용하자
파이썬에서는 한 리스트를 다른 리스트로 만들어주는 간결한 문법이 있습니다. 이 문법을 사용한 표현식을 리스트 컴프리헨션(list comprehension; 리스트 함축 표현식)이라고 합니다.
예를 들자면 아래와 같습니다.
nums = [x for x in range(1, 10)]
간단한 연산에서는 리스트 컴프리헨션이 내장함수 map
모다 훨씬 명확합니다. map
을 사용하려면 lambda
함수를 사용해야해서 깔끔해보이지 않고, 직관적이지 않습니다.
nums = map(lambda x : x, a)
리스트 컴프리헨션에는 조건도 간단하게 작성할 수 있습니다. 짝수만 걸러내는 리스트를 만든다면 아래와 같은 코드가 나옵니다.
even = [x for x in range(1, 10) if x%2 == 0]
내장함수 filter
와 map
을 사용해서 같은 결과를 얻을 수 있지만 훨씬 읽기가 어렵습니다.
even = map(lambdax x : x, filter(lambda x : x%2 == 0, a))
이러한 이유로 가능하다면 리스트 컴프리헨션을 사용해줍시다!
2. 리스트 컴프리헨션에서는 표현식을 간단하게!
리스트 컴프리헨션의 경우 표현식을 하나 이상 쓰게된다면 코드가 직관적이지 않고 복잡하게 됩니다.
# 안좋은 예시
lst = [x for sublist1 in my_lst
for sublist2 in sublist1
for x in sublist2]
부득이하게 두번 이상 사용해야 하는 경우 차라리 두번 적어주는 것이 좋습니다.
3. 컴프리헨션이 클 때에는 제너레이터로!
리스트 컴프리헨션에서 받아오는 입력 시쿼스가 매우 클 경우, 메모리를 많이 소모해서 프로그램이 이상해질수가 있습니다. 이러한 문제를 해결하기 위해서는 리스트 컴프리헨션과 제너레이터를 일반화한 제너레이터 표현식을 사용할 수 있습니다. 제너레이터에 관한 내용은 예전 게시글을 한번 읽어보세요!
제너레이터 표현식은 ()
문자 사이에 리스트 컴프리헨션과 비슷한 문법을 사용하여 생성합니다. 다음은 리스트 컴프리헨션으로 파일을 읽은 것을 표현한 예시입니다.
iter = (len(x) for x in open('./file.txt'))
print(it)
>>>
<generator object <genexpr> at 0x101b81480>
필요할 때 저네러이터 표현식에서 다음 출력을 생성하려면 내장함수 next
로 반환받은 이터레이터를 한번에 전진시키면 됩니다. 코드에서는 메모리의 사용량을 걱정하지 않고 제너레이터 표현식을 사용하면 됩니다.
print(next(it))
print(next(it))
>>>
100
57
제너레이터 표현식의 또 다른 강력한 결과는 다른 제너레이터 표현식과 함께 사용할 수 있다는 점입니다. 아래는 제러네리터의 표현식이 반환한 이터레이터를 다른 제너레이터 표현식의 입력으로 사용한 예시입니다.
iter = ((x, x**2) for x in it)
이 이터레이터를 전진시킬 때 마다 루프의 도미노효과로 내부 이터레이터도 전진시키고 조건 표현식을 계산해서 입력과 출력을 처리합니다.
이처럼 제너레이터를 연결하면 큰 입력스트림에서 잘 동작하는 코드를 짤 수 있습니다!
'Computer Engineering > Python' 카테고리의 다른 글
[Pythonic한 코드 작성하기] 파이썬의 자식 프로세스 관리 모듈, subprocess (0) | 2021.04.21 |
---|---|
[Pythonic한 코드 작성하기] Python의 가변 인수(*args)와 키워드 인수에 대해 파헤쳐보자 (0) | 2021.02.25 |
파이썬에서 Generator란? (0) | 2021.01.27 |
파이썬에서 Generator란? (feat. yield 함수) (0) | 2021.01.09 |
파이썬에서 노션 API를 사용하여 뉴스 크롤링한 정보를 노션에 업로드하기 (notion-py) (0) | 2020.12.27 |
댓글
이 글 공유하기
다른 글
-
[Pythonic한 코드 작성하기] 파이썬의 자식 프로세스 관리 모듈, subprocess
[Pythonic한 코드 작성하기] 파이썬의 자식 프로세스 관리 모듈, subprocess
2021.04.21 -
[Pythonic한 코드 작성하기] Python의 가변 인수(*args)와 키워드 인수에 대해 파헤쳐보자
[Pythonic한 코드 작성하기] Python의 가변 인수(*args)와 키워드 인수에 대해 파헤쳐보자
2021.02.25 -
파이썬에서 Generator란?
파이썬에서 Generator란?
2021.01.27 -
파이썬에서 Generator란? (feat. yield 함수)
파이썬에서 Generator란? (feat. yield 함수)
2021.01.09