2013-05-31 7 views
0

У меня есть словарь, где значения являются элементами списка:Итерация словарь

dict1={'A':[9,0,8],'B':[6,5,4],'C':[]} 

Теперь я должен обработать этот словарь, чтобы проверить, если все значения в словаре пустые списки; и если да, соберите ключи.

Есть ли лучший вариант, чем просто повторять записи?

+3

Как вы узнали, не проверив их все? – squiguy

+1

(Вопрос может быть прочитан несколькими способами. Рассмотрите его с примером или существующим кодом, который работает или не работает.) – user2246674

+0

Я искал лучший вариант, чем цикл for для словаря. Мы определенно должны были бы просмотрите все записи, безусловно, – IUnknown

ответ

2

После того, как у вас есть словарь, вы не можете избежать того, чтобы перебирать пункты для того, чтобы фильтровать:

keys = [key for key, value in dict1.items() if not value] 

if len(keys) != len(dict1): 
    # Do something about the mis-match 
+4

Или 'if not value' – TerryA

+0

Очень законный пункт @ Хайдо! –

4
if not any(dict1.values()): 
    res = dict1.keys() 
+4

Преимущество заключается в том, что 'any()' будет короткозамкнутым. –

+0

Угадайте, это зависит от того, есть ли пустые списки - обычный случай или необычный случай. Если это не редкость, вы будете переходить через dict1.values ​​() дважды без причины. Если это необычно, это полезный тест. – dawg

+0

@drewk Почему дважды? (не то, чтобы я действительно волновался об этом здесь: я считаю, что это читаемый способ). – Elazar

1

Вы можете проверить truthiness значений Dict:

di={'A':[9,0,8],'B':[6,5,4],'C':[], 'D':[0], 'E': []} 

truthy= [k for k in di if di[k]] 
falsy= [k for k in di if not di[k]] 

print 'truthy:{}, falsy:{}'.format(truthy,falsy) 

Печать:

truthy:['A', 'B', 'D'], falsy:['C', 'E'] 

Вы также можете использовать фильтр:

truthy=filter(lambda k: di[k], di) 
falsy=filter(lambda k: not di[k], di) 
Смежные вопросы