检查di中的multilpe密钥

2024-10-06 12:09:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的dict()

xyz = {"a":{"b":[1,2,3]}}

我想检查嵌套的dict是否有键“b”或“c”。 我可以检查一把钥匙

>>> "b" in xyz.get("a",{})
True

我试过以下方法

>>> "b" or "c" in xyz.get("a",{})
'b'

但我想知道我是否能为“b”和“c”写下这句话。 希望这有意义。你知道吗


Tags: or方法intruegetdict意义钥匙
3条回答

any和生成器表达式是您的朋友:

>>> xyz = {"a":{"b":[1,2,3]}}
>>> any(i in xyz.get("a",{}) for i in ["b", "c"])
True

您可以使用^{}

>>> bool({'b','c'}.intersection(xyz.get('a')))
True

以下基准测试表明,它比any更有效:

:~$ python -m timeit "xyz = {'a':{'b':[1,2,3]}};any(i in xyz.get('a',{}) for i in ['b', 'c'])"
1000000 loops, best of 3: 0.932 usec per loop

:~$ python -m timeit "xyz = {'a':{'b':[1,2,3]}};bool({'b','c'}.intersection(xyz.get('a')))"
1000000 loops, best of 3: 0.649 usec per loop

但在这种情况下@abarnert的答案是最快的:

~$ python -m timeit "xyz = {'a':{'b':[1,2,3]}};'b' in xyz.get('a', {}) or 'c' in xyz.get('a', {})"
1000000 loops, best of 3: 0.325 usec per loop

or不是那样工作的。(这可能是关于StackOverflow的最常见的Python问题,但不幸的是,除非您已经知道问题所在……or只需要两个布尔表达式并返回truthy,如果其中任何一个是truthy,那么您要问的是"b"是否是truthy(它是),或者"c" in xyz.get("a", {})是真的(可能是真的,也可能不是真的,但是Python甚至不需要检查),所以它返回给您"b",这是真的。你知道吗

你也许可以用括号来解决这个问题,("b" or "c") in xyz.get("a", {}),但那同样糟糕。首先计算("b" or "c")并得到"b",然后检查dict中是否有,忽略"c"。你知道吗

在英语中,等价句之所以有意义,是因为你在含蓄地问“dict中是b还是c”;Python不会让你保持这种含蓄,但你总是可以让它显式化:

"b" in xyz.get("a", {}) or "c" in xyz.get("a", {})`

如果您想做其中的两个以上(或者如果它们只是动态知道的),那么您将希望使用any,和/或将xyz.get("a", {})存储在一个临时变量中,而不是重复它,如在utdemir的答案中,或者,也许更好,使用一个集合,如在Kasra的答案中。你知道吗

相关问题 更多 >