[英]Convert String to multi-level dictionary keys?
我讓用戶能夠檢查多級字典中的特定鍵。 我的想法是他們會像這樣將路徑傳遞給密鑰:
root.subelement1.subelement2.key
這可以是任意長度和深度。
一旦我有了用戶的字符串(上面),我將拆分它並獲得每個組件的列表:
elements = ['root', 'subelement1', 'subelement2', 'key']
所有這些我都能做到。 接下來的部分是我被困住的地方。 當它是任意長度時,如何查詢由上面指定的字典鍵?
我最初的想法是做一些像my_dict[elements[0]][elements[1]]
......但是當我的用戶沒有准確傳遞我期望的長度時,這不會擴展或工作。
在這種情況下,如何以任意鍵深度獲取數據?
幾個例子:
country.US.NewYork
=>我查詢`my_dict ['country'] ['US'] ['NewYork'] department.accounting
=>我查詢my_dict['department']['accounting']
id
=>我查詢my_dict['id']
district.District15.HenryBristow.principal
=>我查詢my_dict['district']['District15']['HenryBristow']['principal']
你可以使用reduce
來查詢嵌套字典中的鍵:
q = "district.District15.HenryBristow.principal"
my_dict = {"district" : {"District15" : {"HenryBristow" : {"principal" : 12}}}}
from functools import reduce # python 3 only
print(reduce(lambda x,y : x[y],q.split("."),my_dict))
結果:
12
如果您想避免在此路徑中不存在數據的情況下捕獲KeyError
,則可以使用帶有默認值的get
作為空字典:
reduce(lambda x,y : x.get(y,{}),q.split("."),my_dict)
嘗試獲取未知值會返回一個空字典。 唯一的缺點是你不知道路徑到底在哪里丟失,所以也許保留KeyError
不會那么糟糕:
try:
v = reduce(lambda x,y : x[y],q.split("."),my_dict)
except KeyError as e:
print("Missing key: {} in path {}".format(e,q))
v = None
你可以像下面這樣做
my_dict = someDict
tmpDict = dict(someDict) # a coppy of dict
input = "x.u.z"
array = input.split(".")
for key in array:
tmpDict = tmpDict[key]
print(tmpDict)
但你的問題非常具有挑戰性 :你說如果用戶發送country.us然后轉到my-dict.country.us
但是如果my_dict中的這個路徑之一是列表代碼會發生錯誤,你可以通過檢查類型處理這個錯誤
if isinstance(tmpDict , dict ):
tmpDict = tmpDict[key]
else:
# u should say what u want else (a Recursive method u will need)
編輯如果用戶地址可能有錯,你應該檢查my_dict
是否有這個字段或者下面沒有示例代碼但是如果我不喜歡那么會有很多! 如果key不在tmpDict:print(“Bad Path”)返回
使用遞歸。 例如:
root = {
'subelement1': {
'subelement2': {
'key': 'value'
}
}
}
elements = ['subelement1', 'subelement2', 'key']
def getElem(d, keys):
if keys == []:
return None
else:
key = keys[0]
remainingKeys = keys[1:]
if remainingKeys == []:
return d[key]
else:
if type(d[key]) == dict:
return getElem(d[key], remainingKeys)
else:
return None
print(getElem(root, elements))
從python 2.x的角度來看,你可以用reduce來做到這一點。
query_list = keys.split(":")
print reduce(lambda x,y: x[y], [my_dict] + query_list)
但是一般來說,如果你想在拋出KeyError
之外進行錯誤處理,你會想要使用遞歸或迭代函數。
您可以使用for循環遍歷字典:
s = 'root.subelement1.subelement2.key'
d1 = {'root':{'subelement1':{'subelement2':{'key':15, 'key1':18}}}}
new_d = d1
for key in s.split('.'):
new_d = new_d[key]
print(new_d)
輸出:
15
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.