如何用python查找出有一个包含关系表的父节点id,并导入数据库的表,关系参考省市区关系

会飞的小罐子 2017-10-08 11:12:43
原始表某个字段有一个包含关系, 比如说包含关系a-b-c-d, 那么b的父节点就是a, c的父节点就是b, 如果以下有个包含关系a-b-e-f 那么e的父节点是b f的父节点是e;我现在已经给a b c d e f 以一个自增字段来编号了 编了对应的 1 2 3 4 5 6, 那么c的父节点是b 也就是c的父节点编号是2;我现在遇到的难题是如何通过遍历来找c的前一个节点b 也就是他的父节点
...全文
739 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
碧水幽幽泉 2017-10-16
  • 打赏
  • 举报
回复
1.Oracle版块的结帖率非常低。
平时工作空闲时间比较多,闲暇时也回了不少帖(2000以上),但是结帖率非常低,大概只有15%左右。
发现大多数是小号发帖,然后问题解决了,也大多不结贴了。
这样做,极大地影响坛友回答问题的热情。希望管理员管管。希望管理员管管。

2.关于“不满意结贴”问题
CSDN之前也发过一些文章提到这个问题:不建议"不满意结贴",至少不能滥用这种结贴功能。这样于人与己都不太好。
最近一个典型的例子:连续3个帖子全部是"不满意结贴"
http://bbs.csdn.net/topics/392272871
http://bbs.csdn.net/topics/392272046
http://bbs.csdn.net/topics/392272985
明明都解决了,或者至少说明了问题的原因,但是全部是"不满意结贴"。
遇到这种情况,以后我都不会回他的帖了。

说句题外话,申请Oracle小版块版主,1个多月了,还在审核中。。。
会飞的小罐子 2017-10-12
  • 打赏
  • 举报
回复
引用 2 楼 混沌鳄鱼的回复:
你这个问题本质上是个单向链表遍历问题,其实算法非常简单。 解决方法很多,我大概略的写了个供你参考。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 在数据库中建数据表,并插入样例数据
import sqlite3
con = sqlite3.connect(":memory:") # 使用:memory:标识打开的是内存数据库
cur = con.cursor()
cur.execute('CREATE TABLE assets(id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, parent_id INT NOT NULL);')
DATA = [(1, '电工产品', 0),
        (2, '电力A', 1),
        (3, '电力B', 2),
        (4, '电力C', 3),
        (5, '电力D', 2),
        (6, '电力E', 5),
        (7, '电力F', 3)]
cur.executemany('INSERT INTO assets(id, name, parent_id) VALUES(?,?,?);', DATA)

# 定义数据结构
from collections import namedtuple
Node = namedtuple('Node', 'id, name, parent_id')    # 单个结点
assets = {}     # 存放所有结点

# 从数据库表中加载数据到数据结构中
rows = cur.execute('SELECT id, name, parent_id FROM assets;')
for row in rows:
    print(row)
    assets[row[0]] = Node(*row)

cur.close()
con.close()


def traversal(assets, id):
    # 用递归的方法遍历结点
    if assets[id].parent_id == 0:
        return [assets[id]]
    else:
        return traversal(assets, assets[id].parent_id) + [assets[id]]

from operator import attrgetter
for node_id in (4,6,7):
    result = traversal(assets, node_id)
    print('/'.join(map(attrgetter('name'), result)), *map(attrgetter('id'), result))


(1, '电工产品', 0) (2, '电力A', 1) (3, '电力B', 2) (4, '电力C', 3) (5, '电力D', 2) (6, '电力E', 5) (7, '电力F', 3) 电工产品/电力A/电力B/电力C 1 2 3 4 电工产品/电力A/电力D/电力E 1 2 5 6 电工产品/电力A/电力B/电力F 1 2 3 7
非常感谢,后来我自己也写了一个遍历树的算法。感觉思想差不多,但是还是有点诧异,我这几天好好研读你的代码,然后再与你讨论。再次感谢!
会飞的小罐子 2017-10-11
  • 打赏
  • 举报
回复
非常感谢,后来我自己也写了一个遍历树的算法。感觉思想差不多,但是还是有点诧异,我这几天好好研读你的代码,然后再与你讨论。再次感谢!
混沌鳄鱼 2017-10-08
  • 打赏
  • 举报
回复
你这个问题本质上是个单向链表遍历问题,其实算法非常简单。 解决方法很多,我大概略的写了个供你参考。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 在数据库中建数据表,并插入样例数据
import sqlite3
con = sqlite3.connect(":memory:") # 使用:memory:标识打开的是内存数据库
cur = con.cursor()
cur.execute('CREATE TABLE assets(id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, parent_id INT NOT NULL);')
DATA = [(1, '电工产品', 0),
        (2, '电力A', 1),
        (3, '电力B', 2),
        (4, '电力C', 3),
        (5, '电力D', 2),
        (6, '电力E', 5),
        (7, '电力F', 3)]
cur.executemany('INSERT INTO assets(id, name, parent_id) VALUES(?,?,?);', DATA)

# 定义数据结构
from collections import namedtuple
Node = namedtuple('Node', 'id, name, parent_id')    # 单个结点
assets = {}     # 存放所有结点

# 从数据库表中加载数据到数据结构中
rows = cur.execute('SELECT id, name, parent_id FROM assets;')
for row in rows:
    print(row)
    assets[row[0]] = Node(*row)

cur.close()
con.close()


def traversal(assets, id):
    # 用递归的方法遍历结点
    if assets[id].parent_id == 0:
        return [assets[id]]
    else:
        return traversal(assets, assets[id].parent_id) + [assets[id]]

from operator import attrgetter
for node_id in (4,6,7):
    result = traversal(assets, node_id)
    print('/'.join(map(attrgetter('name'), result)), *map(attrgetter('id'), result))


(1, '电工产品', 0) (2, '电力A', 1) (3, '电力B', 2) (4, '电力C', 3) (5, '电力D', 2) (6, '电力E', 5) (7, '电力F', 3) 电工产品/电力A/电力B/电力C 1 2 3 4 电工产品/电力A/电力D/电力E 1 2 5 6 电工产品/电力A/电力B/电力F 1 2 3 7
tianfang 2017-10-08
  • 打赏
  • 举报
回复
增加一个pid字段,指向父节点

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧