为了账号安全,请及时绑定邮箱和手机立即绑定

python 实现一个求解当前数据所有子项的方法

python 实现一个求解当前数据所有子项的方法

函数式编程 2019-02-18 19:52:36
假设数据结构是这样的:有多条数据,每条数据都有属性parent(指向它的所属上级id),自身的唯一标识id。 class data parent id 当我拿出其中一条数据的时候,用一个方法计算出所有下级数据。就好比中国行政区数据一样,当我拿到广东省的时候,下面的市级,县级都要得到,如果县级下面还有分级也要一并拿到。 我写了一些代码,都太丑陋了,似乎是要用递归,求教一下有没有什么好的思路?
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

这个问题可以转换成N叉树的遍历,将某个节点的所有子节点计算出来。

    def return_all_children(self):
        """
        返回所有的子项
        :return:
        """
        root = self
        if not root:
            return []
        que = []  # 保存节点的队列
        res = []  # 保存结果的列表
        que.append(root)  #
        while len(que):  # 判断队列不为空
            length = len(que)
            sub = []  # 保存每层的节点的值
            for i in range(length):
                current = que.pop(0)  # 出队列的当前节点
                print(current)
                sub.append(current)
                for child in current.return_children:  # 所有子结点入队列
                    que.append(child)
            res.append(sub)  # 把每层的节点的值加入结果列表
        return res
查看完整回答
反对 回复 2019-03-01
?
动漫人物

TA贡献1815条经验 获得超10个赞

储存空间够大的话可以建立一个字典
假如你的数据是个list名字叫CN(中国所有省市县...)

parent_d = {}
for item in CN:
    parent = item['parent']
    if parent in parent_d:
        parent_d[parent].append(item['id'])
    else:
        parent_d[parent] = [item['id']]

之后遍历一下

def get_all_children(city_id, parent_d):
    if city_id not in parent_d or not city_id:
        return []
    result = []
    temp_parent = [city_id]
    while temp:
        cur_id = temp_parent.pop(-1)
        result += parent_d[cur_id]
        temp_parent = parent_d[cur_id] + temp_parent
    return result
查看完整回答
反对 回复 2019-03-01
?
精慕HU

TA贡献1845条经验 获得超8个赞

贴一下全一点的例子

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 668 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信