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

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

回复

  • 最新随笔

  • 尝试让DALLE生成一些连续的精灵图,让gpt帮忙生成一些提示词,如果能稳定输出的话就很强大了。
    让gpt帮忙生成的DALLE提示词
    "Generate a pixel art sprite sheet of a character walking in four directions (north, south, east, west) in a retro video game style."
    "Create a series of pixel art frames showing a character performing different actions like walking, running, jumping, and attacking in a classic 2D game aesthetic."
  • 路过别人山庄的门口,被一条大黑狗边叫边追过来,幸好骑电动车,不然还不一定跑得过,哈哈哈哈哈哈哈哈哈哈。
  • 最近两周也没咋出去玩,主要也是觉得没啥好玩的(笑哭)。看完布莱恩阿瑟的《复杂经济学》后,里面那个酒吧问题勾起我的兴趣,最近空了就花了些时间实现个python版本,顺便搞了篇博文,很享受这种新知识能和已有知识碰撞的感觉。(配张前段时间拍的图片,梧桐山门口前面那条路,挺漂亮的)
  • 盐田港夜景
  • 为啥这猫总喜欢喝杯子里的水
  • 确实开始冷了,在树林里至少要比人类聚集区低个几度,进出入口就能很明显感觉到。看看深圳水库的风景,貌似后面的视野更开阔。
  • 给随笔加了多图的功能,传一传周末拍的风景图,漫无目的的逛也挺好玩的。
  • 逻辑自洽是一套体系的根基,最根本的因素,最吸引人的地方