##########10/15更新後正確的####################
dic={
"AAAA":"5",
"GGGGG":{"F":"C4CC","R":"A66666"},
"BBBB":{"A":"CCCC","B":"666666"},
"XXXX":[],
"DDDD":"6"
}
def find_dic(dic,target,res=None):
for key ,values in dic.items():
if isinstance(values,dict):
res=find_dic(values,target)#更改的一行
#原本是return find_dic(dic[key],target)
if res:
return res
else:
if key==target:
res=values
return values
elif values==target:
res=key
return key
print(find_dic(dic,"XXXX"))
寫錯了 正確的測資應該是多層字典
因為在前一個程式碼裡如果遞迴到第二層的字典時會再次呼叫find_dic(values,target)
進去字典後如果沒有找到目標 第二次的find_dic會回傳None
這時return find_dic(values,target)
就變成了 return None
程式就回傳了None
於是多了個變數做判定若第二層以後的結果不是None則回傳
若是None 則繼續
#################################################################
dic={
AAAA:"5",
XXXX:[],
DDDD:"6"
}
def find_dic(self,dic,target):
for key in dic.keys():
if isinstance(dic[key],dict):
return find_dic(dic[key],target)
else:
if key==target:
return dic[key]
elif dic[key]==target:
return key
print(find_dic(dic,"6"))
#這邊希望結果是找出6對應的key或者value是多少
正常情況應該印出"DDDD"
print(find_dic(dic,"AAA"))
印出"5" <==沒問題
這是局部的程式碼
用途在於遍歷字典的KEY跟VALUE找出哪一個對應的
測試很多次只要遍歷到dic["XXXX"]裡面是[]遞迴就會直接結束
並且返回None
不會在遍歷到下一個DDDD
這原因是什麼?
另外要如何避開這個問題
有嘗試在迴圈中一開始就加入if dic[key] is None 或者 if dic[key] == [] 判斷
dic={
AAAA:"5",
XXXX:[],
DDDD:"6"
}
def find_dic(self,dic,target):
for key in dic.keys():
if dic[key] is None or dic[key] == []:
print("GGG了")
if isinstance(dic[key],dict):
return find_dic(dic[key],target)
else:
if key==target:
return dic[key]
elif dic[key]==target:
return key
print(find_dic(dic,"6"))
但在進入判斷時都直接return None回來 也沒辦法印出"GGG了"
求解..
何苦要自己做function遍歷呢?
dic = {
"AAAA":"5",
"GGGGG":{"F":"C4CC","R":"A66666"},
"BBBB":{"A":"CCCC","B":"666666"},
"XXXX":[],
"DDDD":"6"
}
print(list(filter(lambda elem: elem[1] == [], dic.items())))
print(list(filter(lambda elem: str(elem[1]) == "6", dic.items())))
我改了一下結構,不過不是很確定需求,給你參考看看。
dic = {
"AAAA": "5",
"GGGGG": {
"F": "C4CC",
"R": "A66666"
},
"BBBB": {
"A": "CCCC",
"B": "666666"
},
"XXXX": [],
"DDDD": "6"
}
def find(dic, target):
def dfs(key, val):
if key == target:
return ('key', val)
if val == target:
return ('val', key)
if isinstance(val, dict):
for k, v in val.items():
rlt = dfs(k, v)
if rlt:
return rlt
return dfs(None, dic)
print(find(dic,"XXXX")) # ('key', [])