我想做的事情是:

foo = {
    'foo': 1,
    'zip': 2,
    'zam': 3,
    'bar': 4
}

if ("foo", "bar") in foo:
    #do stuff

我如何检查是否foo和酒吧都在dict foo?


当前回答

你也可以使用. is子集()

>>> {"key1", "key2"}.issubset({"key1":1, "key2":2, "key3": 3})
True
>>> {"key4", "key2"}.issubset({"key1":1, "key2":2, "key3": 3})
False
>>>

其他回答

>>> ok
{'five': '5', 'two': '2', 'one': '1'}

>>> if ('two' and 'one' and 'five') in ok:
...   print "cool"
... 
cool

这似乎有用

这里有一个替代的解决方案,以防你想要得到不匹配的项目……

not_existing_keys = [item for item in ["foo","bar"] if item not in foo]
if not_existing_keys:
  log.error('These items are missing', not_existing_keys)

这应该可以工作:

if all(key in foo for key in ["foo","bar"]):
    # do stuff
    pass

提示:

在all()中使用方括号来创建一个列表推导式:

if all([key in foo for key in ["foo","bar"]]):

不仅是不必要的,而且是非常有害的,因为它们阻碍了all()的正常短路行为。

如果你想:

还可以获取键的值 多查字典

然后:

from operator import itemgetter
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
keys = ("foo","bar") 
getter = itemgetter(*keys) # returns all values
try:
    values = getter(foo)
except KeyError:
    # not both keys exist
    pass

Alex Martelli的解决方案集(查询)<= set(my_dict)是最短的代码,但可能不是最快的。假设Q = len(查询)和D = len(my_dict)。

这需要O(Q) + O(D)来创建两个集,然后(希望如此!)只需要O(min(Q,D))来进行子集测试——当然,假设Python集查找是O(1)——这是最坏的情况(当答案为True时)。

hughdbrown (et al?) all(k in my_dict for k in queries)的生成器解决方案是最差情况O(Q)。

复杂的因素: (1)基于set的小工具中的循环都是以c速度完成的,而基于any的小工具是在字节码上循环的。 (2)基于任意的小工具的调用者可以使用任何关于失败概率的知识来对查询项进行相应的排序,而基于集的小工具则不允许这样的控制。

一如既往,如果速度很重要,那么在操作条件下进行基准测试是个好主意。