python列表(子/父)到嵌套的dict中

时间:2013-04-08 10:26:18

标签: python sql dictionary nested

我有2个SQL表:

CREATE TABLE IF NOT EXISTS `test` (
  `id_block` int(11) NOT NULL AUTO_INCREMENT,
  `label` varchar(30) NOT NULL,
  PRIMARY KEY (`id_block`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;

INSERT INTO `test` (`id_block`, `label`) VALUES
(1, 'Cat1'),
(2, 'Cat2'),
(3, 'Cat3'),
(4, 'Cat4'),
(5, 'Cat5'),
(6, 'Cat6'),
(7, 'Cat7');


CREATE TABLE IF NOT EXISTS `test2` (
  `id_block` int(11) NOT NULL,
  `id_parent` int(11) NOT NULL,
  PRIMARY KEY (`id_block`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;     

INSERT INTO `test2` (`id_block`, `id_parent`) VALUES
(1, 0),
(2, 0),
(3, 2),
(4, 2),
(5, 3),
(6, 4),
(7, 2);

一个块可能有一个,两个或三个父级,这就是为什么我有2个表。

这是我的SQL查询:

SELECT T.id_block, T2.id_block, label, id_parent
FROM test T 
INNER JOIN test2 T2 ON T.id_block = T2.id_block

我将这些信息放入带有此脚本的列表中:

conn = MySQLdb.connect('localhost','user','pass', 'db') 
curs = conn.cursor() 
result=curs.execute("SELECT ....") 

cats = curs.fetchall() 

curs.close() 
conn.close()

输出:

cats = ((1L, 1L, 'Cat1', 0L), (2L, 2L, 'Cat2', 0L), (3L, 3L, 'Cat3', 2L), (4L, 4L, 'Cat4', 2L), (5L, 5L, 'Cat5', 3L), (6L, 6L, 'Cat6', 4L), (7L, 7L, 'Cat7', 2L))

我希望有一个像这样的分层/嵌套字典:

dict = {"Cat1": {}, "Cat2": {"Cat3": {"Cat5": {}}, "Cat4": {}, "Cat7": {}}}

你有解决方案吗?

提前致谢,

1 个答案:

答案 0 :(得分:0)

这是一个解决方案:

#! /usr/bin/python
# -*- coding: utf-8 -*-
# Python v2.7  
############################################################################# 
def _creadict(c, d={}):

    # recherche des enfants
    for cle in d:
        for cat, catpar in c:
            if catpar==cle:
                d[cle][cat] = {}
        # recherche récursive
        d[cle] = _creadict(c, d[cle])        

    return d  
#============================================================================ 
def creadict(cats):

    # simplification de la liste => [[cat, catparent], ...]
    c = []
    for i, (id1, id2, cat, idpar) in enumerate(cats):
        if idpar==0:
            c.append([cat, 0])
        else:
            for elem in cats:
                if idpar==elem[0]:
                    c.append([cat, elem[2]])
                    break    

    # recherche des 'cat' sans parent (catpar==0)
    d = {}
    for cat, catpar in c:
        if catpar==0:
            d[cat] = {}

    # recherche récursive des enfants
    d = _creadict(c, d)

    return d  
cats = ((1, 1, 'Cat1', 0), (2, 2, 'Cat2', 0), (3, 3, 'Cat3', 2), (4, 4, 'Cat4', 2), (5, 5, 'Cat5', 3), (6, 6, 'Cat6', 4), (7, 7, 'Cat7', 2))
d = creadict(cats)
print d