2015-10-15 4 views
1
dic1 = {'memory':'4','cpu':'2','disk':{'total':'160','swap':'4','/':'26','/var':'7','/tmp':'2'}} 

dic2 = {'memory':8','cpu':'2','disk':{'total':'120,'swap':'4','/':'26','/var':'7','/tmp':'2'}} 

Обратите внимание, что оба словаря содержат другой словарь. Каков наиболее эффективный способ сравнения каждого элемента без выполнения dict1 == dict2?Самый эффективный способ сравнения двух словарей в python

Поскольку я должен увидеть некоторые изменения в значениях. Таким образом, единственная опция - итерация по каждому элементу словаря. что-то вроде:

for key1 in dic1: 
    for key2 in dic2: 
     if not isinstance(dic1[key1],dict): 
     #compare cpu & memory here 
     if int(dic1[key1]) > int(dict2[key2]) 
     else: 
      #compare disk(internal dictionary here) 
+0

Что вы хотите делать с ключом '' disk '', и это значение, которое является словарем? – Kasramvd

+0

То же самое, мне нужно также увидеть% изменения значений в «диске». Да, вы можете считать, что «ключи» остаются такими же как в словарях, так и в «дисковых» словарях. – akhi

ответ

0

Вы можете использовать itertools.zip_longest застегнуть значения и сравнить их в списке понимание:

>>> from itertools import chain,zip_longest 

["do something" if isinstance(i,dict) and all(k<v for k,v in zip_longest(i.values(),j.values())) else "do something" for i,j in zip_longest(dic1.values(),dic2.values())] 

Заметим, что здесь на основе ваших потребностей вы можете использовать другую функцию вместо all вы МАЕ быть заинтересованы в использовании any или, возможно, вы хотите выполнить некоторую арифметическую операцию над значениями.

+0

Я хочу также сравнить вложенные значения словаря. Интересно узнать о цепочке и zip_longest. Надеюсь, что это используется для улучшения perfomrance. – akhi

+0

@akhi Поскольку вы не указали, что хотите делать с этими значениями, я предлагаю общий способ. Проверьте изменения! – Kasramvd