在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
更有限。
答案 0 :(得分:4)
Python需要围绕第一个k, v
的括号。
((k, v) for k, v in {"invalid": 1, "valid": 2}.items() if k == "valid")
否则,您似乎正在尝试使用两个元素创建元组:
k
v for k, v in ...
第二个在语法上没有效果。 (如果你在它周围加上括号,将它作为生成器表达式。)
答案 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。