이것은 수년간 나를 괴롭 혔습니다.
내가 단어 목록을 가지고 있다면 :
words = [ 'one', 'two', 'three', '', ' four', 'five ', 'six', \
'seven', 'eight ', ' nine', 'ten', '']
초경량이지만이 목록 이해력을 작성하는 것이 여전히 이상합니다.
cleaned = [ i.strip() for i in words if i.strip() ]
나는 strip ()을 두 번 적용하는 것을 좋아하지 않습니다. 어리석은 것 같습니다.
다음과 같이 약간 / 무시할 정도로 빠릅니다.
_words = [ w.strip() for w in words ]
cleaned = [ w for w in _words if w ]
또한 다음과 같습니다.
cleaned = [ i for i in [ w.strip() for w in words ] if i ]
이것을 작성하는 다른 방법이 있는지 궁금합니다.
저는 중첩 된 루프 형태의 목록 이해에 관심이 많았지 만 ( 얕은 중첩 된 목록을 평면화하기위한 Idiom : 어떻게 작동합니까? )를 참조했지만 아무것도 알아낼 수 없었습니다.
나는 github에 벤치 마크를 올려 원래의 3 가지 접근 방식과 아래에 공유 된 접근 방식을 요약했습니다.
가장 빠른 것은 @Martijn Pieters입니다 filter()
. 내부 목록을 생성기 표현식으로 변환하는 것은 속도에 거의 영향을 미치지 않지만 메모리 관리에 더 좋습니다 (python의 문서에 따르면).
관련된 모든 속도 차이는 예상대로 무시할 수 있으며 공유 할 가치가 없습니다.
생성기 표현식 :
cleaned = [i for i in (word.strip() for word in words) if i]
filter()
및 사용 map()
:
cleaned = filter(None, map(str.strip, words))
후자는 Python 3에서 생성기를 생성합니다. list()
그것에 적용 하거나 map()
목록 이해력과 결합 하십시오.
cleaned = [i for i in map(str.strip, words) if i]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다