我有一個包含顯微鏡采集元資料的嵌套字典,如下所示:
metadata_dict = {Metadata: {"_text" : "\n\n ",
"Core" : [{"_text" : \n\n ",
"Guid" : [{"_text" : "c..."}],
"UserID" : [{"_text" : "xyz"}]
"AppSW" : [{"_text" : "xT"}]
"AppSWVer" : [{"_text" : "0"}]
}],
"Instrument" : [{"_text" : "\n\n ",
"ContrSWVer : [{"_text": : "10..."}]
...
等等(希望縮進讓它不那么混亂)。我只需要某些鍵/值對,并且我正在使用 python 將值獲取到可指定的鍵。無論引數如何,.get() 方法都會回傳“None”,因此我嘗試了以下方法來檢查字典中的所有值以查找特定鍵:
def lookup(dic,prop):
for k, v in dic.items():
if k == prop:
if not isinstance(v, dict):
return v
else:
for key, value in v:
return value
elif isinstance(v, dict):
lookup(v, prop)
呼叫此方法,例如通過
UserID = lookup(metadata_dict, 'UserID')
print(UserID)
無論引數嵌套在字典中的級別如何,我都只會得到“無”輸出。
然而,在將最后兩行更改為之后,這篇文章似乎解決了同樣的問題
elif isinstance(v, dict):
return lookup(v, prop)
我仍然得到,但“無”回傳。這可能是由于遞回呼叫具有第二個引數為prop的方法導致該方法使用v、prop(并且prop是一個未定義的變數)而不是從初始函式繼承引數(示例中的“UserID” )而導致的嗎?如果是這樣,考慮到prop未定義,為什么不回傳錯誤?
uj5u.com熱心網友回復:
問題是UserID里面['Metadata']['Core']是一個串列。
如果v是一個字典,你只會遞回。
您可以修改您的代碼來處理:
def lookup(dic, prop):
for k, v in dic.items():
if k == prop:
if not isinstance(v, dict):
return v
if isinstance(v, dict):
return lookup(v, prop)
if isinstance(v, list):
for item in v:
found = lookup(item, prop)
if found:
return found
>>> lookup(metadata_dict, "UserID")
[{'_text': 'xyz'}]
我遺漏了:
else:
for key, value in v:
return value
v是一個字典,所以這應該會引發錯誤。也return將退出函式 - 所以這只會處理一個值。
如果可以有多個匹配項 - 您可以改用生成器。
def lookup(dic, prop):
for k, v in dic.items():
if k == prop:
if not isinstance(v, dict):
yield v
if isinstance(v, dict):
yield from lookup(v, prop)
if isinstance(v, list):
for item in v:
yield from lookup(item, prop)
輸出:
>>> for result in lookup(metadata_dict, "UserID"):
... print(result)
[{'_text': 'xyz'}]
具有多個值的示例:
>>> for result in lookup({"Foo": [{"UserID": 1}], "Bar": {"Baz":[{"Hi": {"UserID": "2"}}]}}, "UserID"):
... print(result)
1
2
uj5u.com熱心網友回復:
你可以試試這個看看是否有效,如果不行,我建議你解釋你想要的結果,你可以以資料為例
def lookup(dic, prop):
res = []
for item in dic.values():
if isinstance(item, list):
for sub_item in item:
for k, v in sub_item.items():
if k == prop:
res.append(v)
elif isinstance(item, dict):
for k, v in item.items():
if k == prop:
res.append(v)
return res
metadata_dict = {"Metadata": {"_text" : "\n\n ",
"Core" : [{"_text" : "\n\n ",
"Guid" : [{"_text" : "c..."}],
"UserID" : [{"_text" : "xyz"}],
"AppSW" : [{"_text" : "xT"}],
"AppSWVer" : [{"_text" : "0"}]
}],
"Instrument" : [{"_text" : "\n\n ",
"Guid" : [{"_text" : "124"}],
"UserID" : [{"_text" : "waefe"}],
"AppSW" : [{"_text" : "asfa"}],
"AppSWVer" : [{"_text" : "21"}]
}]
}}
print(lookup(metadata_dict["Metadata"], "UserID"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/425213.html
上一篇:具有最少元素的子集和
