【问题标题】:Python check if dict is part of other dictPython检查dict是否是其他dict的一部分
【发布时间】:2021-07-04 15:36:00
【问题描述】:

我有 2 个具有相同键的字典

dict1 = {'version': 222,'name_app': 'foo1'}
dict2 = {'version': 222,'name_app': 'foo1','dir': 'c','path': 'cc'}

现在我想检查 dict1 是否与 dict2 具有相同的键和值 我喜欢避免循环并检查dict1中的每个键和值是否在dict 2中 有没有 Python 优雅的方式来做到这一点?
更新
如果只有 1 个匹配,则 dict1 的两个键大部分都在 dict 2 中是假的

【问题讨论】:

  • 我读过 dan Badler 写的 python 技巧书,我还没有遇到过这样的事情。我认为你必须使用循环或生成器。

标签: python dictionary compare


【解决方案1】:

你可以这样做

set(dict1.items())-set(dict2.items())== set()

会根据你的情况返回真假

如果字典有列表:

from operator import *
g = itemgetter(*dict1)
print(dict1.keys() <= dict2.keys() and g(dict1) == g(dict2))

【讨论】:

  • 唯一的问题是当 dict 包含列表时它将不起作用并且会给出:{TypeError}unhashable type: 'list'
  • 那么你可以使用 itemgetter 来完成
【解决方案2】:

我会使用operator.itemgetter:

from operator import itemgetter

dict1 = {"version": 222, "name_app": "foo1"}
dict2 = {"version": 222, "name_app": "foo1", "dir": "c", "path": "cc"}

g = itemgetter(*dict1)
print(g(dict1) == g(dict2))

打印:

True

编辑:dict1 的所有键必须匹配:

from operator import itemgetter

dict1 = {"version": 222, "name_app": "foo1"}
dict2 = {"version": 222, "name_app": "foo1", "dir": "c", "path": "cc"}

g = itemgetter(*dict1)
print(dict1.keys() <= dict2.keys() and g(dict1) == g(dict2))

打印:

True

EDIT2:如果 dict 有一个列表值:

from operator import itemgetter

dict1 = {"version": 222, "name_app": ["a", "b", "c"]}
dict2 = {"version": 222, "name_app": ["a", "b", "c"], "dir": "c", "path": "cc"}

g = itemgetter(*dict1)
print(dict1.keys() <= dict2.keys() and g(dict1) == g(dict2))

打印:

True

【讨论】:

  • 还更新了dict1的所有键都必须匹配的问题
  • 谢谢,但现在我有另一个问题,因为它不在这个问题中
  • @user63898 我的答案适用于作为列表的值。见编辑2。
  • 是的,我明白了,给你当前的答案,谢谢!
  • 有什么办法让dict2的值小写吗?
【解决方案3】:

你可以这样做

dict1 = {'version': 222,'name_app': 'foo1'}
dict2 = {'version': 222,'name_app': 'for','dir': 'c','path': 'cc'}
common=set(dict1.items())-set(dict2.items())
print(list(common)!=[])

【讨论】:

  • 还更新了 dict1 的所有键必须在您的示例中匹配的问题,即使 1 个键匹配返回 true
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 2021-11-02
  • 2017-09-08
  • 1970-01-01
相关资源
最近更新 更多