2015-06-10 5 views
2
dictA = {'a':1, 'b':2, 'c':3} 
dictB = {'a':2, 'b':2, 'c':4} 

if dictA == dictB: 
    print "dicts are same" 
else: 
    # print all the diffs 
    for key in dictA.iterkeys(): 
     try: 
      if dictA[key] != dictB[key]: 
       print "different value for key: %s" % key 
     except KeyError: 
      print "dictB has no key: %s" % key 

Это становится неэффективным, если число элементов в изречениях и dictB огромныPython: найти разницу в dicts

Любой быстрый способ сделать это?

Я думал, как-то использовать комплекты, но не уверен.

-

это может быть дубликатом, но это, кажется, люди переборе в ответах на другие подобные вопросы

ответ

4

Вы можете использовать dict view objetcs:

просмотров

ключи устанавливаются, как так как их записи уникальны и хешируются. Если все значения хешируются, так что пары (ключ, значение) являются уникальными и хешируемыми, то представление элементов также задано. (. Просмотров значения не рассматриваются как набор подобных, так как записи, как правило, не единственна) Затем эти множественные операции доступны («другой» относится либо к другой точке зрения или набор):

dictview & other 
Return the intersection of the dictview and the other object as a new set. 

dictview | other 
Return the union of the dictview and the other object as a new set. 

dictview - other 
Return the difference between the dictview and the other object (all elements in dictview that aren’t in other) as a new set. 

dictview^other 
Return the symmetric difference (all elements either in dictview or other, but not in both) of the dictview and the other object as a new set. 

diff = dictA.viewkeys() - dictB.viewkeys() 

print(diff) 
set([]) 

print(dictA.viewitems() - dictB.viewitems()) 
set([('a', 1), ('c', 3)]) 

или наборы :

print(set(dictA.iteritems()).difference(dictB.iteritems())) 

Единственное ограничение у вас есть, очевидно, память

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