【问题标题】:How to update multi-level dictionary?如何更新多级词典?
【发布时间】:2016-11-18 11:10:06
【问题描述】:
test_dict = {'path': '/home/user/user_name','device1': {'IP': '10.10.10.10','password': 'pwd1','username': 'user1','name':'USER_DEFINED'},'device2': {'IP': '11.11.11.11','password': 'pwd2','username': 'user2','name':'USER_DEFINED_TEST'}}
keys_to_be_updated = "path,device1/name,device2/name"
values_to_be_updated = "/home/user/user_name/ABCD,USER_TESTER1,USER_TESTER2"
k = 0
list_of_values = values_to_be_updated.split(",")
if keys_to_be_updated != "":
    for i in keys_to_be_updated.split(","):
        for j in i.split("/"):
            tmp = "['"+str(j)+"']"
        # test_dict[tmp] = list_of_values[k]
        # How to assign values to multi level dictionary here
        # test_dict['path'] = list_of_values[k]
        # test_dict['device1'][name'] = list_of_values[k]
        # test_dict['device2'][name'] = list_of_values[k]
        k = k+1

如何更新上述代码中的多级字典?最后,我应该得到更新了新值的字典。

【问题讨论】:

标签: python dictionary nested


【解决方案1】:

这是一种使用zip 的方法,在用逗号分割字符串,然后在用斜线分割后迭代键:

for k, v in zip(keys_to_be_updated.split(','), values_to_be_updated.split(',')):
    d = test_dict
    keys = k.split('/')
    if len(keys) == 1:
        d[k] = v
    else:
        for i in keys[:-1]:
            d = d[i]
        d[keys[-1]] = v

print(test_dict)
# {'device2': {'username': 'user2', 'IP': '11.11.11.11', 'password': 'pwd2', 'name': 'USER_TESTER2'}, 'path': '/home/user/user_name/ABCD', 'device1': {'username': 'user1', 'IP': '10.10.10.10', 'password': 'pwd1', 'name': 'USER_TESTER1'}}

【讨论】:

  • 谢谢你。它可以根据我的需要完美运行。如果键值对已经存在,则覆盖。否则添加。这里的“zip”有什么意义?
【解决方案2】:

这类似于 Moses 的解决方案,只是它避免在循环中执行 if

from pprint import pprint

test_dict = {
    'path': '/home/user/user_name',
    'device1': {
        'IP': '10.10.10.10',
        'password': 'pwd1',
        'username': 'user1',
        'name':'USER_DEFINED'
    },
    'device2': {
        'IP': '11.11.11.11',
        'password': 'pwd2',
        'username': 'user2',
        'name':'USER_DEFINED_TEST'
        }
}

keys_to_be_updated = "path,device1/name,device2/name"
values_to_be_updated = "/home/user/user_name/ABCD,USER_TESTER1,USER_TESTER2"

data = keys_to_be_updated.split(','), values_to_be_updated.split(',')
for key, val in zip(*data):
    keychain = key.split('/')
    d = test_dict
    for k in keychain[:-1]:
        d = d[k]
    d[keychain[-1]] = val

pprint(test_dict)

输出

{'device1': {'IP': '10.10.10.10',
             'name': 'USER_TESTER1',
             'password': 'pwd1',
             'username': 'user1'},
 'device2': {'IP': '11.11.11.11',
             'name': 'USER_TESTER2',
             'password': 'pwd2',
             'username': 'user2'},
 'path': '/home/user/user_name/ABCD'}

这里有一个小的变化。我们使用map 来做逗号分割步骤。

data = keys_to_be_updated, values_to_be_updated
for key, val in zip(*map(lambda u: u.split(','), data)):
    keychain = key.split('/')
    d = test_dict
    for k in keychain[:-1]:
        d = d[k]
    d[keychain[-1]] = val

【讨论】:

    猜你喜欢
    • 2016-02-07
    • 1970-01-01
    • 2022-01-25
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多