我有一個大字典(最初是一個 json),是這樣的:
dictionary = {
"Thing1": {
"Thing1.1": {
"Thing1.1.1": "Text",
"Thing1.1.2": "Text",
"Thing1.1.3": "Text"},
"Thing1.2": [{
"Thing1.2.1.1": "Text",
"Thing1.2.1.2": "Text",
"Thing1.2.1.3": "Text"},
{
"Thing1.2.2.1": "Text",
"Thing1.2.2.2": "Text",
"Thing1.2.2.3": "Text we're interested in"}
],
"Thing1.3": {
"Thing1.3.1": "Text",
"Thing1.3.2": "Text",
"Thing1.3.3": "Text"}
},
"Thing2": {
"Thing2.1": {
"Thing2.1.1": "Text",
"Thing2.1.2": "Text",
"Thing2.1.3": "Text"},
"Thing2.2": {
"Thing2.2.1": "Text",
"Thing2.2.2": "Text",
"Thing2.2.3": "Text"},
"Thing2.3": {
"Thing2.3.1": "Text",
"Thing2.3.2": "Text",
"Thing2.3.3": "Text"}
},
"Thing3": {
"Thing3.1": {
"Thing3.1.1": "Text",
"Thing3.1.2": "Text",
"Thing3.1.3": "Text"},
"Thing3.2": {
"Thing3.2.1": "Text",
"Thing3.2.2": "Text",
"Thing3.2.3": "Text"},
"Thing3.3": {
"Thing3.3.1": "Text",
"Thing3.3.2": "Text",
"Thing3.3.3": "Text"}
}
}
而且,在自動化了一些事情之后,我有一些我感興趣的值的鍵,在一個字串中:
key = '["Thing1"]["Thing1.2"][1]["Thing1.2.2.3"]''
我希望能夠呼叫我擁有鍵的值,就好像它是下列的:
value = dictionary["Thing1"]["Thing1.2"][1]["Thing1.2.2.3"]
我曾嘗試使用 exec,并使用 f-strings 整齊地格式化所有內容,但這太可怕了,它確實給我帶來了一些麻煩,特別是如果我在函式中使用它,因為它處理全域和區域變數的方式。
編輯:我已經更改了字典和鍵以表示它在真實情況下的樣子:這是一個任意深度的字典,其中可能包含嵌入其中的串列,例如“Thing1.2”。
uj5u.com熱心網友回復:
讓我們假設嵌套字典的深度是未知的。在這種情況下,我們需要一個回圈來導航它。您可以使用正則運算式來隔離嵌入的鍵。像這樣的東西:
import re
dictionary = {
"Thing1": {
"Thing1.1": {
"Thing1.1.1": "Text",
"Thing1.1.2": "Text",
"Thing1.1.3": "Text"},
"Thing1.2": [{
"Thing1.2.1.1": "Text",
"Thing1.2.1.2": "Text",
"Thing1.2.1.3": "Text"},
{
"Thing1.2.2.1": "Text",
"Thing1.2.2.2": "Text",
"Thing1.2.2.3": "Text we're interested in"}
],
"Thing1.3": {
"Thing1.3.1": "Text",
"Thing1.3.2": "Text",
"Thing1.3.3": "Text"}
},
"Thing2": {
"Thing2.1": {
"Thing2.1.1": "Text",
"Thing2.1.2": "Text",
"Thing2.1.3": "Text"},
"Thing2.2": {
"Thing2.2.1": "Text",
"Thing2.2.2": "Text",
"Thing2.2.3": "Text"},
"Thing2.3": {
"Thing2.3.1": "Text",
"Thing2.3.2": "Text",
"Thing2.3.3": "Text"}
},
"Thing3": {
"Thing3.1": {
"Thing3.1.1": "Text",
"Thing3.1.2": "Text",
"Thing3.1.3": "Text"},
"Thing3.2": {
"Thing3.2.1": "Text",
"Thing3.2.2": "Text",
"Thing3.2.3": "Text"},
"Thing3.3": {
"Thing3.3.1": "Text",
"Thing3.3.2": "Text",
"Thing3.3.3": "Text"}
}
}
key = '["Thing1"]["Thing1.2"][1]["Thing1.2.2.3"]'
list_ = re.findall(r'\["*(.*?)"*\]', key)
d = dictionary
for k in list_:
if k.isdigit() and isinstance(d, list):
d = d[int(k)]
else:
d = d.get(k)
if d is None:
break
print(d)
輸出:
Text we're interested in
uj5u.com熱心網友回復:
如果您"1.2.3"
想從串列中提供和獲取您想要的專案,您可以使用以下代碼:
keys = "1.2.3".split(".")
value = dictionary["Thing" keys[0]]["Thing" keys[0] "." keys[1]]["Thing" keys[0] "." keys[1] "." keys[2]]
如果你愿意,你可以從你的key1
變數中得到它:
key1 = '["Thing1"]["Thing1.2"]["Thing1.2.3"]'
keys = key1[key1.rfind("Thing") 5: -2].split(".")
value = dictionary["Thing" keys[0]]["Thing" keys[0] "." keys[1]]["Thing" keys[0] "." keys[1] "." keys[2]]
uj5u.com熱心網友回復:
據我了解,您總是會收到如上所示的字串中的三個鍵,如果沒有,請糾正我。在這種情況下,我找到了以下解決方案:
text = '["Thing1"]["Thing1.2"]["Thing1.2.3"]'
keys = [eval(i) for i in text.replace("[", "").split("]")[:-1]]
target = dictionary[keys[0]][keys[1]][keys[2]]
作為變數:
keys = ['Thing1', 'Thing1.2', 'Thing1.2.3']
target = "Text we're interested in"
編輯:如果您不想使用 exec 或 eval,也可以這樣做:
keys = text.replace("[", "").replace('"', "").split("]")[:-1]
target = dictionary[keys[0]][keys[1]][keys[2]]
如果您的深度可變,則可以將最后幾行替換為:
target = dictionary
for k in keys:
target = target[k]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504901.html
上一篇:在現有字典之上添加另一層?