Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 递归总是更新字典_Python_Python 3.x_List_Dictionary_Recursion - Fatal编程技术网

Python 递归总是更新字典

Python 递归总是更新字典,python,python-3.x,list,dictionary,recursion,Python,Python 3.x,List,Dictionary,Recursion,如何从递归中获得中间结果 考虑如下所示的输入: def recursion(input_type): print('input_type ',input_type) if isinstance(input_type, dict): num = 0 for k,v in input_type.items(): if isinstance(v, dict): print('from recursi

如何从递归中获得中间结果

考虑如下所示的输入:

def recursion(input_type):
    print('input_type ',input_type)
    if isinstance(input_type, dict):
        num = 0
        for k,v in input_type.items():
            if isinstance(v, dict):
                print('from recursion')
                recursion(v)
            elif isinstance(v, list):
                for j in v:
                    if isinstance(j, dict):
                        print('from recursion level 2')
                        recursion(j)
            else:
                temp_dict = {k:v}   
                print('type: ',type(temp_dict), k, v)
            print('num',num)
            num = num+1  

for i in list_:
    recursion(i)     
如果密钥是重复的,那么它应该更新,例如“f”到“f_new”或类似的内容


提前谢谢你

您可以迭代dict项,如果项是列表,则递归展平其中的dict:

input: [{'a':a, 'b':b, 'c':[{'d':d, 'e':e}]}]
Updated input: [ {'a':a, 'b':b, 'c': { 'd':d, 'e': [ {'f':f, 'g':g}, {'f':f1, 'g':g1} ] } } ]

desired output: [{'a':a, 'b':b, 'd':d, 'f':f, 'g':g, 'f_new':f1, 'g_new':g1}]
因此,鉴于:

def f(o):
    return {a: b for k, v in o.items() for a, b in ((i for d in (v if isinstance(v, list)
        else (v,)) for i in f(d).items()) if isinstance(v, (list, dict)) else ((k, v),))}
[{'a': 'a', 'b': 'b', 'd': 'd', 'e': 'e', 'g': 'g'}]
def f(o):
    output = {}
    for k, v in o.items():
        for a, b in ((i for d in (v if isinstance(v, list) else (v,)) for i in f(d).items())
                if isinstance(v, (list, dict)) else ((k, v),)):
            while a in output:
                a += '_new'
            output[a] = b
    return output
[lst中d的f(d)]
将返回:

lst = [{'a': 'a', 'b': 'b', 'c': [{'d': 'd', 'e': 'e'}, {'f': [{'g': 'g'}]}]}]
lst = [{'a': 'a', 'b': 'b', 'c': {'d': 'd', 'e': {'f': 'f', 'g': 'g'}}}]
lst = [{'a': 'a', 'b': 'b', 'c': {'d': 'd', 'e': [{'f': 'f', 'g': 'g'}, {'f': 'f1', 'g': 'g1'}]}}]
鉴于:

def f(o):
    return {a: b for k, v in o.items() for a, b in ((i for d in (v if isinstance(v, list)
        else (v,)) for i in f(d).items()) if isinstance(v, (list, dict)) else ((k, v),))}
[{'a': 'a', 'b': 'b', 'd': 'd', 'e': 'e', 'g': 'g'}]
def f(o):
    output = {}
    for k, v in o.items():
        for a, b in ((i for d in (v if isinstance(v, list) else (v,)) for i in f(d).items())
                if isinstance(v, (list, dict)) else ((k, v),)):
            while a in output:
                a += '_new'
            output[a] = b
    return output
[lst中d的f(d)]
将返回:

lst = [{'a': 'a', 'b': 'b', 'c': [{'d': 'd', 'e': 'e'}, {'f': [{'g': 'g'}]}]}]
lst = [{'a': 'a', 'b': 'b', 'c': {'d': 'd', 'e': {'f': 'f', 'g': 'g'}}}]
lst = [{'a': 'a', 'b': 'b', 'c': {'d': 'd', 'e': [{'f': 'f', 'g': 'g'}, {'f': 'f1', 'g': 'g1'}]}}]
要避免合并键中的冲突,请将
\u new
附加到复制键,直到发现它不是预先存在的,在这种情况下,您不能使用:

[{'a': 'a', 'b': 'b', 'd': 'd', 'f': 'f', 'g': 'g'}]
因此,鉴于:

def f(o):
    return {a: b for k, v in o.items() for a, b in ((i for d in (v if isinstance(v, list)
        else (v,)) for i in f(d).items()) if isinstance(v, (list, dict)) else ((k, v),))}
[{'a': 'a', 'b': 'b', 'd': 'd', 'e': 'e', 'g': 'g'}]
def f(o):
    output = {}
    for k, v in o.items():
        for a, b in ((i for d in (v if isinstance(v, list) else (v,)) for i in f(d).items())
                if isinstance(v, (list, dict)) else ((k, v),)):
            while a in output:
                a += '_new'
            output[a] = b
    return output
[lst中d的f(d)]
将返回:

lst = [{'a': 'a', 'b': 'b', 'c': [{'d': 'd', 'e': 'e'}, {'f': [{'g': 'g'}]}]}]
lst = [{'a': 'a', 'b': 'b', 'c': {'d': 'd', 'e': {'f': 'f', 'g': 'g'}}}]
lst = [{'a': 'a', 'b': 'b', 'c': {'d': 'd', 'e': [{'f': 'f', 'g': 'g'}, {'f': 'f1', 'g': 'g1'}]}}]

演示:

我正在迭代列表,但它只是一个for循环。所以函数的输入是字典,我知道它不是一个格式良好的结构。但是,如果要删除键
'c'
及其值,必须以任何方式提取吗?@Ch3steR,是的。我不想用“c”作为键anymore@blhsing,我已经编辑了代码。我对解决方案进行了计时,你的解决方案比我的要快得多。这是有道理的,因为我每次都在构建一个新字典。+1并删除了我的解决方案。我明白了。我已经相应地更新了我的答案。如果你认为这个答案是正确的,你能把它标记为被接受吗?@blhsing。你节省了我的时间@德凡舒霍卡尼我已经相应地更新了答案。@blhsing。这解决了所有问题。非常感谢你!!!