为什么我们在Python字典生成器中有这种行为?

时间:2015-08-28 10:06:05

标签: python dictionary syntax

为什么在第一种情况下字典键被覆盖,但在第二种情况下,值已被覆盖?

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

4 个答案:

答案 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,第二个表达式(即值)vifelse是条件表达式的一部分。

理解意味着对于k, v中的每个a.items形成一个键值None,如果v.__class__ == dict和k否则值为v