Python:使用可变变量“动态更新字典”;“深度”;

Python:使用可变变量“动态更新字典”;“深度”;,python,dictionary,Python,Dictionary,我有一个包含各种变量类型的字典——从简单字符串到其他嵌套字典,有几个层次。我需要创建一个指向特定key:value对的指针,这样它就可以在更新字典的函数中使用,并且可以像这样调用: dict_update(my_dictionary, value, level1key, *level2key....) 来自以下web请求的数据: data { 'edited-fields': ['level1key-level2key-level3key', 'level1key-level2key-

我有一个包含各种变量类型的字典——从简单字符串到其他嵌套字典,有几个层次。我需要创建一个指向特定key:value对的指针,这样它就可以在更新字典的函数中使用,并且可以像这样调用:

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)
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
我可以按如下方式读取原始值:

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)
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
但是不知道如何使用相同的逻辑编辑它。我不能用值本身搜索和替换,因为可能会有重复的值,并且对于每个可能的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'
}
我想这样处理该请求:

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)
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

这里最困难的部分是知道索引是否必须用作字符串形式的映射,以及是否必须用作列表的整数

我将首先尝试将其作为列表上的整数索引进行处理,并在出现任何异常时还原为映射的字符串索引:

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

无需这样做:
fields=data[“edited fields”].split(“,”)
这就足够了
fields=data[“edited fields”]
我很难理解您想要做什么以及您正面临的障碍。请你详细说明一下好吗?我把它分成两个等级,这样我就可以从这个食用水果苹果中得到东西[食物][水果][苹果]@HaibaneReki:你不能分成一个等级。你是对的,我的坏朋友,更正了示例代码-它实际上是一个字符串,因为我无法以本机方式从javascript获取到python的列表,但让我更改它,因为它对我试图做的事情并不重要—在上一个循环中分配,为什么我没有想到它!:)非常感谢。另外,由于您使用捕获异常而不是isdigit(),我是否认为它通常是更好的解决方案?@HaibaneReki:如果您确定不能让映射键只包含数字,那么
isdigit()
就可以了(而且可能会稍微更有效)