gpt4 book ai didi

python - 制作一个用于 Django 无序列表的 python 嵌套列表

转载 作者:太空宇宙 更新时间:2023-11-04 06:29:03 24 4
gpt4 key购买 nike

我有一个带有自引用外键的 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': {}}}

使用 Converting tree list to hierarchy dict作为指南,但我需要它的形式可以用于 Django 的 unordered_list 过滤器。

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

eval(string_rep_of_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])

关于python - 制作一个用于 Django 无序列表的 python 嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5059401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com