在Django的unordered_list中使用Python嵌套列表

2 投票
2 回答
1173 浏览
提问于 2025-04-16 12:10

我有一个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的unordered_list过滤器的格式。

所以我想问的是,如何才能把嵌套字典转换成嵌套列表/元组,或者直接从源数据转换成嵌套列表呢?我似乎无法让递归函数正确地嵌套列表(因为在一个列表中,我不能通过名称引用“子树”)。

eval(string_rep_of_dictionary.replace(':',',').replace('{','[').replace('}',']'))似乎能让我接近答案,但这看起来不是个好办法?

2 个回答

0

这段内容是关于编程的讨论,主要是一些技术问题和解决方案。它可能涉及到代码的写法、调试的方法或者是如何处理一些常见的错误。对于刚入门的朋友来说,理解这些内容可能会有点挑战,但其实只要慢慢来,多尝试,就能掌握这些知识。

如果你在学习编程,遇到不懂的地方,可以先查阅一些基础资料,或者在网上找一些教程,逐步提高自己的技能。记住,编程就像学习一门新语言,开始时可能会觉得困难,但只要坚持练习,就会越来越熟练。

总之,编程的世界很广阔,遇到问题是很正常的,重要的是要保持好奇心和耐心,慢慢探索和学习。

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
1

试试这个

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])

撰写回答