是否可以在不创建新字典的情况下在 for 循环中使用字典理解?

Is it possible to use dict comprehension in a for loop without creating a new dict?

在 Python 3.5 中,我尝试使用 dict 理解迭代 for 循环,但它似乎不像 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 更受限制。

您需要用 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.

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 ...

第二个在句法上无效。 (如果你在它周围加上括号,使它成为一个生成器表达式。)