是否可以在for循环中使用dict理解而不创建新的dict?

时间:2016-03-02 18:36:38

标签: python loops syntax-error list-comprehension

在Python 3.5中,我尝试使用for理解来迭代dict循环,但它似乎不像list那样工作。以下将报告为语法错误(不是由PyCharm,仅在运行时):

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更有限。

2 个答案:

答案 0 :(得分: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 ...
  3. 第二个在语法上没有效果。 (如果你在它周围加上括号,将它作为生成器表达式。)

答案 1 :(得分:2)

您需要使用k创建一个元组,即(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。