2013-06-02 3 views
3

Что такое хороший способ проверить, существует ли коллекция свойств внутри объекта dict в Python?Проверьте, существует ли набор свойств внутри объекта dict в Python

В настоящее время мы делаем это, но кажется, что может быть лучше:

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 

спасибо!

+2

Вы имеете в виду ' для свойства в свойствах_to_check_for'? Кроме того, не используйте 'property' в качестве имени переменной, так как оно переопределит встроенное. – Volatility

+3

Обратите внимание, что свойство * обычно используется для обозначения атрибута объекта ('spam.ham'). Словари имеют * ключи *. Правильная терминология упрощает работу с вашим кодом. –

+0

@ Lattyware: Хорошая точка. Это должно быть одним из пунктов PEP20;) – Tadeck

ответ

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

+1. 'all()' является менее обходным способом для этого, а 'dict.get()' также является лучшим решением. Кроме того, если вы не знаете об выражения генератора, [здесь] (http://www.youtube.com/watch?v=pShL9DCSIUw) - это видео, которое объясняет их, а также список comps и других родственников. –

3

Вы можете использовать any():

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

Это вернет Истина, если какой-либо property не найден в properties_to_check_for или если это значение None.

+0

Ваше решение полностью противоположно решению, предложенному Blender. Также результат будет противоположным (Blender's дает «True», когда все свойства найдены, «False» в противном случае, ваш дает точно противоположное). Во всяком случае, выживание. – Tadeck

+0

@ Tadeck Я согласен и даже указал на это. Но +1 идет в блендер, чей ответ в точности эквивалентен коду OP. :) –

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 
+0

Можете ли вы проверить это? – Blender

+0

@Blender, проверьте, какая часть? Выражение выше или часть производительности? – iruvar

+0

Эксплуатационная часть. – Blender

Смежные вопросы