[英]check validity of a subset of values between dictionaries
我希望將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
密鑰的存在,同時排除其值的存在呢? 什么是最pythonic的方式做到這一點?
編輯:
有沒有比這更好的方法:
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
我想我了解您的主要目標,那就是提取兩個列表中的通用字典。 因此,使用簡單的腳本來實現這一點,我向您提出以下解決方案:
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"}'}
我希望這會有所不同。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.