我想了解如何在不改變方法引數的情況下遞回地重命名字典串列中的鍵。
我有以下字典串列:
filters = [
{
'or': [
{
'and': [
{
"column": {
"type": "string",
"name": "field_name"
},
"operator": "==",
"value": "field_value"
},
{
"column": {
"type": "string",
"name": "field_2_name"
},
"operator": "!=",
"value": "field_2_value"
}
]
},
{
'not': [
{
"column": {
"type": "number",
"name": "field_3_name"
},
"operator": "==",
"value": "field_3_value"
}
]
}
]
}]
這是我期望實作的目標:
filters = [
{
'or': [
{
'and': [
{'field': 'field_name', 'op': '==', 'value': 'field_value'},
{'field': 'field_2_name', 'op': '!=', 'value': 'field_2_value'},
]
},
{
'not': [
{'field': 'field_3_name', 'op': '==', 'value': 'field_3_value'}
]
},
],
}
]
有什么辦法可以解決這個問題嗎?
謝謝!
uj5u.com熱心網友回復:
遞回函式應該可以作業,如果子字典包含column
,則更改子字典,否則為其他操作更深入地遞回。
def change(collection):
if isinstance(collection, list):
return [change(d) for d in collection]
if isinstance(collection, dict):
if "column" in collection:
return {
"field": collection["column"]["name"],
"value": collection["value"],
"op": collection["operator"]
}
else:
return {op: change(val) for op, val in collection.items()}
res = change(filters)
結果:
[{'or': [{'and': [{'field': 'field_name', 'op': '==', 'value': 'field_value'},
{'field': 'field_2_name', 'op': '!=', 'value': 'field_2_value'}]},
{'not': [{'field': 'field_3_name', 'op': '==', 'value': 'field_3_value'}]}]}]
uj5u.com熱心網友回復:
很簡單,您撰寫了一個遞回函式來修復您的資料結構。我假設你不想改變原來的。
def fixup(d):
if isinstance(d,list):
return [fixup(x) for x in d]
elif not isinstance(d,dict):
return d
elif needs_mangling(d):
return mangler(d)
else:
return {k:fixup(v) for k,v in d.items()}
根據需要添加重整功能。
uj5u.com熱心網友回復:
這是否滿足您的場景?
def change(obj):
# if recusive parameter is a list
if isinstance(obj, list):
# run next recursive iteration for each item in list
for i in range(len(obj)):
obj[i] = change(obj[i])
return obj
# if parameter is a dict
if isinstance(obj, dict):
# 1st case is to convert the object
if "operator" in obj:
return {"field": obj["column"]["name"], "op": obj["operator"], "value": obj["value"]}
# 2nd case is to go deeper into recursion with object values
else:
for key in obj:
obj[key] = change(obj[key])
return obj
print(change(filters))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/382222.html
上一篇:優化:洗掉串列串列之間的差異
下一篇:在python中讀取文本的元素