2017-07-31 73 views
0

我有一個字典與各種變量類型 - 從簡單的字符串到其他嵌套字典幾個層次深。我需要創建一個指向一個特定的鍵:Python:動態更新字典變量「深度」

dict_update(my_dictionary, value, level1key, *level2key....) 

數據從這樣的Web請求來:值對,因此可以在將更新的字典和可以被稱爲像這樣的功能可以使用

data { 
    'edited-fields': ['level1key-level2key-level3key', 'level1key-level2key-listindex', 'level1key'], 
    'level1key-level2key-level3key': 'value1', 
    'level1key-level2key-listindex': 'value2', 
    'level1key': 'value3' 
} 

我可以得到原來的值這樣的閱讀:

for field in data["edited-fields"]: 
    args = field.split("-") 
    value = my_dictionary 
    for arg in args: 
     if arg.isdigit(): 
      arg = int(arg) 
     value = value[arg] 
    print(value) 

,但不知道如何使用相同的邏輯來編輯它。我無法搜索和替換的價值本身,因爲可能有重複,並有幾個if語句爲每個可能的參數計數不感到pythonic。

實施例:

data { 
    'edited-fields': ['mail-signatures-work', 'mail-signatures-personal', 'mail-outofoffice', 'todo-pending-0'], 
    'mail-signatures-work': 'I'm Batman', 
    'mail-signatures-personal': 'Bruce, Wayne corp.', 
    'mail-outofoffice': 'false', 
    'todo-pending-0': 'Call Martha' 
} 

我想處理像這樣的請求:

for field in data['edited-fields']: 
    update_batman_db(field, data[field]) 

def update_batman_db(key-to-parse, value): 
    # how-to? 
    # key-to-parse ('mail-signatures-work') -> batman_db pointer ["mail"]["signatures"]["work"] 
    # etc: 
    batman_db["mail"]["signatures"]["work"] = value 
    batman_db["mail"]["outofoffice"] = value # one less level 
    batman_db["todo"]["pending"][0] = value # list index 
+0

沒有必要做這個:'欄=數據[「edited-fields」]。split(「,」)'this enough'fields = data [「edited-fields」]' – Rahul

+0

我很難理解你想要做什麼以及你面對的是什麼障礙究竟。你能否詳細說明一下? – Y2H

+0

我把它分開得到每個關卡的關鍵,所以我可以從這個 食品水果蘋果 到 東西[食物] [水果] [蘋果] –

回答

1
這裏

困難的部分是要知道的索引是否必須被用作字符串形成的映射作爲列表的整數。

我會先嚐試處理它作爲一個列表中的索引值,並恢復到一個映射的字符串索引中的任何異常的情況下:

def update_batman_db(key, value): 
    keys = key.split('-') # parse the received key 
    ix = batman_db   # initialize a "pointer" to the top most item 
    for key in keys[:-1]: # process up to the last key item 
     try:    # descending in the structure 
      i = int(key) 
      ix = ix[i] 
     except: 
      ix = ix[key] 
    try:     # assign the value with last key item 
     i = int(keys[-1]) 
     ix[i] = value 
    except: 
     ix[keys[-1]] = value 
+0

剛剛分配的最後一個週期,它怎麼沒有發生在我身上! :)感謝一堆。 也,因爲你已經使用捕捉異常而不是isdigit(),我是否認爲它通常是更好的解決方案? –

+0

@HaibaneReki:如果你確定你不能有一個只包含數字的地圖密鑰,那麼'isdigit()'很好(可以稍微高效) –

+0

對,再次感謝 –