簡體   English   中英

Python遞歸修改字典

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

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