3

什么是检查 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

非常感谢!

4

3 回答 3

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,因此您实际上不需要事先检查它是否在其中。

于 2013-06-02T00:21:50.833 回答
3

你可以使用any()

any(dict_obj.get(prop) is None for prop in properties_to_check_for )

property如果在中找不到任何内容properties_to_check_for或者它的值为 ,这将返回 True None

于 2013-06-02T00:21:30.707 回答
2

对于大型字典与大型列表比较,将set返回的 -like 对象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
于 2013-06-02T00:35:16.917 回答