我有一个包含各种变量类型的字典 - 从简单的字符串到其他几个级别的嵌套字典。我需要创建一个指向特定键:值对的指针,以便它可以在一个更新字典的函数中使用,并且可以这样调用:
dict_update(my_dictionary, value, level1key, *level2key....)
来自此类网络请求的数据:
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)
但不知道如何使用相同的逻辑编辑它。我无法通过值本身进行搜索和替换,因为可能存在重复项,并且每个可能的arg计数都有几个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 :(得分: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