2016-03-02 2 views
1

В Python 3.5 я пытаюсь перебрать цикл for с использованием dict понимания, но он не работает так, как с list. Ниже будут представлены как ошибка синтаксиса (не PyCharm, только во время выполнения):Можно ли использовать определение dict в цикле for без создания нового dict?

for k, v in (k, v for k, v in {"invalid": 1, "valid": 2}.items() if k == "valid"): # syntax error 
    print("Valid: " + (str(v))) 

В то время как следующие работы:

for e in (e for e in ["valid", "invalid"] if e == "valid"): # works 
    print(e) 

Я знаю создания нового dict будет работать (например), но я хочу избежать накладных расходов, поскольку я просто выполняю операции над элементами.

for k, v in {k: v for k, v in my_dict.items() if k == "valid"}.items(): # works 
    print("Valid: " + (str(k))) 

Конечно, я мог бы использовать обычный старый if k == "valid": continue условие внутри цикла, но я хотел бы понять, почему dict понимание представляется более ограниченным, чем с list.

+0

Это выражение генератора в вашем первом примере, а не понимание dict. Ваш последний пример - единственный, у которого есть понимание dict. – user2357112

ответ

4

Python требует скобок вокруг первого k, v.

((k, v) for k, v in {"invalid": 1, "valid": 2}.items() if k == "valid") 

В противном случае это выглядит, как вы пытаетесь сделать кортеж из двух элементов:

  1. k
  2. v for k, v in ...

Второй синтаксически не действует. (Было бы, если бы вы поместили вокруг нее круглые скобки, сделав это генераторным выражением.)

2

Вам нужно создать кортеж с к, v (k,v): т.е.

for k, v in ((k, v) for k, v in {"invalid": 1, "valid": 2}.items() if k == "valid"): 
       ^^^ 

То есть то, что вызывает ошибку синтаксиса. Если вы сделали то же самое со списком, задали понимание и т. Д., Это было бы точно так же, вам нужно использовать контейнер, если вы хотите добавить еще один элемент. Второй пример (e for e... работает, потому что вы каждый раз возвращаете один элемент, первые два примера также являются генераторными выражениями, только последний на самом деле является dict comp.

Смежные вопросы