检查字典之间的值子集的有效性

时间:2019-06-20 21:03:55

标签: python dictionary

我希望将x字典(actual)的列表与y字典(expected)的列表进行比较,其中x> y。为确保expected列表完全存在于actual列表中,某些键的值除外。这些可忽略的键是事先已知的。

所以我知道我可以遍历expected列表并检查expected列表中的每个元素是否存在于actual列表中。但是,actual列表中有某些键是我关心的,但不是值。我希望能够做到这一点而不必更改任何列表。

例如,在这里我关心密钥person是否存在于actual字典中-但是我并不在乎它的值。尽管我确实关心timeplace的键和值,但它们在expected中的确切位置也是如此。目前,我正在执行以下操作:


ignore_val = ['person']

expected = [{'time': '12:34:22', 'place': 'LA', 'person': 'Mike'}, {'time': '11:45:15', 'place': 'SF', 'person': 'Emily'}] 

actual = [{'time': '12:34:22', 'place': 'LA', 'person': 'Mike'}, {'time': '11:45:15', 'place': 'SF', 'person': 'Emily'}, {'time': '21:19:57', 'place': 'LA', 'person': 'Leo'}, {'time': '15:43:11', 'place': 'LA', 'person': 'Marge'}] 

for exp in expected:
    if exp.items() not in [act.items() for act in actual]:
        return False
return True

但是,我该如何处理person键的存在,同时又排除它的值的存在,而不必仅使用我关心的“项目”来创建新的数据结构?最Python的方法是什么?

编辑:

有没有比这更好的方法了?


keys = [act.keys() for act in actual]
vals = [{k:v for k, v in act.items() if k not in ignore_val} for act in actual]

for exp in expected:
    if exp.keys() not in keys:
        return False
    if {k:v for k, v in exp.items() if k not in ignore_val} not in vals:
        return False

return True

2 个答案:

答案 0 :(得分:0)

我认为我了解您的主要目标,那就是在两个列表中都提取通用词典。因此,使用简单的脚本可以做到这一点,我向您提出以下解决方案:

import json

def set_dict(mydict):
    return set([json.dumps(d) for d in mydict])

此简单函数用于转换set()对象中的词典列表。这很酷,因为在那之后您可以执行以下操作:

expected = [{'time': '12:34:22', 'place': 'LA', 'person': 'Mike'}, {'time': '11:45:15', 'place': 'SF', 'person': 'Emily'}] 
actual = [{'time': '12:34:22', 'place': 'LA', 'person': 'Mike'}, {'time': '11:45:15', 'place': 'SF', 'person': 'Emily'}, {'time': '21:19:57', 'place': 'LA', 'person': 'Leo'}, {'time': '15:43:11', 'place': 'LA', 'person': 'Marge'}] 

expected = set_dict(expected)
actual = set_dict(actual)

最后:

actual & expected

并获取:

{'{"place": "LA", "time": "12:34:22", "person": "Mike"}',
 '{"place": "SF", "time": "11:45:15", "person": "Emily"}'}

如果您想要外层,可以这样做:

actual - expected

获得:

{'{"place": "LA", "time": "15:43:11", "person": "Marge"}',
 '{"place": "LA", "time": "21:19:57", "person": "Leo"}'}

答案 1 :(得分:0)

我希望这会有所不同。

for k, val in expected.iteritems():
    if k not in ignore_values and (k not in act or act[k] != val):
        return False
return True
相关问题