【问题标题】:Finding set difference between two complex dictionaries查找两个复杂字典之间的集合差异
【发布时间】:2010-11-24 09:25:23
【问题描述】:

我有两个结构如下的字典:

a) dict1 = {'a':[ [1,2], [3,4] ], 'b':[ [1,2],[5,6] ]}
b) dict2 = {'a':[ [1,2], [5,6] ], 'b':[ [1,2],[7,8] ]}

我需要找到字典中每个键之间的设置差异,即 dict1['a'] - dict2['a'] 应该返回 [3,4]。任何想法表示赞赏。

【问题讨论】:

  • dict1 = {'c': [[1, 2], [3, 4]]}; dict2 = {'c':[[5, 6], [7, 8]]} 会发生什么?
  • 它应该返回 dict1['c'] = [ [1,2], [3,4] ]

标签: python-3.x python


【解决方案1】:

使用可变项(例如列表)使问题变得更加困难,因为它排除了简单使用 Python 的 set 数据结构。制作实际使用元组代替那些讨厌的列表的临时副本/版本可能是值得的:

def tempaux(d):
  return dict((k, set(tuple(x) for x in v))
              for k, v in d.iteritems())

现在:

def thedifs(dd1, dd2)
  d1 = tempaux(dd1)
  d2 = tempaux(dd2)
  allkeys = set(d1).update(d2)
  empty = set()
  difs = []
  for k in allkeys:
    s1 = d1.get(k, empty)
    s2 = d2.get(k, empty)
    adif = s1 - s2
    if adif: difs.append(adif)
  return difs

这假设实际的集合差异而不是对称差异等。您当然可以在返回之前将元组转回列表,&c,具体取决于您的确切要求。

【讨论】:

    【解决方案2】:
    >>> s1 = set([(1,2), (3,4)])
    >>> s2 = set([(1,2), (5,6)])
    >>> s1 - s2
    {(3, 4)}
    

    【讨论】:

      【解决方案3】:

      你的数据结构不正确。

      改用这个。

      dict1 = {'a': [(1, 2), (3, 4)], 'b': [(1, 2), (5, 6)]}
      dict2 = {'a': [(1, 2), (5, 6)], 'b': [(1, 2), (7, 8)]}
      

      当您尝试对元组等不可变对象执行集合操作时,生活会变得更简单。

      这会将您的列表列表转换为元组列表。

      >>> dict( (key,[tuple(v) for v in dict1[key]]) for key in dict1 )
      {'a': [(1, 2), (3, 4)], 'b': [(1, 2), (5, 6)]}
      

      这是完整的解决方案。

      >>> dict1t= dict( (key,[tuple(v) for v in dict1[key]]) for key in dict1 )
      >>> dict2t= dict( (key,[tuple(v) for v in dict2[key]]) for key in dict2 )
      >>> set(dict1t['a'])-set(dict2t['a'])
      set([(3, 4)])
      

      【讨论】:

        【解决方案4】:

        适用于a和b结构相同时的list或dict或number

        c={'a':'1','b':'2'}
        d={'a':'10','b':'20'}
        e={'x':c,'t':15}
        f={'x':d,'t':19}
        
        def diff(a,b):
            if isinstance(a, int) and isinstance(b, int):
                b = b - a
                return b
            if isinstance(a, str) and isinstance(b, str):
                if a.isdigit() and b.isdigit():
                    b = str(int(b) - int(a))
                    return b
                else:
                    b = a
                    return b
            if type(a) is list and type(b) is list:
                for i in range(len(a)):
                    b[i] = diff(a[i],b[i])
                return b
            if type(a) is dict and type(b) is dict:
                for k,v in b.iteritems():
                    b[k] = diff(a[k],b[k])
                return b
        
        print diff(e,f)
        

        【讨论】:

          猜你喜欢
          • 2012-02-09
          • 2021-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-21
          • 2019-01-20
          • 1970-01-01
          相关资源
          最近更新 更多