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

先准备一些数据,为了方便演示,我这里就用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个月没发文章(笑哭)

回复

  • 最新随笔

  • (°ー°〃) (°ー°〃) 看你睡得那么香就不赶你了,整个抬走,换把椅子ㄟ(▔ ,▔)ㄏ
  • 还有这个移动端之前的随笔显示效果图片做对比,现在这样就更方便阅读一些
  • 找了点时间,重新调整了一下随笔的页面,这样看就顺眼多了,附上一张以前的随笔页图片。
  • 对于自己暂时没有能力改变的事情,屏蔽相关信息是保持平常心的方法之一,毕竟人的精力和注意力是有限的,投入眼前的事情反倒能在这个浮躁的世界收获一些自己的东西。专注脚下,偶尔抬头。
  • 这个随笔的页面找时间得改一改,阅读体验不太好......
  • 对于一些娱乐片段或者碎片化阅读的记忆,别穷思竭虑般地唤起回忆,想变得清晰,不能马上想起就放弃。毕竟在信息时代每天接受的信息量级巨大,若想大脑都填满这些碎片化的信息也是天方夜谭,而且在无法想起时也不建议有苦恼的情绪(如:我是不是有健忘症?是不是越来越严重了?之类的),因为频繁给自己这类心理暗示真的很有可能会往相关趋势发展。另外对于一些系统性学习的知识也建议保持类似的态度,因为除了一些频繁使用的知识,人脑真的记忆不过来那么多东西,在想不起时依靠记忆中相关的知识索引在世界中找到对应的内容即可。
  • 发现一个有趣现象,看了看发的文章,我用“我们”比用“我”更频繁,这是为啥。(随便一提,这是2022年第一条随笔,(笑哭))
  • 对我来说,写东西很好的一点是,自己写的东西,后面基本都会再看,一遍或者很多遍。这样就可以很好地发现自己之前的漏洞,并看看现在有什么变化。