查找两个复杂字典之间的集合差异

2 投票
4 回答
2515 浏览
提问于 2025-04-15 13:59

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

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]。有什么想法吗?

4 个回答

3

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个桶倒到另一个桶一样。

有些时候,我们会遇到一些问题,比如数据的格式不对,或者数据的类型不匹配。这就像是你想把牛奶倒进一个只适合倒水的杯子里,这样就会出问题。

为了避免这些问题,我们需要确保在处理数据之前,先检查一下数据的类型和格式。这样可以确保我们的程序能够顺利运行,不会因为数据的问题而出错。

总之,处理数据的时候,记得先检查一下,确保一切都正常,这样才能让你的程序顺利工作。

>>> s1 = set([(1,2), (3,4)])
>>> s2 = set([(1,2), (5,6)])
>>> s1 - s2
{(3, 4)}
6

使用可变的项目(比如列表)会让问题变得更加复杂,因为这会让我们无法简单地使用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

这里假设我们是在进行实际的集合差异,而不是对称差异等等。当然,根据你的具体需求,你可以在返回之前把元组再转换回列表,等等。

2

你用错了数据结构,跟你想做的事情不太合适。

试试这个。

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)])

撰写回答