我在递归中有多个dict的问题, 原始非递归代码是
mylist = (["AA","BB","CC","DD"])
tempdict = dict()
n = len(mylist)
for j in range(0 , n ):
if j == 0:
if mylist[j] not in tempdict:
tempdict[mylist[j]] = "1"
if j == 1:
if mylist[j] not in tempdict[mylist[0]]:
tempdict[mylist[0]] = dict()
tempdict[mylist[0]][mylist[1]] = "1"
if j == 2:
if mylist[j] not in tempdict[mylist[0]][mylist[1]]:
tempdict[mylist[0]][mylist[1]] = dict()
tempdict[mylist[0]][mylist[1]][mylist[2]] = "1"
if j == 3:
.......
if j == 4:
.......
if j == n:
.......
print tempdict
结果:{'AA'{'BB':{'CC':{'DD':'1'}}}} 当我需要通过dict()构建一个多键时,它才有用。 但是,不可能列出所有。 所以我想在递归函数中改进代码
def rfun(tmpdict, mylist, idx, listlen):
if idx < listlen:
if idx == 0:
if mylist[idx] not in tmpdict:
tmpdict[mylist[idx]] = "1"
rfun(tmpdict [mylist[idx]], list, idx + 1, listlen)
else:
if list[idx] not in tmpdict:
tmpdict = dict()
tmpdict [mylist[idx]] = "1"
rfun(tmpdict [mylist[idx]], mylist, idx + 1, listlen)
newdict = dict()
mylist = (["AA","BB","CC","DD"]
print rfun(newdict, mylist, 0, len(mylist))
结果: { 'AA': '1'}
但是,结果不是我的期望,
请帮我查一下我的递归代码有什么问题,
谢谢大家。
答案 0 :(得分:1)
你走了。
def rfun(tmpdict, mylist, idx, listlen):
if idx < listlen:
if idx == listlen - 1: # for last element in mylist
tmpdict[mylist[idx]] = "1"
else:
tmpdict[mylist[idx]] = {}
rfun(tmpdict[mylist[idx]], mylist, idx + 1, listlen)
newdict = {}
mylist = ["AA","BB","CC","DD"]
rfun(newdict, mylist, 0, len(mylist))
print newdict
关键思想是如果元素不是最后一个,则将新创建的字典传递给下一个递归函数调用。
答案 1 :(得分:1)
mylist = ["AA","BB","CC","DD"]
递归版本很简洁,但在极端情况下会导致堆栈溢出:
def l2rd(*args):
return { args[0] : (len(args)>1) and l2rd(*args[1:]) or "1" }
result = l2rd(*mylist)
print(result)
结果:{&#39; AA&#39;:{&#39; BB&#39;:{&#39; CC&#39;:{&#39; DD&#39;:&#39; 1& #39;}}}
非递归版本可以通过以相反的顺序循环遍历列表并执行以下操作来执行相同的操作:
curr = "1"
for key in reversed_list:
curr = { key : curr }
return curr
但是 需要复制列表才能将其反转(这应该比递归更有效)。通过索引进行迭代也可以使用range(len(args)-1,-1,-1)