递归总是更新字典。

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

如何从递归中获取中间结果。
考虑以下输入:
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}]

如果键是重复的,则应更新为 'f_new' 等内容。谢谢!

@Ch3steR,是的。我不再想把“c”作为键了。 - dumb_coder
你的 list_ 长什么样子? - Ch3steR
@Ch3steR,输入是一个字典数组,而在字典中可能会有值作为数组。 - dumb_coder
1
@blhsing,我已经编辑了代码。 - dumb_coder
如果你对于解构非规范字典的代码有信心,那么你可以简单地返回一个新的字典,其中包含你想要的输出,并保留你所有当前的逻辑。而不是修改现有的字典。 - Yunhai
显示剩余3条评论
1个回答

4
您可以遍历字典项,如果一个项是列表,则递归地展开其中的字典:
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),))}

因此,假设:

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

[f(d) for d in lst] 会返回:

[{'a': 'a', 'b': 'b', 'd': 'd', 'e': 'e', 'g': 'g'}]

并且假定给定以下内容:
lst = [{'a': 'a', 'b': 'b', 'c': {'d': 'd', 'e': {'f': 'f', 'g': 'g'}}}]

[f(d) for d in lst] 会返回:

[{'a': 'a', 'b': 'b', 'd': 'd', 'f': 'f', 'g': 'g'}]

为避免合并键时发生冲突,在复制的键后附加_new,直到找到不存在的键为止。此时,您无法使用推导式。
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 = [{'a': 'a', 'b': 'b', 'c': {'d': 'd', 'e': [{'f': 'f', 'g': 'g'}, {'f': 'f1', 'g': 'g1'}]}}]

[f(d) for d in lst]会返回:

[{'a': 'a', 'b': 'b', 'd': 'd', 'f': 'f', 'g': 'g', 'f_new': 'f1', 'g_new': 'g1'}]

演示:https://repl.it/@blhsing/NonstopSeveralActionscript


1
我对这两个解决方案进行了计时,你的比我的快得多。这很有道理,因为我每次都要构建一个新字典,而你的方法只需要+1操作并删除我的解决方案。 - Ch3steR
1
我明白了。那么我已经相应地更新了我的答案。如果您发现它是正确的,您可以将此答案标记为已接受吗? - blhsing
1
@blhsing。你救了我好几个小时!! - dumb_coder
1
@DevanshuKhokhani 我已经相应地更新了答案。 - blhsing
1
@blhsing。这解决了所有问题。非常感谢!!! - dumb_coder
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接