2010-06-18 2 views
2

나는 사전 d (그리고 별개의 정렬 된 키 목록, keys)을 가지고 있습니다. 나는 값이 False 만 프로세스 항목에 루프를 원했다 - 그래서 난은 다음 시도 : 파이썬 for 루프에서의 할당이 가능합니까?

for key in keys and not d[key]: 
#do foo 

내가 파이썬 sytax에 대한 이해가 내가 생각했던 것이 아니다 가정 - 할당이 일어난 것으로 생각 나던 때문에 위와 ai는 인스턴스 오류를 가져옵니다.

물론 아래 코드는 작동하지만 실제로 위 코드와 같은 것을 사용할 수 있기를 바랍니다. 가능합니까?

for key in keys: 
if d[key]: continue 
    #foo time! 

고마워요!

+1

귀하의 솔루션은 실제로 가장 분명하고 좋습니다. –

답변

5

genex를 사용하십시오.

for key in (k for k in keys if not d[k]): 
    .... 
+0

질문에서 나는 그것이 'd [k]가 아니면'이어야한다고 생각합니다. – kevingessner

+4

_if cond : continue_보다 훨씬 좋지 않으며 여러 조건을 쉽게 허용하지 않기 때문에이 작업을 수행하지 않는 것이 좋습니다 ("멋진"요소에 대한 생성기 식을 추가하는 중 ... 가능합니다. 그것을해라. 그러나 코드를 더 쉽게 이해할 수 없으며 더 빠르게 만들지도 않는다. (느리게 만든다고 생각한다.) –

+0

Terence, point taken! 감사합니다. – malangi

2
당신이 (값을 스캔해야는 true) 당신은 사용할 수 있습니다 반대했다 DICT 경우

:

for key in filter(d.get, keys): 
    ... 
+1

... 거짓 케이스의 경우'filter (lambda x : not d [x], keys) '까지 확장 할 수 있습니다. –

2
import itertools as it 

for key in it.ifilterfalse(d.get, keys): 
    ... 

itertools 자주 반복에 기능 팩을하는 가장 좋은 방법을 제공합니다 (== 루프 ;-).

+0

아아, 이거 멋있네요. itertool은 매일 새로운 선물을 가지고 있습니다. – malangi

+0

@flyingcrab, 아무쪼 락! –

관련 문제