2010-05-04 3 views
0

이를 작성하는 깔끔한 방법이 :파이썬 : 청소기 지능형리스트

for w in [w for w in words if w != '']: 

나는 사전 words을 통해 루프를 원하는,하지만 단어 만이 != ''. 감사!

+0

"공백이 아닌 단어"는 아래의 주석 또는 *가'! = ""'*와 같지 않음을 나타냅니다. 필요한 경우'isspace' 메소드를 사용하십시오. –

+0

죄송 합니다만, 나는 공백 (편집 됨)을 의미하지 않습니다. – ash

답변

6

여기에 listcomp이 필요하지 않습니다. 그냥 쓰기 :

for w in words: 
    if w != '': 
     # ... 
+0

괜찮습니다. 그럴 가치가있어. – ash

+3

리스트를 이해하는 것은 이터 레이팅의 파이썬적인 방법입니다. –

+1

@ 대니얼 골드버그, 저는 'for'가 iterating을위한 것이라고 생각했고, OP가 그것을하고 있기 때문에 그것은 과잉이라고 말합니다. @ dan04 +1, 그것은 올바른 방법 ... IMO –

2

건반 후 것을 가정하면, 왜 시도하지 :

[w for w in words if w] 
1

filter(lambda w: w != '', words) 또는 filter(None, words)

이 제안입니다, 그것은 당신의 문제에 대한 최선의 해결책이 될 수 없습니다 .

+0

"필터 (P, S)는 거의 항상 S [P이면 x에 대해 x]로 표시됩니다."- Guido van Rossum. –

+0

@ 아니요. 기능적인 부분으로 부분적입니다. 동시에 귀도는 정말로 그들을 싫어합니다. 그들은 그들의 자리를 가지고 있지만 OP 문제는 아닐 것입니다. – Anycorn

+0

첫 번째 스 니펫은 SyntaxError입니다 (나는'! ='-'not'은 다른 것입니다). 'filter'를 사용하는 것은 list comprehension (우리가 Haskell이 아닌 다른 사람으로부터 훔친 아이디어입니다!)을 사용하는 것보다 * 더 기능적이지 않습니다 * 그리고 lambdas와 함께'filter'와'map'을 사용하는 것은 나에게 바보처럼 보입니다. –

1

요소가 ''과 같지 않은지 테스트하면 공백 요소가 필터링되지 않습니다. 그게 너라면 나중에 str.isspace (또는 정규 표현식)을 사용하고 싶을 것이다.

목록 이해력을 사용하는 경우 목록의 추가 복사본을 중간 개체로 만듭니다. 아마 큰 문제는 아니지만 발전기는 여분의 메모리를 사용하지 않을 것입니다.

나는 발생기, 이런 식으로 할 거라고 :

for word in (w for w in words if not w.isspace()): 
    # do stuff 
0

루프 외부의 몸은 무엇입니까?

는 함수 호출이 잠재적으로 할 수 있다면 바로 수행

[f(w) for w in words if w != '']

1

난 당신의 솔루션을 하위 최적이라고 생각합니다. 목록 words을 두 번 반복합니다. 목록 작성에서 한 번만 null이 아닌 조건을 만들고 루프를 다시 처리합니다. 그렇게 genexp를 사용하면 더 좋을 것입니다.

for w in (x for x in words if x): process(w) 

그런 식으로 genexp는 null이 아닌 목록을 지연 반환합니다.

+2

'에 대해서만 의미가 있습니다 : if x : process (w)'가 더 간단하고 짧아서 더 명확 해 보입니다. –