检查Python中dict对象中是否存在属性集合

时间:2013-06-02 00:19:20

标签: python dictionary

检查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

非常感谢!

3 个答案:

答案 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