python 数据结构转换,将线性元祖转换成字典树

有一个数据表
idfidtitle
1-1python
2-1ruby
3-1php
4-1lisp
51flask
61django
71webpy
82rails
93zend
106dblog
这是一个栏目表,title是栏目名称,id是栏目id,fid是栏目的父id.构建一个多级栏目分类
通过python查询处理,会得到下面的一个元祖,
t=(
(1,-1,'python'),
(2,-1,'ruby'),
(3,-1,'php'),
(4,-1,'lisp'),
(5,1,'flask'),
(6,1,'django'),
(7,1,'webpy'),
(8,2,'rails'),
(9,3,'zend'),
(10,6,'dblog')
)
希望通过python处理,转换成下面的list字典树
l=[
{
'id':1,
'fid':-1,
'title':'python',
'son':[
{
'id':5,
'fid':1,
'title':'flask',
},
{
'id':6,
'fid':1,
'title':'django',
'son':[
{
'id':10,
'fid':6,
'title':'dblog',
},
]
},
{
'id':7,
'fid':1,
'title':'webpy',
},
]
},
{
'id':2,
'fid':-1,
'title':'ruby',
'son':[
{
'id':8,
'fid':2,
'title':'rails',
},
]
},
{
'id':3,
'fid':-1,
'title':'php',
'son':[
{
'id':9,
'fid':3,
'title':'zend',
},
]
},
{
'id':4,
'fid':-1,
'title':'lisp',
}
]
也就是类似网站的目录,父栏目包含子栏目.
自己写了好几个,感觉效率不够好,求大神更pythonic的方法
在stackoverflow有人回答大概如下:
frompprintimportpprint
l=[]
entries={}
forid,fid,titleint:
entries[id]=entry={'id':id,'fid':fid,'title':title}
iffid==-1:
l.append(entry)
else:
parent=entries[fid]
parent.setdefault('son',[]).append(entry)
pprint(l)
慕慕森
浏览 472回答 2
2回答

ibeautiful

Stackoverflow上的那个答案,要t中的父元素出现在子元素之前,如果不能保证,可以用下面的方式:fromitertoolsimportgroupbyfromoperatorimportitemgetterasgetfrompprintimportpprint#groupbyfidtmp=dict([(k,list(rows))fork,rowsingroupby(sorted(t,key=get(1)),get(1))])defmap_fun(row):item=dict(zip(('id','fid','title'),row))ifrow[0]intmp:item['son']=find_children(row[0])returnitem;deffind_children(parent):returnmap(map_fun,tmp[parent])pprint(find_children(-1))关于pythonic,可以试试这个>>>importthisPS:我不是大神啊。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript