Python递归地修改字典

时间:2016-10-24 18:25:27

标签: python dictionary recursion

我有一个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'}

由于BoolOp有3个元素,因此无法从Python AST执行此操作,因此我认为最好以递归方式执行此操作。但是,我无法以正确的方式实现以递归方式迭代字典。

编辑:

字典可以深深嵌套,如:

{ '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'}

1 个答案:

答案 0 :(得分:2)

你可以这样做:

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))

如果你有非常庞大的表达式,你将不得不用迭代解决方案替换递归。