我有一个带有自引用外键的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('}',']'))似乎只是让我在那里,但似乎一个可怕的解决方案?
答案 0 :(得分: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])
答案 1 :(得分: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