我想做的事情是:
foo = {
'foo': 1,
'zip': 2,
'zam': 3,
'bar': 4
}
if ("foo", "bar") in foo:
#do stuff
我如何检查是否foo和酒吧都在dict foo?
我想做的事情是:
foo = {
'foo': 1,
'zip': 2,
'zam': 3,
'bar': 4
}
if ("foo", "bar") in foo:
#do stuff
我如何检查是否foo和酒吧都在dict foo?
当前回答
在确定是否只有一些键匹配的情况下,这是有效的:
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
其他回答
虽然我喜欢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')),因为它更短。然而,这并不是那么容易理解的,我认为大括号太容易被混淆为字典。
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")
简单的基准测试钻机3的替代品。
输入D和Q的值
>>> from timeit import Timer
>>> setup='''from random import randint as R;d=dict((str(R(0,1000000)),R(0,1000000)) for i in range(D));q=dict((str(R(0,1000000)),R(0,1000000)) for i in range(Q));print("looking for %s items in %s"%(len(q),len(d)))'''
>>> Timer('set(q) <= set(d)','D=1000000;Q=100;'+setup).timeit(1)
looking for 100 items in 632499
0.28672504425048828
#This one only works for Python3
>>> Timer('set(q) <= d.keys()','D=1000000;Q=100;'+setup).timeit(1)
looking for 100 items in 632084
2.5987625122070312e-05
>>> Timer('all(k in d for k in q)','D=1000000;Q=100;'+setup).timeit(1)
looking for 100 items in 632219
1.1920928955078125e-05
这应该可以工作:
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()的正常短路行为。
你也可以使用. is子集()
>>> {"key1", "key2"}.issubset({"key1":1, "key2":2, "key3": 3})
True
>>> {"key4", "key2"}.issubset({"key1":1, "key2":2, "key3": 3})
False
>>>