【问题标题】:Checking if Two Massive Python Dictionaries are Equivalent检查两个海量 Python 字典是否等价
【发布时间】:2011-11-28 12:54:23
【问题描述】:

我有一个包含 90,000 多个条目的大型 Python 字典。由于我不会进入的原因,我需要将此字典存储在我的数据库中,然后稍后从数据库条目中重新编译字典。

我正在尝试设置一个程序来验证我的存储和重新编译是否忠实,并且我的新字典与旧字典等效。对此进行测试的最佳方法是什么。

存在细微差别,我想弄清楚它们是什么。

【问题讨论】:

  • 如果你的值都定义了等价,那么 dict1 == dict2 应该可以工作
  • 我假设可能有一些小问题,如果有小问题,我想知道它们是什么,即有什么不同。
  • 您是否需要直接进行== 检查,或者您是否有兴趣了解哪些元素不同(例如,用于调试)?
  • 这是一个非常不错的课程,它完全符合您的要求 - stackoverflow.com/questions/1165352/…
  • “小问题”? “小问题”是什么意思?

标签: python dictionary transformation python-2.7


【解决方案1】:

最明显的做法当然是:

if oldDict != newDict:
  print "**Failure to rebuild, new dictionary is different from the old"

这应该是最快的,因为它依赖 Python 的内部来进行比较。

更新:看来你不是在追求“平等”,而是在追求更弱的东西。我认为您需要编辑您的问题,以明确您认为“等效”的含义。

【讨论】:

  • 这个我试过了,还是有区别的。我想建立一个程序,让我知道这些差异是什么。
  • @Peter 如果您想“设置一个程序让我知道这些差异是什么”,我认为您的问题很清楚,您为什么要将这个答案标记为已接受?
  • 如果你有嵌套对象,而不是基元怎么办
【解决方案2】:
>>> d1 = {'a':1,'b':2,'c':3}
>>> d2 = {'b':2,'x':2,'a':5}
>>> set(d1.iteritems()) - set(d2.iteritems()) # items in d1 not in d2
set([('a', 1), ('c', 3)])
>>> set(d2.iteritems()) - set(d1.iteritems()) # items in d2 not in d1
set([('x', 2), ('a', 5)])

编辑 不要投票给这个答案。转到Fast comparison between two Python dictionary 并添加一个赞成票。这是一个非常完整的解决方案。

【讨论】:

  • 其他帖子不使用iteritems。我更喜欢这种方法。
【解决方案3】:

你可以从这样的东西开始,然后调整它以满足你的需要

>>> bigd = dict([(x, random.randint(0, 1024)) for x in xrange(90000)])
>>> bigd2 = dict([(x, random.randint(0, 1024)) for x in xrange(90000)])
>>> dif = set(bigd.items()) - set(bigd2.items())

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2013-12-02
    • 2017-12-09
    • 2015-05-25
    相关资源
    最近更新 更多