为什么在第一种情况下字典键被覆盖,但在第二种情况下,值已被覆盖?
>>> a = {'a': 1, 'b': {'c': 3}}
>>> {None if v.__class__ == dict else k: v for k, v in a.items()}
{'a': 1, None: {'c': 3}}
>>> {k: v if v.__class__ != dict else None for k, v in a.items()}
{'a': 1, 'b': None}
答案 0 :(得分:2)
如果我们重写为标准循环,情况可能会变得更加清晰(请注意,我已使用isinstance
作为更好的类检查):
选项1 :
d = {}
for k, v in a.items():
d[None if isinstance(v, dict) else k] = v
选项2 :
d = {}
for k, v in a.items():
d[k] = None if isinstance(v, dict) else v
显然,前者正在修改键,后者正在修改值。
您没有说明实际想要发生什么,但如果您试图跳过 k: v
对,其中值为字典,即:
d = {}
for k, v in a.items():
if not isinstance(v, dict):
d[k] = v
然后“字典理解”等价物看起来像:
{k: v for k, v in a.items() if not isinstance(v, dict)}
请注意, if
之后显示的for
条件充当过滤器。
答案 1 :(得分:0)
您只是根据条件选择键,无论是否执行,值都保持不变。括号将使其更具可读性。
String name = myJson.get("person").get("name")
String city = myJson.get("person").get("address").get("city")
答案 2 :(得分:0)
因为如果......别紧紧地绑定:。这样做很好,因为否则你会有{('a':1),无},而且这不是一个字典。 : - )
你可能想要
{k: v for k, v in a.items() if not isinstance(v, dict)}
但要小心:你真的在这里挑出单词吗?还是任何映射?或者任何不是int的东西?还是......
答案 3 :(得分:0)
请参阅dict comprehensions上的语言规范:
如果您分析字典理解None if v.__class__ == dict else k: v for k, v in a.items()
,则必须匹配格式expression : expression comp_for
。那么让我们来看看comp_for
可能是什么。它指出comp_for
必须以for
开头,其中只有一个,因此for k, v in a.items()
是for_comp
,其余的则需要expression : expression
1}},但只有一个冒号,所以第一个表达式(即键)将是None if v.__class__ == dict else k
,第二个表达式(即值)v
。 if
和else
是条件表达式的一部分。
理解意味着对于k, v
中的每个a.items
形成一个键值None
,如果v.__class__
== dict和k
否则值为v
。