iT邦幫忙

0

PYTHON 遞迴遍歷字典值與索引皆直接返回None

##########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了"
求解..

key 不加 "" 能跑嗎
我跑都有跑出你要的輸出
抱歉 我找出原因了 也是我測資給錯了,我更新一下內容
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
japhenchen
iT邦超人 1 級 ‧ 2020-10-15 07:34:32

何苦要自己做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())))

感謝 抱歉菜鳥不知道還有這麼好用的東西! 謝謝!!

1
小碼農米爾
iT邦高手 1 級 ‧ 2020-10-15 09:39:30

我改了一下結構,不過不是很確定需求,給你參考看看。

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', [])

感謝答覆!

我要發表回答

立即登入回答