2013-10-16 3 views
3

Есть ли способ, чтобы вернуть список ключей, внутренние значения Dict в соответствие определенным критериямФильтрующие элементы в Словаре в Словаре

данные питон ДИКТ:

adict = { 
    1: {'process':False, 'length':10}, 
    2: {'process':True, 'length':34}, 
    ..., 
    n: {'process': False, 'length: -3'} 
} 

Есть ли способ я могу получить список ключей [1, 2, 6 ...], который является внутренним, соответствует критериям, которые я хочу?

def somefiltering(critieria1, critieria2, critieria3...): 
    # for variable number of critieria 
    # logic 
    return list of keys 

Я знаю, что могу просто «зацикнуться» на своем словаре, но есть ли лучший способ? А также

Как мне отформатировать некоторые критерии фильтрации и форматировать критерии1, чтобы заставить его работать?
просто введите критерии1 = "process = True", не будет работать?

ответ

3

Вот способ сделать это:

adict = {1: {'process':False, 'length':10}, 2: {'process':True, 'length':34}, 3:{'process': False, 'length': -3}} 

def somefiltering(filterDict, *criteria): 
    return [key for key in filterDict if all(criterion(filterDict[key]) for criterion in criteria)] 

Обратите внимание, что ваша somefiltering функция будет нужно иметь словарь в качестве аргумента.

Пример использования:

somefiltering(adict, lambda d:d['process'], lambda d:d['length']>5) 
# Result: [2] 

somefiltering(adict, lambda d:d['length'] < 20) 
# Result: [1, 3] 

somefiltering(adict, lambda d:d['process'], lambda d:d['length']<5) 
# Result: [] 
+1

+1 для правильного единственного числа "критериев". – Hyperboreus

1

Если вам нужен список ключей, это будет

[k for k,v in adict.items() if creterion(v)] 

И использовать dict.iteritems() для 2.x.

1

Учитывая список вызываемых объектов, названных criteria, следующее выражение фильтра перечислим только Dict ключи которых соответствующие значения соответствуют всем критериям.

filter(lambda key: all(crit(adict[key]) for crit in criteria), adict.keys()) 
Смежные вопросы