我应该如何定义一个函数parsedic()
?
dic={0:0,
1:{0:0,
1:1,
2:{0:0,},},
2:{0:{1:0,
0:{0:0}},},
3:0}
def parsedic(...):
...
print parsedic(dic)
结果:
0->0
3->0
1.0->0
1.1->1
1.2.0->0
2.0.0.0->0
2.0.1->0
dict的键的类型只能是数字或字符串, 并且值只能是数字,字符串或字典。
(为了避免误解,我删掉了很长时间以来我试图解决这个问题的词语。)
答案 0 :(得分:7)
“压扁”dict的最简单方法是这样的递归生成器:
def parse(dic):
for k, v in dic.items():
if isinstance(v, dict):
for p in parse(v):
yield [k] + p
else:
yield [k, v]
lst = list(parse(dic))
这会创建一个列表[[key,key,key,value],[key,key,val] etc]
,您的示例将是:
[[0, 0], [1, 0, 0], [1, 1, 1], [1, 2, 0, 0], [2, 0, 0, 0, 0], [2, 0, 1, 0], [3, 0]]
要以所需格式打印,只需遍历此列表:
for row in parse(dic):
row = map(str, row)
print '.'.join(row[:-1]) + '->' + row[-1]
这回答了你的问题,但是如果你首先告诉我们为什么你需要这种转变会有所帮助。也许有更好的方法。
答案 1 :(得分:4)
此方法将路径上的当前键的轨道保存到不是dict的值。
def parsedic(d,currHist=[]):
for k,v in d.items(): #go over dict's key,value pairs
newHist = currHist + [k] #add the current key to the 'path' of keys
if isinstance(v,dict): #if that value is a dictionary then we need to go over it's key/vals
parsedic(v,currHist=newHist) #recurse...
else: #base case
print "%s->%d"%('.'.join(map(str,newHist)),v) #print out the path separated by '.' and then -> to the value
parsedic(dic)
输出(注意它的顺序不同,因为迭代键,值对会有所不同):
>>>
0->0
1.0->0
1.1->1
1.2.0->0
2.0.0.0->0
2.0.1->0
3->0
在每次递归时不会创建新列表的稍微难以阅读的方法是:
currHist.append(k) #add the current key
if isinstance(v,dict):
parsedic(v,currHist=currHist)
else:
print "%s->%d"%('.'.join(map(str,currHist)),v)
currHist.pop() #remove that same key