python dict update diff

Есть ли у python какие-либо встроенные функции уведомления о том, какие словарные элементы изменились при обновлении dict? Например, я ищу некоторые функциональные возможности:

>>> a = {'a':'hamburger', 'b':'fries', 'c':'coke'} >>> b = {'b':'fries', 'c':'pepsi', 'd':'ice cream'} >>> a.diff(b) {'c':'pepsi', 'd':'ice cream'} >>> a.update(b) >>> a {'a':'hamburger', 'b':'fries', 'c':'pepsi', 'd':'ice cream'} 

Я ищу, чтобы получить словарь измененных значений, как показано в результате a.diff (b)

  • Код Python: Геометрическое Броуновское Движение - что случилось?
  • Как добавить элементы в массив numpy
  • Ошибка «нет такой таблицы» на Heroku после django syncdb прошла
  • Как эти строки представлены внутри интерпретатора Python? Я не понимаю
  • UnicodeEncodeError: кодек ascii не может кодировать символ u '\ xe7' в позиции 17710: порядковый номер не в диапазоне (128)
  • Шрифты по умолчанию в визуализации статистических данных Seaborn в iPython
  • Алгоритм сравнения изображений
  • Мой вход запускается, когда не предполагается
  • 6 Solutions collect form web for “python dict update diff”

    Нет, но вы можете подклассировать dict для уведомления об изменениях.

     class ObservableDict( dict ): def __init__( self, *args, **kw ): self.observers= [] super( ObservableDict, self ).__init__( *args, **kw ) def observe( self, observer ): self.observers.append( observer ) def __setitem__( self, key, value ): for o in self.observers: o.notify( self, key, self[key], value ) super( ObservableDict, self ).__setitem__( key, value ) def update( self, anotherDict ): for k in anotherDict: self[k]= anotherDict[k] class Watcher( object ): def notify( self, observable, key, old, new ): print "Change to ", observable, "at", key w= Watcher() a= ObservableDict( {'a':'hamburger', 'b':'fries', 'c':'coke'} ) a.observe( w ) b = {'b':'fries', 'c':'pepsi'} a.update( b ) 

    Обратите внимание, что определяемый здесь Суперкласс Watcher не проверяет, произошло ли «реальное» изменение или нет; он просто отмечает, что произошли изменения.

    год спустя

    Мне нравится следующее решение:

     >>> def dictdiff(d1, d2): return dict(set(d2.iteritems()) - set(d1.iteritems())) ... >>> a = {'a':'hamburger', 'b':'fries', 'c':'coke'} >>> b = {'b':'fries', 'c':'pepsi', 'd':'ice cream'} >>> dictdiff(a, b) {'c': 'pepsi', 'd': 'ice cream'} 

    Нет, нет. Но нетрудно написать функцию словаря diff:

     def diff(a, b): diff = {} for key in b.keys(): if (not a.has_key(key)) or (a.has_key(key) and a[key] != b[key]): diff[key] = b[key] return diff 

    Простую функцию легко записать. В зависимости от того, как часто вам это нужно, он может быть быстрее, чем более элегантный ObservableDict от S.Lott.

     def dict_diff(a, b): """Return differences from dictionaries a to b. Return a tuple of three dicts: (removed, added, changed). 'removed' has all keys and values removed from a. 'added' has all keys and values that were added to b. 'changed' has all keys and their values in b that are different from the corresponding key in a. """ removed = dict() added = dict() changed = dict() for key, value in a.iteritems(): if key not in b: removed[key] = value elif b[key] != value: changed[key] = b[key] for key, value in b.iteritems(): if key not in a: added[key] = value return removed, added, changed if __name__ == "__main__": print dict_diff({'foo': 1, 'bar': 2, 'yo': 4 }, {'foo': 0, 'foobar': 3, 'yo': 4 }) 
     def diff_update(dict_to_update, updater): changes=dict((k,updater[k]) for k in filter(lambda k:(k not in dict_to_update or updater[k] != dict_to_update[k]), updater.iterkeys())) dict_to_update.update(updater) return changes a = {'a':'hamburger', 'b':'fries', 'c':'coke'} b = {'b':'fries', 'c':'pepsi'} >>> print diff_update(a, b) {'c': 'pepsi'} >>> print a {'a': 'hamburger', 'c': 'pepsi', 'b': 'fries'} 

    Не встроен, но вы можете перебирать ключи от dict и делать сравнения. Однако может быть медленным.

    Лучшее решение, вероятно, заключается в создании более сложной структуры данных и использовании словаря в качестве основного представления.

    Python - лучший язык программирования в мире.