[英]Python modify dictionary recursively
我有一個Python AST解析器,可將1==1 or 2==2 or 3==3
類的表達式轉換成該字典:
{ 'args': [ {'args': [{'value': 1}, {'value': 1}], 'function': '=='},
{'args': [{'value': 2}, {'value': 2}], 'function': '=='},
{'args': [{'value': 3}, {'value': 3}], 'function': '=='}],
'function': 'or'}
然后將其轉換為JSON並發布到API端點,但是API僅理解二進制or
操作。 因此,上面粘貼的字典需要轉換(嵌套)為以下內容:
{ 'args': [ { 'args': [ { 'args': [{'value': 1}, {'value': 1}],
'function': '=='},
{ 'args': [{'value': 2}, {'value': 2}],
'function': '=='}],
'function': 'or'},
{'args': [{'value': 3}, {'value': 3}], 'function': '=='}],
'function': 'or'}
無法通過Python AST進行此操作,因為BoolOp
具有3個元素,因此我認為最好以遞歸方式進行。 但是,我無法以可視化的方式來實現以遞歸方式迭代字典的方法。
編輯:
字典可以像下面這樣深層嵌套:
{ 'args': [ {'args': [{'value': 1}, {'value': 1}], 'function': '=='},
{'args': [{'value': 2}, {'value': 2}], 'function': '=='},
{ 'args': [ { 'args': [{'value': 3}, {'value': 3}],
'function': '=='},
{ 'args': [{'value': 4}, {'value': 4}],
'function': '=='},
{ 'args': [{'value': 5}, {'value': 5}],
'function': '=='}],
'function': 'or'}],
'function': 'and'}
您可以執行以下操作:
def _nest_ors(args):
assert len(args) >= 2
if len(args) == 2:
return {
'function': 'or',
'args': args
}
return {
'function': 'or',
'args': [args[0], _nest_ors(args[1:])]
}
def fix_ors(ast):
assert ast['function'] == 'or'
return _nest_ors(ast['args'])
expression = {'args': [{'args': [{'value': 1}, {'value': 1}], 'function': '=='},
{'args': [{'value': 2}, {'value': 2}], 'function': '=='},
{'args': [{'value': 3}, {'value': 3}], 'function': '=='}],
'function': 'or'}
print(fix_ors(expression))
如果您有非常大的表達式,則必須用迭代解決方案替換遞歸。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.