Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.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 - Fatal编程技术网

Python如何从实体关系结构派生完整的层次结构

Python如何从实体关系结构派生完整的层次结构,python,Python,我有一个字典,其中包含几个表的实体关系,我需要一个包含完整的节点层次结构的列表 { 'a': { 'b': ['key11', 'key21'], 'c': ['key12', 'key22'] }, 'b': { 'd': ['key13', 'key23'], 'e': ['key14', 'key24'] }, 'c': { 'f': ['key15', 'key25'] } } 在哪里- a、 b、c、d、e、f是表名

我有一个字典,其中包含几个表的实体关系,我需要一个包含完整的节点层次结构的列表

{
  'a': {
    'b': ['key11', 'key21'],
    'c': ['key12', 'key22']
  },
  'b': {
    'd': ['key13', 'key23'],
    'e': ['key14', 'key24']
  },
  'c': {
    'f': ['key15', 'key25']
  }
}
在哪里-

  • a、 b、c、d、e、f是表名
  • a是父表,b和c是子表,相应的列表定义了两个表连接的键。e、 g.表a的键11与表b的键21相关
  • 类似地,d和e是表b的子表,依此类推
我需要将所有节点从根节点连接到叶节点,以形成一个完整的层次结构,如下所示:

[
  ['a', 'b', 'd']
  ['a', 'b', 'e']
  ['a', 'c', 'f']
]
我的解决方案是半生不熟的,我不知道如何继续下去

def connect_by_root(ele: str, er_data: dict, _tree: list = []) -> list:
    """
    Identify dependent tables using recursion
    """

    if ele in er_data:
        if not _tree:
            _tree.append(ele)
        for k in er_data[ele].keys():
            _tree.append(k)
            return connect_by_root(k, er_data, _tree)
    else:
        return _tree
        
tree = connect_by_root('a', d, [])

不是一个优雅的,但它的作品,可以应用于任何级别的嵌套

def connect_by_root(ele: str, er_data: dict, lst: list = [], _tree=[], root=None) -> list:
    """
    Identify dependent tables using recursion
    """

    if root == None:    
        root = ele

    if ele in er_data:
        if not ele in lst:
            lst.append(ele)
        for k in er_data[ele].keys():
            lst.append(k)
            connect_by_root(k, er_data, lst, _tree, root)
            if not isinstance(er_data[ele][k], dict):
                if not lst in _tree:
                    if not root in lst:
                        lst.insert(0, root)
                    _tree.append(lst)
                    lst = [ele]
                else:
                    lst = [ele]

    return(_tree)


my_dict = {
          'a': {
            'b': ['key11', 'key21'],
            'c': ['key12', 'key22']
          },
          'b': {
            'd': ['key13', 'key23'],
            'e': ['key14', 'key24']
          },
          'c': {
            'f': ['key15', 'key25']
          },
          'f': {
            'h': ['key16', 'key26']
          }
        }


tree = connect_by_root('a', my_dict, [], [])

print(tree)
结果:

[['a', 'b', 'd'], ['a', 'b', 'e'], ['a', 'c', 'f', 'h']]

这样就可以了。谢谢:)