我有一个嵌套列表,我需要将其转换为分层字典。但是我有点困惑如何以干净的pythonic方式实现它。这是我提出的一些有点丑陋的示例代码。如何改进?
from itertools import tee,izip
import json
L=[(1,2,3,4,5),(1,2,7),(2,3,5),(3,4,5,6)]
def pairs(iterable):
a,b = tee(iterable)
b.next()
return izip(a,b)
def innerfunc(pairs,d):
try:
pair = pairs.next()
item, nextitem = pair
except StopIteration:
return
if item in d:
innerfunc(pairs,d[item])
else:
d[item]= {}
{nextitem : innerfunc(pairs,d[item])}
def outerfunc(matrix):
result_dict={}
for row in matrix:
iter_pairs = pairs(row+(0,))
innerfunc(iter_pairs,result_dict)
return result_dict
print json.dumps(outerfunc(L), sort_keys=True, indent=4)
输出:
{
"1": {
"2": {
"3": {
"4": {
"5": {}
}
},
"7": {}
}
},
"2": {
"3": {
"5": {}
}
},
"3": {
"4": {
"5": {
"6": {}
}
}
}
}
答案 0 :(得分:2)
你可以使用递归非常简洁地做到这一点:
def append_path(root, paths):
if paths:
child = root.setdefault(paths[0], {})
append_path(child, paths[1:])
# Example usage
root = {}
for p in [(1,2,3,4,5),(1,2,7),(2,3,5),(3,4,5,6)]:
append_path(root, p)
# Print results
import json
print json.dumps(root, indent=4)
输出:
{
"1": {
"2": {
"3": {
"4": {
"5": {}
}
},
"7": {}
}
},
"2": {
"3": {
"5": {}
}
},
"3": {
"4": {
"5": {
"6": {}
}
}
}
}