2016-11-18 17 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

は、Uをありがとうございます。それは私が必要とするように完全に動作します。キーと値のペアがすでに存在する場合は上書きされます。それ以外の場合は追加されます。ここで 'ジップ'の意味は何ですか? – 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 
関連する問題