我想做的事情是:

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

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

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


当前回答

my_dict = {
    'name': 'Askavy',
    'country': 'India',
    'age': 30
}

if set(('name', 'country','age')).issubset(my_dict.keys()):
     print("All keys are present in the dictionary") 
else: 
    print("All keys are not present in  the dictionary") 

其他回答

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

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)

这只是我的看法,在所有给定的选项中,有两个方法很容易理解。所以我的主要标准是代码可读性强,而不是特别快。为了保持代码的可理解性,我更喜欢给定的可能性:

var <=var2.keys() var.issubset(var2)

事实上,“var <= var2.keys()”在我下面的测试中执行得更快,我更喜欢这个。

import timeit

timeit.timeit('var <= var2.keys()', setup='var={"managed_ip", "hostname", "fqdn"}; var2= {"zone": "test-domain1.var23.com", "hostname": "bakje", "api_client_ip": "127.0.0.1", "request_data": "", "request_method": "GET", "request_url": "hvar2p://127.0.0.1:5000/test-domain1.var23.com/bakje", "utc_datetime": "04-Apr-2019 07:01:10", "fqdn": "bakje.test-domain1.var23.com"}; var={"managed_ip", "hostname", "fqdn"}')
0.1745898080000643

timeit.timeit('var.issubset(var2)', setup='var={"managed_ip", "hostname", "fqdn"}; var2= {"zone": "test-domain1.var23.com", "hostname": "bakje", "api_client_ip": "127.0.0.1", "request_data": "", "request_method": "GET", "request_url": "hvar2p://127.0.0.1:5000/test-domain1.var23.com/bakje", "utc_datetime": "04-Apr-2019 07:01:10", "fqdn": "bakje.test-domain1.var23.com"}; var={"managed_ip", "hostname", "fqdn"};')
0.2644960229999924

并不是说这不是你没有想过的事情,但我发现最简单的事情通常是最好的:

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

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

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

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)基于任意的小工具的调用者可以使用任何关于失败概率的知识来对查询项进行相应的排序,而基于集的小工具则不允许这样的控制。

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