【问题标题】:How to compare 2 dictionaries?如何比较两本词典?
【发布时间】:2014-10-16 13:59:31
【问题描述】:

我正在输入一本字典,可能类似于:

myWorld = {'MH': {'Mumbai': 1, 'Pune': 2}, 'GUJ': 3, 'RSA': {} }

我的测试词典是:

World = {'MH': {'Mumbai': 1, 'Pune': 2}, 'GUJ': 3, 'RSA': {}, 'USA': 4, 'UK': 5 }

我想检查一个条件,如果我在myWorld 中输入的任何内容在World 中不存在,它应该打印NotFound

for key, val in myWorld.iteritems():
    if (key, val) not in (World.keys(), World.values()) in World.iteritems():
        print "NotFound"
    else:
        print "Correct"

但这似乎不是正确的方法。无论我输入什么字典,我都会得到NotFound,即使它是"{'RSA':{}}"。我是python新手,所以不太了解它。谁能告诉这是哪里出了问题以及如何解决它?

Dictionaries = { 'A':{}'B':{}, 'C':{}, 'D':{}, 'myWorld' : {'id':1, 'name': 10}, {'id':2, 'name': 20}, {'id':3, 'name': 30}, {'id':4, 'name': 40}, {'id':5, 'name': 50} }

我正在运行 testsclassesA, b, C, D, myWorld 在这里是classes

我像mytest.py "{'A':{}}" 一样运行我的测试 mytest.py "{'myWorld' : {'id':1, 'name': 10}}"

mytest.py "{'myWorld' : {'id':2, 'name': 20}}" 因此,我使用mytest.py 输入的论点,我将它保存在 l 中。 其中l = ast.literal_eval(args[0])

现在当我不想运行不必要的测试时,我正在做

if all(key in Dictionaries and Dictionaries[key] == key and value for key, value in  l.iteritems()):
    proceed
else:
    exit(1)

现在有了这里给出的 if 语句的建议,它总是变成真的,我总是在键和值组合错误的情况下继续。 例如,即使我这样做mytest.py 'myWorld' : {'id':1, 'name': 12}

我不想那样。我希望它只针对Dictionaries中提到的可能性运行

【问题讨论】:

  • 如果存在任意数量的不匹配,您是想只打印一次“NotFound”,还是为每个缺失的键/值对打印一次?
  • key 和 value 必须匹配还是只匹配一个键或一个值?
  • 我想在键与 World 字典中的相应值不匹配时打印 not found 所以当我输入 {'MH': {Mumbai: 1, 'Pune': 2}}NotFound 时它应该打印 Correct 987654346@/ {'MH': {}}
  • 您的一些键和值是嵌套的,您必须展平才能比较所有键

标签: python if-statement for-loop dictionary compare


【解决方案1】:

一种方式:

if all(key in World and World[key] == value for key, value in myWorld.iteritems()):
    print "Correct"
else:
    print "NotFound"

这在值上使用了简单的相等性 - 如果您需要不同的东西,例如嵌套的 'Mumbai' dict,它不应该太难适应,只需更改您比较 value 的方式。

【讨论】:

  • 打印Correct,即使输入为{'RSA': {Mumbai: 1, 'Pune': 2}}
  • @pyLearner:显示您的测试代码,我认为它有问题。一方面,变量MumbaiAhmNYLondon 的值是多少?您在发布的代码中将所有这些都用作变量名,因为您没有在它们周围加上引号。不过,此代码不会为 World = {'MH': {'Mumbai': 1, 'Pune': 2}, 'GUJ': 'Ahm', 'RSA': {}, 'USA': 'NY ', 'UK': 'London' }myWorld = {'RSA': {'Mumbai': 1, 'Pune': 2}} 打印“正确”。
  • @SteveJessop {'MH': {'Mumbai': 1, 'Pune': 2}} 是 JSON 结构,它也是一个字典,其中 keyMHvalues{'Mumbai': 1, 'Pune': 2}
  • @SteveJessop 我已经编辑了代码。 LondonAhm 令人困惑。很抱歉
  • 鉴于上面显示的 myWorldWorld 的值,这有效 - 'Correct' 用于列出的 myWorld'NotFound' 用于 '{'RSA': {'Mumbai': 1, 'Pune': 2}}'。如果您看到不同的东西,那么您的测试代码仍然有问题。
【解决方案2】:

这原则上应该做你想做的:

world_items = world.items()
if all(it in world_items for it in myWorld.iteritems()):
    print 'correct'
else:
    print 'not correct'

【讨论】:

  • 为什么要对世界项目使用迭代查找?
  • 即使输入为{'MH': {Mumbai: 101, 'Pune': 102}},它仍在打印Correct
  • @PeterDeGlopper 你还会做什么?如果值中有 dicts,则基于集合的方法将不起作用...
  • 而不是字典查找,就像我的回答一样。 (k, v) in d.items()k in dict and dict[k] == v 慢。或者,如果字典确定不包含None,则只包含dict.get(k) == v
  • 嗯,对,实际上我没有看到你的答案。性能方面,这可能会更好..
【解决方案3】:
myWorld == World

这会起作用。

更新:

if myWorld == World:
    print 'correct'
else:
    print 'not found'

【讨论】:

  • @HuStmpHrr 它打印 Correct 即使我输入 {'MH': {}} 。应该不对吧?我尝试了各种组合。它不起作用我希望它仅在 两个键和相应的值 都正确时打印Correct。即使输入是{'MH': {Mumbai: 11, 'Pune': 12}},它也会打印正确所以它不是比较值。
  • @pyLearner 这会进行递归比较并比较键和对应的值。怎么行不通?请说明您的要求。
  • @pyLearner 我对你如何测试它感到困惑。在我的电脑上tmp = {'MH': {'Mumbai': 11, 'Pune': 12}}; tmp==World 输出False
  • @pyLearner 好的,我想我知道你是如何测试它的。请看我的编辑。
  • OP 要求检测 myWorld 是否是 World 的子字典,而不是相等的字典。如果World 的键不在myWorld 中,OP 仍然希望它指示correct。或者至少我是这么看问题的。
【解决方案4】:

您还可以将字典与这些进行比较:

  notthesame_item = set(myWorld.items()) ^ set(World.items())
  print len(notthesame_item) # should be 0

当两个字典中的元素相同时,XOR 运算符 (^) 将消除字典的所有元素。

   thesame_items = set(myWorld.items()) & set(World.items())
   print len(thesame_items)

将显示两个字典中的匹配元素。

【讨论】:

    猜你喜欢
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多