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