Python 检查dict中的多LPE键

Python 检查dict中的多LPE键,python,Python,我有一个这样的口述 我想检查嵌套的dict是否有键“b”或“c”。 我可以检查一把钥匙,比如 >>> "b" in xyz.get("a",{}) True 我试过以下方法 >>> "b" or "c" in xyz.get("a",{}) 'b' 但我想知道我是否能为“b”和“c”写下这句话。 希望这有意义。任何和生成器表达式都是您的朋友: >>> xyz = {"a":{"b":[1,2,3]}} >>> any(i

我有一个这样的口述

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

>>> "b" in xyz.get("a",{})
True
我试过以下方法

>>> "b" or "c" in xyz.get("a",{})
'b'
但我想知道我是否能为“b”和“c”写下这句话。
希望这有意义。

任何
和生成器表达式都是您的朋友:

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

以下基准测试表明,它比任何都更有效:

:~$ 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

不是那样工作的。(这可能是关于StackOverflow最常见的Python问题,但不幸的是,除非您已经知道问题是什么,否则很难搜索…
只需要两个布尔表达式,如果其中任何一个是真的,则返回真实的值,因此您要问的是
“b”
是否是真的(它是真的),或者xyz.get中的
“c”(“a”,{})
是真实的(可能是,也可能不是,但Python甚至不需要检查),所以它会返回
“b”
,这是真实的

您可能会觉得可以用xyz.get(“a”,{})中的括号
(“b”或“c”)来解决这个问题,但这同样糟糕。首先,它将计算
(“b”或“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的答案那样。

不这样工作;这可能是关于StackOverflow最常见的Python问题。你可以在xyz.get中使用
“b”(“a”、{})或在xyz.get中使用“c”(“a”、{})
。我想你需要
xyz.get('a',{})
,而不是
xyz['a']
。他没有在他的问题中解释原因,但可能是出于某种原因,比如“a”键并不总是存在;一个dict已经是它的一组键了。@abarnert是的,当然修复了@但是关于使用
get
它的性能不如索引!我认为最好使用
尝试,除非性能非常重要!在这里,表演几乎肯定不重要。使您的代码更冗长、更复杂,以进行微优化—对C程序员而言,这无关紧要,而不是Python。:)在这种情况下,它的解决方案更快!但是对于更多的价值观来说,这不是一个好的选择@卡斯拉:我不知道它是否更快。我认为新手更容易理解,这一点很重要。但是如果超过2或3,它会变得非常笨拙,这就是为什么我说在这种情况下使用另外两种解决方案中的一种。次要技术点:这不是列表理解,而是生成器表达式(这仍然是一种理解,至少在3.x中,只是不是同一种)。
~$ 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
"b" in xyz.get("a", {}) or "c" in xyz.get("a", {})`