繁体   English   中英

嵌套字典算法

[英]Nesting dictionary algorithm

假设我有以下字典:

{'a': 0, 'b': 1, 'c': 2, 'c.1': 3, 'd': 4, 'd.1': 5, 'd.1.2': 6}

我希望编写一个输出以下内容的算法:

{
    "a": 0,
    "b": 1,
    "c": {
        "c": 2,
        "c.1": 3
    },
    "d":{
        "d": 4,
        "d.1": {
            "d.1": 5,
            "d.1.2": 6
        }
    }
}

注意名称在字典中是如何重复的。 并且有些具有可变的嵌套级别(例如"d" )。

我想知道您将如何 go 这样做,或者是否有为此的 python 库? 我知道你必须对这样的事情使用递归,但我的递归技能很差。 任何想法将不胜感激。

您可以为此使用递归 function 或仅使用循环。 如果必须在其下方添加更多子节点,则棘手的部分是将现有值包装到字典中。

def nested(d):
    res = {}
    for key, val in d.items():
        t = res
        # descend deeper into the nested dict
        for x in [key[:i] for i, c in enumerate(key) if c == "."]:
            if x in t and not isinstance(t[x], dict):
                # wrap leaf value into another dict
                t[x] = {x: t[x]}
            t = t.setdefault(x, {})
        # add actual key to nested dict
        if key in t:
            # already exists, go one level deeper
            t[key][key] = val
        else:
            t[key] = val
    return res

你的例子:

d = {'a': 0, 'b': 1, 'c': 2, 'c.1': 3, 'd': 4, 'd.1': 5, 'd.1.2': 6}
print(nested(d))
# {'a': 0,
#  'b': 1,
#  'c': {'c': 2, 'c.1': 3},
#  'd': {'d': 4, 'd.1': {'d.1': 5, 'd.1.2': 6}}}

嵌套字典算法...
您将如何 go 这样做,

  • 对字典项进行排序
  • 按键的索引 0 对结果进行分组(元组中的第一项)
  • 遍历组
    • 如果组中有多个项目,则为该组创建一个键并将组项目添加为值。

使用collections.defaultdict的递归方法略短:

from collections import defaultdict
data = {'a': 0, 'b': 1, 'c': 2, 'c.1': 3, 'd': 4, 'd.1': 5, 'd.1.2': 6}
def group(d, p = []):
  _d, r = defaultdict(list), {}
  for n, [a, *b], c in d:
     _d[a].append((n, b, c))
  for a, b in _d.items():
     if (k:=[i for i in b if i[1]]):
        r['.'.join(p+[a])] = {**{i[0]:i[-1] for i in b if not i[1]}, **group(k, p+[a])}
     else:
        r[b[0][0]] = b[0][-1]
  return r
        
 
print(group([(a, a.split('.'), b) for a, b in data.items()]))

Output:

{'a': 0, 'b': 1, 'c': {'c': 2, 'c.1': 3}, 'd': {'d': 4, 'd.1': {'d.1': 5, 'd.1.2': 6}}}
     

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM