【问题标题】:Recursion always updates the dictionary递归总是更新字典
【发布时间】:2020-06-09 12:29:55
【问题描述】:
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' 到 'f_new' 或类似的东西

提前谢谢你!!

【问题讨论】:

  • 我正在迭代列表,但它只是一个 for 循环。所以函数的输入是字典
  • 我知道这不是一个良好的结构。但无论如何都必须提取
  • 是否应该删除密钥'c'及其值?
  • @Ch3steR,是的。我不想再把“c”作为键了
  • @blhsing,我已经编辑了代码。

标签: python python-3.x list dictionary recursion


【解决方案1】:

您可以遍历 dict 项目,如果项目是列表,则递归展平其中的 dicts:

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 并删除了我的解决方案。
  • 我明白了。我已经相应地更新了我的答案。如果您认为此答案正确,能否将其标记为已接受?
  • @blhsing。你节省了我的时间!!
  • @DevanshuKhokhani 我已经相应地更新了答案。
  • @blhsing。这解决了所有问题。非常感谢!!!
猜你喜欢
  • 2020-06-12
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2012-11-11
  • 1970-01-01
相关资源
最近更新 更多