我希望将x
字典(actual
)的列表与y
字典(expected
)的列表进行比较,其中x> y。为确保expected
列表完全存在于actual
列表中,某些键的值除外。这些可忽略的键是事先已知的。
所以我知道我可以遍历expected
列表并检查expected
列表中的每个元素是否存在于actual
列表中。但是,actual
列表中有某些键是我关心的,但不是值。我希望能够做到这一点而不必更改任何列表。
例如,在这里我关心密钥person
是否存在于actual
字典中-但是我并不在乎它的值。尽管我确实关心time
和place
的键和值,但它们在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
答案 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