2015-03-29 4 views
1

Предположит у меня есть следующие два словаря:Проверьте вложенный словарем является подмножеством другого вложенного словаря

dict1 = 
{ 
    'battery1' : { 'Charge': 'enable', 'Discharge': 'enable' }, 
    'battery2' : { 'Charge': 'enable', 'Discharge': 'enable' } 
} 

dict2 = 
{ 
    'Estimated battery run-time': '05:00 minutes', 

    'battery1': {'Device': 'controller', 'Discharge': 'enable', 
    'Charging State': 'Fully charged', 'Charge': 'disable'}, 

    'battery2': {'Device': 'controller', 'Discharge': 'enable', 
    'Charging State': 'Fully charged', 'Charge': 'disable'} 
} 

Я хотел бы проверить, если dict1 является подмножеством dict2 (т.е. если ключевые пары значений в dict 1 отображаются в dict2, а ОК, что те же клавиши в dict2 будут включать EXTRA, такие как состояние зарядки и устройство).

for k, v in dict1.iteritems(): 
    for t, c in v.iteritems(): 
     if k in dict2: 
      if c != dict2[k][v]: 
       mismatch = true 
       break; 

Но я получаю

unhashable type: 'dict' error. 

Обратите внимание, что это другой вопрос, чем:

Loop through all nested dictionary values?

Taking sums of nested values of nested dictionary

Iterate over nested dictionary

Может кто-нибудь помочь?

Заранее спасибо.

+0

вам нужно сравнить с 'dict2 [к] [т] 'и вы должны использовать' несовпадение = true' –

+0

Это не совсем понятно, что вы хотите здесь, вы можете расширить на то, что вывод, который вы ожидаете –

ответ

0

У вас было несколько ошибок. Если я понимаю, что вам нужно, это работает для меня. Это версия python 3. Для python 2 замените dict.items() на dict.iteritems().

def compare(dict1, dict2): 
    for k1, v1 in dict1.items(): 
     if k1 in dict2: 
      for k2, v2 in v1.items(): 
       if v2 != dict2[k1][k2]: 
        return False 
    return True 

, например, с этими данными

dict1 = { 
    'battery1' : { 'Charge': 'enable', 'Discharge': 'enable' }, 
    'battery2' : { 'Charge': 'enable', 'Discharge': 'enable' } 
} 

dict2a = { 
    'Estimated battery run-time': '05:00 minutes', 
    'battery1': { 
     'Device': 'controller', 
     'Discharge': 'enable', 
     'Charging State': 'Fully charged', 
     'Charge': 'enable' 
    }, 
    'battery2': { 
     'Device': 'controller', 
     'Discharge': 'enable', 
     'Charging State': 'Fully charged', 
     'Charge': 'enable' 
    } 
} 

dict2b = { 
    'Estimated battery run-time': '05:00 minutes', 
    'battery1': { 
     'Device': 'controller', 
     'Discharge': 'enable', 
     'Charging State': 'Fully charged', 
     'Charge': 'disable' 
    }, 
    'battery2': { 
     'Device': 'controller', 
     'Discharge': 'enable', 
     'Charging State': 'Fully charged', 
     'Charge': 'disable' 
    } 
} 

запустивших для каждого словаря дает правильный ответ (я думаю).

print(compare(dict1, dict2a)) # True 
print(compare(dict1, dict2b)) # False 
+1

почему был ли это один вниз? Решение работает и делает то, что просит ОП. – Dannid

+0

Кстати, существует потенциальная ошибка здесь в том, что ключи в dict1, которых нет в dict2, никогда не будут сравниваться, делая dict1 не по-настоящему подмножеством dict2. Исправьте это, добавив 'else: return False' в тест' if k1 in dict2'. – Dannid

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