簡體   English   中英

檢查字典之間的值子集的有效性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM