Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
制作一个python嵌套列表,以便在Django';s无序列表_Python_Django_Django Templates - Fatal编程技术网

制作一个python嵌套列表,以便在Django';s无序列表

制作一个python嵌套列表,以便在Django';s无序列表,python,django,django-templates,Python,Django,Django Templates,我有一个带有自引用外键的Django模型,因此我的模型(作为最基本形式的类)如下所示: class MyObj(object): def __init__(self, id, ttl, pid): self.id = id self.name = ttl self.parentid = pid 因此,我的数据样本可能如下所示: nodes = [] nodes.append(MyObj(1,'a',0)) nodes.append(MyO

我有一个带有自引用外键的Django模型,因此我的模型(作为最基本形式的类)如下所示:

class MyObj(object):
    def __init__(self, id, ttl, pid):
        self.id = id
        self.name = ttl
        self.parentid = pid
因此,我的数据样本可能如下所示:

nodes = []
nodes.append(MyObj(1,'a',0))
nodes.append(MyObj(2,'b',0))
nodes.append(MyObj(3,'c',1))
nodes.append(MyObj(4,'d',1))
nodes.append(MyObj(5,'e',3))
nodes.append(MyObj(6,'f',2))
我已经到了可以将其转换为嵌套字典的程度:

{'a': {'c': {'e': {}}, 'd': {}}, 'b': {'f': {}}}
作为指南使用,但我需要它的形式可以用于Django的无序列表

所以我的问题是,如何从嵌套字典到嵌套列表/元组,或者直接从源数据到嵌套列表?我似乎无法获得正确嵌套列表的递归函数(如在列表中,我无法按名称引用“子树”)

eval(dictionary.replace(“:”,“,”).replace(“{”,“[”).replace(“}”,“]'))的字符串似乎能让我达到目的,但这似乎是一个可怕的解决方案?

试试看

lists = {}
for n in nodes:
    b = lists.setdefault(n.id, [])
    lists.setdefault(n.parentid, []).extend([n.name, b])
print lists[0]
或者,使用
collections.defaultdict

lists = collections.defaultdict(list)
for n in nodes:
    lists[n.parentid] += [n.name, lists[n.id]]
print lists[0]
两者都将打印

['a', ['c', ['e', []], 'd', []], 'b', ['f', []]]
编辑:要清除空列表,请再次遍历节点:

for n in nodes:
    if not lists[n.id]:
        lists[n.parentid].remove(lists[n.id])

太好了,我不知道setdefault。现在我只需要找出如何摆脱空叶节点。。。看起来无序的_列表不会忽略空节点。
def nested_dict_to_list(d):
    result = []
    for key, value in d.iteritems():
        try:
            value = nested_dict_to_list(value)
        except AttributeError:
            pass
        result += [key, value]
    return result


test = {'a': {'c': {'e': {}}, 'd': {}}, 'b': {'f': {}}}
desired_result = ['a', ['c', ['e', []], 'd', []], 'b', ['f', []]]

nested_dict_to_list(test) == desired_result
# True