我想做的事情是:

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

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

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


当前回答

检测是否所有键都在字典中的另一个选项:

dict_to_test = { ... }  # dict
keys_sought = { "key_sought_1", "key_sought_2", "key_sought_3" }  # set

if keys_sought & dict_to_test.keys() == keys_sought: 
    # True -- dict_to_test contains all keys in keys_sought
    # code_here
    pass

其他回答

你不需要把左边包在一个集合里。你可以这样做:

if {'foo', 'bar'} <= set(some_dict):
    pass

这也比all(k in d…)解决方案性能更好。

在确定是否只有一些键匹配的情况下,这是有效的:

any_keys_i_seek = ["key1", "key2", "key3"]

if set(my_dict).intersection(any_keys_i_seek):
    # code_here
    pass

还有另一个选项,如果只有一些键匹配:

any_keys_i_seek = ["key1", "key2", "key3"]

if any_keys_i_seek & my_dict.keys():
    # code_here
    pass

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

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

我认为这是最聪明和最精辟的。

{'key1','key2'} <= my_dict.keys()

虽然我喜欢Alex Martelli的回答,但在我看来,它并不像python。也就是说,我认为Pythonic的一个重要部分是易于理解。有了这个目标,<=就不容易理解了。

虽然它有更多的字符,但使用Karl Voigtland的答案所建议的is子集()更容易理解。由于该方法可以使用字典作为参数,一个简短的、可理解的解决方案是:

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

if set(('foo', 'bar')).issubset(foo):
    #do stuff

我想使用{'foo', 'bar'}来代替set(('foo', 'bar')),因为它更短。然而,这并不是那么容易理解的,我认为大括号太容易被混淆为字典。