是否可以在不创建新字典的情况下在 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")
否则看起来您正在尝试创建包含两个元素的元组:
k
v for k, v in ...
第二个在句法上无效。 (如果你在它周围加上括号,使它成为一个生成器表达式。)
在 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")
否则看起来您正在尝试创建包含两个元素的元组:
k
v for k, v in ...
第二个在句法上无效。 (如果你在它周围加上括号,使它成为一个生成器表达式。)