python - 如何从邻接列表递归生成父子字符串列表?

标签 python recursion adjacency-list

摘要:

我正在尝试创建一个递归函数,从邻接列表中获取数据并将其转换为点表示法。

详细信息:

我将此数据作为元组列表(Python)。数据按id排序,但这是唯一的限制。没有限制父级必须列在子级之前:例如,项目 #3 的父级可以是项目 #7。代数也没有(计划的)限制。

id     name     parent  |  data = [
1      A        0       |          (1, 'A', 0),
2      B        1       |          (2, 'B', 1),
3      C        1       |          ...
4      D        2       |
5      E        2       |
6      F        3       |
7      G        2       |
8      H        6       |          ...
9      I        4       |          (9, 'I', 4)]

我想返回父子点表示法的字符串列表:

A
A.B
A.B.D
A.B.D.I
A.B.E
A.B.G
A.C
A.C.F
A.C.F.H

请注意,每个名称都会显示 - 我发现的其他算法只会返回没有子项的项目。

我尝试过的事情:

Python 代码:

这是我到目前为止所得到的,基于 USF 的数据结构可视化 here .

if len(cat_list) == 0:
    return

for item in cat_list:
    parent_id = item[0]
    name = item[1]
    children = [_x for _x in cat_list if _x[2] == parent_id]

    if len(children) == 0:
        # then we're at the end
        return name
    else:
        sub_problem = cat_list[1:]
        sub_solution = create_categories(sub_problem)
        solution = "{}.{}".format(name, sub_solution)
        print(solution)
        return solution

但是这一切所做的只是获取一个项目并将其一路构建回来:

D.E
C.D.E
B.C.D.E
A.B.C.D.E

SQL:

如果数据存储在 SQLite 数据库中,并且可以使用以下 SQL 获取部分数据:

SELECT
    t1.name AS level1,
    t2.name as level2,
    t3.name as level3,
    t4.name as level4
FROM category AS t1
    LEFT JOIN category AS t2 ON t2.parent = t1.id
    LEFT JOIN category AS t3 ON t3.parent = t2.id
    LEFT JOIN category AS t4 ON t4.parent = t3.id
WHERE t1.name = 'A'

但这有多个问题:

  1. 无法扩展到任意深度
  2. 不返回中间深度

由于这些限制,我决定用 Python 实现代码。

研究

我查看了很多不同的问题和网站,但没有一个给我“ Eureka ”时刻,因此我在这里问。

This question非常相似,但在 vb.net 中,我对此一无所知。它也没有告诉我如何执行串联。

This question也很相似,但我又不懂语言。看起来 Lookup 函数可能与 python 字典非常相似...

最佳答案

数据准备步骤有点可怕,因为您的 ID 是从 1 开始的,我们需要在位置 0 处有一个阻止元素 None:

original = [(1, 'A', 0),
            (2, 'B', 1),
            (3, 'C', 1),
            (4, 'D', 2),
            (5, 'E', 2),
            (6, 'F', 3),
            (7, 'G', 2),
            (8, 'H', 6),
            (9, 'I', 4)]
ids,data,parents = zip(*original)
data =[None]+list(data)
parents = [None]+list(parents)

一旦您获得正确格式的输入数据,此代码就会起作用:

ids = range(1,10)
parents = [None,0,1,1,2,2,3,2,6,4]
data =[None,"A","B","C","D","E","F","G","H","I"]

def get_parents(node):
    if not parents[node]:
        return data[node]
    return get_parents(parents[node])+data[node]
for id in ids:
    print ".".join(list(get_parents(id)))
>>> 
A
A.B
A.C
A.B.D
A.B.E
A.C.F
A.B.G
A.C.F.H
A.B.D.I

关于python - 如何从邻接列表递归生成父子字符串列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30606084/

相关文章:

Python模拟504网关超时错误

flutter - 如何创建递归函数来查找相关元素

c++ - 使用递归的 Text Twist 游戏

c++ - 递归传递动态变量的内存泄漏

mysql - 如何从数据库中提取孙子

python - 条件执行,无需重复检查条件

python - 如何从文本匹配组中排除某些字符?

python - Pywinauto - 双击的替代品

python - 在 Python 中使用邻接表构建节点图

java - 按子数组的长度对数组进行排序