【问题标题】:Difference in a dict字典的区别
【发布时间】:2011-10-01 17:07:32
【问题描述】:

我正在尝试找出字典中的区别,是否添加或删除了某些内容以及从什么内容中删除。

这是一个添加值的情况:

original = {0: None, 1: False, 2: [16]}
new = {0: None, 1: False, 2: [2, 16]}

difference = True, {2: 2} # True = Added

这是一个值被删除的情况:

original = {0: None, 1: False, 2: [16, 64]}
new = {0: None, 1: False, 2: [64]}

difference = False, {2: 16} # False = Removed

问题是我不知道如何接收差异。有人会碰巧知道如何达到这样的结果吗?

额外信息(不知道你是否需要这个):

  • 这也适用于原始和新的 0 和 1。
  • 1 和 2 不能同时处于活动状态。如果一个有值,另一个是 False。

【问题讨论】:

  • 为什么不围绕 dict 创建一个“包装器”并使用它来跟踪添加/删除内容的时间? (我不知道这在 python 中会有多难,但在 c# 中相当简单)。
  • 您的问题未指定。如果我在您的第一个示例中删除 16 添加 2 会发生什么?差异必须同时为真和假。
  • 让我们假设这永远不会发生,phooji。 :)

标签: python dictionary


【解决方案1】:

正如我在other question 中解释的那样,PyPI 上有一个专门用于此任务的库,即datadiff library。它易于使用,您可以使用输出来做您必须做的事情。

【讨论】:

    【解决方案2】:

    我觉得这很可读:

    def dict_diff(left, right):
        diff = dict()
        diff['left_only'] = set(left) - set(right)
        diff['right_only'] = set(right) - set(left)
        diff['different'] = {k for k in set(left) & set(right) if left[k]!=right[k]}
        return diff
    
    >>> d1 = dict(a=1, b=20, c=30, e=50)
    >>> d2 = dict(a=1, b=200, d=400, e=500)
    >>> dict_diff(d1, d2)
    {'different': {'b', 'e'}, 'left_only': {'c'}, 'right_only': {'d'}}
    

    【讨论】:

      【解决方案3】:

      这里是一个函数的链接,它可以产生两个字典的“差异”,然后是额外的 cmets/代码示例:

      http://code.activestate.com/recipes/576644-diff-two-dictionaries/

      包括以下代码:

      KEYNOTFOUND = '<KEYNOTFOUND>'       # KeyNotFound for dictDiff
      
      def dict_diff(first, second):
          """ Return a dict of keys that differ with another config object.  If a value is
              not found in one fo the configs, it will be represented by KEYNOTFOUND.
              @param first:   Fist dictionary to diff.
              @param second:  Second dicationary to diff.
              @return diff:   Dict of Key => (first.val, second.val)
          """
          diff = {}
          # Check all keys in first dict
          for key in first.keys():
              if (not second.has_key(key)):
                  diff[key] = (first[key], KEYNOTFOUND)
              elif (first[key] != second[key]):
                  diff[key] = (first[key], second[key])
          # Check all keys in second dict to find missing
          for key in second.keys():
              if (not first.has_key(key)):
                  diff[key] = (KEYNOTFOUND, second[key])
          return diff
      

      【讨论】:

        【解决方案4】:

        你可以暂时将 dic[2] 转入 python 中的set,并使用- 来获取差异

        【讨论】:

          【解决方案5】:

          类似的东西呢:

          def diff(a,b):
               ret_dict = {}
               for key,val in a.items():
                   if b.has_key(key):
                       if b[key] != val:
                           ret_dict[key] = [val,b[key]]
                   else:
                       ret_dict[key] = [val]
               for key,val in b.items():
                   ret_dict.setdefault(key,[val])
               return ret_dict
          

          【讨论】:

            【解决方案6】:

            这可以在一行中完成。

            [b[k] for k in a.keys() if not k in b]
            

            【讨论】:

              猜你喜欢
              • 2016-03-22
              • 1970-01-01
              • 2010-09-21
              • 2011-05-16
              • 2011-06-13
              • 2023-03-08
              • 2020-12-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多