2010-06-18 1 views
2

У меня есть словарь d (и отдельный отсортированный список ключей, keys). Я хотел цикл только запись процесса, где значение является False - так я попытался следующим:Возможно задание в python for loop?

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

Я полагаю, мое понимание питона sytax не то, что я думал, что это - потому что назначение оленьей кожи предположить, что произошло выше, и ai получить ошибку instanciation.

Следующие работы, конечно, но я действительно хотел бы иметь возможность использовать что-то вроде кода выше .. возможно?

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

Спасибо!

+1

Ваше решение действительно самое очевидное и приятное. –

ответ

5

Используйте ген для этого.

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

Из вопроса, я думаю, что это должно быть «если не d [k]». – kevingessner

+4

Я бы отказался от этого, потому что это не намного приятнее, чем _if cond: continue_, и это не легко разрешить несколько условий (кроме того, вы добавляете выражение генератора только для «крутого» фактора ... да, вы можете сделайте это, но это не делает код более понятным и не делает его быстрее (я предполагаю, что он делает его медленнее)) –

+0

Спасибо Теренсу, точка взята! – malangi

2

Если Сыроватского была противоположность (True тогда и только тогда значение должно быть отсканировано), вы можете использовать:

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

... и вы можете расширить это на 'filter (lambda x: not d [x], keys)' для False case –

2
import itertools as it 

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

itertools часто предлагает лучшие способы упаковать функциональность в итерации (== петля ;-).

+0

aah, это круто - itertool имеет новые подарки каждый день - спасибо Alex! – malangi

+0

@flyingcrab, добро пожаловать! –