首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >python字典更新差异

python字典更新差异
EN

Stack Overflow用户
提问于 2009-04-03 11:04:34
回答 6查看 5.8K关注 0票数 6

python有没有任何内置的功能,可以在dict更新时通知哪些字典元素发生了变化?例如,我正在寻找一些类似如下的功能:

代码语言:javascript
运行
AI代码解释
复制
>>> 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)的结果所示

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-04-03 11:23:18

不能,但您可以子类化dict来提供更改通知。

代码语言:javascript
运行
AI代码解释
复制
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不会检查是否有“真正的”更改;它只是说明有更改。

票数 11
EN

Stack Overflow用户

发布于 2010-05-25 12:02:04

一年后

我喜欢以下解决方案:

代码语言:javascript
运行
AI代码解释
复制
>>> 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'}
票数 9
EN

Stack Overflow用户

发布于 2009-04-03 11:13:36

不,不需要。但是编写一个字典diff函数并不难:

代码语言:javascript
运行
AI代码解释
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/715234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文