昨天在想如何将树形结构数据,即一层层、有父级子级关系的数据打印出来,而且还能表示层级关系。刚才想了想,感觉用递归比较合适,稍微琢磨了一下发现可行,下面就分享一下这个想法。

先准备一些数据,为了方便演示,我这里就用dict和list的组合来表示数据,另外我们规定每一行的索引即代表该行的id,比如第一行的数据,它的id就是0,第二行就是1,以此类推。

其中的parentid即其父级的id,如果为-1即表示没有父级,为顶级。

data=[{'parentid':-1,'name':'中国'},#id=0
      {'parentid':-1,'name':'美国'},#id=1
      {'parentid':0,'name':'广东省'},#id=2
      {'parentid':0,'name':'广西省'},#id=3
      {'parentid':1,'name':'阿拉斯加州'},
      {'parentid':1,'name':'加利福尼亚州'},
      {'parentid':2,'name':'深圳市'},
      {'parentid':2,'name':'广州市'},
      {'parentid':6,'name':'龙岗区'},
      {'parentid':6,'name':'福田区'},
      {'parentid':6,'name':'龙华区'},
      {'parentid':8,'name':'翻斗街道'},
      {'parentid':8,'name':'胡图街道'},
      {'parentid':8,'name':'英俊街道'}]

然后我们写一个根据id获得该行所有子数据的方法

def getChildren(data,id):
    children=[]
    for l in data:
        if l['parentid']==id:
            children.append(l)
    return children

接下来写一个递归打印子数据的方法,遍历打印出所有子元素,并根据层级在前面加多少倍的空格。这也是这个程序中比较关键的一部分。

def rollChildren(data,id,stair=0):
    children=getChildren(data,id)
    for c in children:
        print(stair*'   '+'├ '+c['name'])
        cid=data.index(c)
        rollChildren(data,cid,stair+1)

最后再写一个总的打印方法,它会先打印出顶级栏目,然后再调用rollChildren()按照层级打印出所有子数据。

def showTree(data):
    for l in data:
        if l['parentid']==-1:
            print(l['name'])
            pid=data.index(l)
            rollChildren(data,pid)

下面我们来测试一下

可以发现这个程序可以正确地将树形数据按层级打印出来啦。

其他

在许多web项目上,这个功能应用还是很多的,比如网站多级目录的展示等等,稍微改改就可以应用到数据库和html上了。

评论

Felix 管理员

又差不多3个月没发文章(笑哭)

回复

  • 最新随笔

  • 对我来说,写东西很好的一点是,自己写的东西,后面基本都会再看,一遍或者很多遍。这样就可以很好地发现自己之前的漏洞,并看看现在有什么变化。
  • 前段时间应该是百度更新了页面结构,那个黑帽泛目录网站我也没有去更新代码,就导致了文章页没有相关推荐,没想到这时候谷歌开始收录了,而且效果还不错。其实之前在谷歌一直不收录的时候就有怀疑过没有尽头的相关推荐很可能是导致不收录的原因,不过也一直没有去管它,而这次误打误撞的收录也恰恰证实了这个想法。(btw,其实这个网站从出现固定链接开始叫泛目录应该不太准确)
  • 最近吉他谱网站iloveguitar上线了,这几天在填充一些内容花了一些时间,这个网站也是使用flask作为后端框架的,前端UI框架使用的是bootstrap4,喜欢吉他的小伙伴欢迎来这里逛一逛哟,有什么建议欢迎在留言板提一下哟。
  • 那个泛目录网站发布了几个星期了,百度没怎么来爬,收了一个首页,谷歌直接就不收了,倒是一个查外链的网站天天来爬(笑哭),还有建议一点就是泛目录还是用在有建站历史的域名比较好(因为已经过了审核期),新域名就尽量不要用了。
  • 刚刚又发了一篇,最近文章百度都不太收录,orz,哈哈
  • 之前那个用python做的静态资源服务器,我又发现了一大用处,现在我都用来在局域网里的不同电脑之间传输文件,真的好用哈哈
  • 今天交换到了博客有史以来第一条友情链接
  • 刚刚更新了一下博客,修复了一些bug,添加了一个项目页