检查Python中dict对象中是否存在属性集合的好方法是什么?
目前我们正在这样做,但似乎可能有更好的方法:
properties_to_check_for = ['name', 'date', 'birth']
for property in properties_to_check_for:
if property not in dict_obj or dict_obj[property] is None:
return False
非常感谢!
答案 0 :(得分:8)
您可以将all
与生成器一起使用:
all(key in dict_obj for key in properties_to_check_for)
它会短路,就像你的for
循环一样。这是您当前代码的直接翻译:
all(dict_obj.get(key) is not None for key in properties_to_check_for)
如果密钥不在您的字典中, d.get(key)
将返回None
,因此您不需要事先检查它是否在那里。
答案 1 :(得分:3)
您可以使用any()
:
any(dict_obj.get(prop) is None for prop in properties_to_check_for )
如果在property
中找不到任何properties_to_check_for
或者其值为None
,则会返回True。
答案 2 :(得分:2)
对于大型词典与大型列表比较,将set
返回的viewkeys
类似对象与set
properties_to_check_for
版本进行比较可能会带来性能优势
if dict_obj.viewkeys() >= set(properties_to_check_for):
计时测量:
timeit.timeit('dict_obj.viewkeys() >= set(properties_to_check_for)',
setup='dict_obj = dict(zip(xrange(100000), xrange(100000))); properties_to_check_for=xrange(10000)',
number=10000)
9.82882809638977
timeit.timeit('all(key in dict_obj for key in properties_to_check_for)',
setup='dict_obj =dict(zip(xrange(100000),xrange(100000)));properties_to_check_for=list(xrange(10000))',
number=10000)
12.362821102142334