我希望能够遍历一个字典(其中包含许多字符串、字典和字典列表),并将其与另一个字典进行比较。
这里是一个例子:
data = {
"topic": "Seniors' Health Care Freedom Act of 2007",
"foo": "bar",
"last_update": "2011-08-29T20:47:44Z",
"organisations": [
{
"organization_id": "22973",
"name": "National Health Federation",
"bar": "baz"
},
{
"organization_id": "27059",
"name": "A Christian Perspective on Health Issues"
},
]}
validate = {
"topic": None,
"last_update": "next_update",
"organisations": [
{
"organization_id": None,
"name": None
}
]
}
基本上,如果项目在“数据”中存在,但当前点的“验证”中不存在,那么应将其从数据中删除。
因此,在这种情况下,我希望从数据字典中删除data ["foo"]和data ["organisations"] [x] ["bar"]。
此外,如果验证中的键具有字符串值并且不是“None”,则我希望将数据中的键名称更新为它,即“last_update”应更改为“next_update”。
我不确定在Python中如何有效地实现这一点,我的当前版本可以删除“foo”,但我正在尝试删除类似organizations[x][bar]的嵌套键。
这是我的当前尝试:
def func1(data, validate, parent = None):
for k, v in sorted(data.items()):
if not parent:
if k not in validate:
data.pop(k, None)
if isinstance(v, dict):
func1(v, validate)
elif isinstance(v, list):
for val in v:
func1(val, validate, parent = k)
func1(data, validate)
我曾试着使用类似这样的方法来比较键,但是发现如果数据有额外的键(似乎会删除错误的键),就不起作用了,因为字典是无序的,所以对我没有帮助:
for (k, v), (k2, v2) in zip(sorted(data.items()), sorted(validate.items())):
我读过类似的帖子,例如如何递归地从多维(深度未知)python字典中删除某些键?,但这似乎使用了一个扁平集合进行过滤,因此它没有考虑到键位于字典中的位置,这对我很重要 - 因为“last_update”可能出现在其他列表中,我需要保留它。
data[key]
是否是字典或列表;更安全的做法是还要检查validate[key]
是否相应地为字典或键。 - Stef