2016-11-18 37 views
1
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 

如何在上面的代码中更新多级字典?最后,我应该更新新值的字典。如何更新多级字典?

+0

相关:http://stackoverflow.com/questions/9320335/accessing-python-dict-with-multiple-key-lookup-string –

回答

0

这里是做使用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'}} 
+0

感谢ü。它可以按我的需要完美地工作。如果键值对已经存在,它会覆盖。否则它会增加。 'zip'在这里有什么意义? – Jackie

0

这类似于摩西的解决方案,但它避免做循环中的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