2017-05-29 109 views
3

我有一個字典如下:分組基於字典鍵

dict_details = { 
     'device.dummy.1.id': '1', 
     'device.dummy.2.id': '2', 
     'device.dummy.1.length': '202', 
     'device.dummy.2.length': '203', 
     'device.dummy.2.validity': '10001', 
     'device.dummy.1.validity': '10002', 
     'device.dummy.1.type': 'first', 
     'device.dummy.2.type': 'first' 
    } 

我需要創建具有上述辭典的以下字典。這是組字典值與一些獨特的標識符將出現在我的字典。

{ 
    'device.dummy.1': { 
     'id': '1', 
     'length': '202', 
     'validity': '10001', 
     'type': 'first' 
    }, 
    'device.dummy.2': { 
     'id': '2', 
     'length': '203', 
     'validity': '10002', 
     'type': 'first' 
    } 
} 

我嘗試下面的代碼:

dict_details = { 
     'device.dummy.1.id': '1', 
     'device.dummy.2.id': '2', 
     'device.dummy.1.length': '202', 
     'device.dummy.2.length': '203', 
     'device.dummy.2.validity': '10001', 
     'device.dummy.1.validity': '10002', 
     'device.dummy.1.type': 'first', 
     'device.dummy.2.type': 'first' 
    } 
    s = {} 
    dummy = {} 
    for key, value in dict_details.items(): 

     attrib = key.rsplit(".",1)[1] 
     macro = key.rsplit(".",1)[0] 
     s[attrib] = value 
     dummy[macro] = s 
    print(dummy) 

卻是如下產生的輸出,即密鑰的價值越來越受已經存在的鍵覆蓋。

尋找相同的一些簡單的解決方法。

{ 
    'device.dummy.1': { 
     'length': '202', 
     'type': 'first', 
     'id': '1', 
     'validity': '10001' 
    }, 
    'device.dummy.2': { 
     'length': '202', 
     'type': 'first', 
     'id': '1', 
     'validity': '10001' 
    } 
} 
+2

創建的字典裏面* *循環。字典是*可變的*。 – jonrsharpe

+0

請看看提供的示例,如果我在循環內定義一個字典,我不會得到我期待的結果字典。 – sathis

+0

'dummy [macro] = s'是它出錯的地方。嘗試'虛擬[宏] .update(s)'而不是 – Nullman

回答

3

隨着defaultdict

您可以用defaultdict實現這一目標:

from collections import defaultdict 
dict_details = { 
     'device.dummy.1.id': '1', 
     'device.dummy.2.id': '2', 
     'device.dummy.1.length': '202', 
     'device.dummy.2.length': '203', 
     'device.dummy.2.validity': '10001', 
     'device.dummy.1.validity': '10002', 
     'device.dummy.1.type': 'first', 
     'device.dummy.2.type': 'first' 
    } 

new_dict = defaultdict(dict) 

for key in dict_details: 
    a, b = key.rsplit(".", 1) 
    new_dict[a][b] = dict_details[key] 

print(new_dict) 
# defaultdict(<type 'dict'>, {'device.dummy.1': {'length': '202', 'type': 'first', 'id': '1', 'validity': '10002'}, 'device.dummy.2': {'length': '203', 'type': 'first', 'id': '2', 'validity': '10001'}}) 

使用標準類型的字典

沒有defaultdict,你只需要檢查subdict定義添加屬性前:

dict_details = { 
     'device.dummy.1.id': '1', 
     'device.dummy.2.id': '2', 
     'device.dummy.1.length': '202', 
     'device.dummy.2.length': '203', 
     'device.dummy.2.validity': '10001', 
     'device.dummy.1.validity': '10002', 
     'device.dummy.1.type': 'first', 
     'device.dummy.2.type': 'first' 
    } 

dummy = {} 

for key, value in dict_details.items(): 
    attrib, macro = key.rsplit(".",1) 
    if not dummy.get(attrib): 
     dummy[attrib] = {} 
    dummy[attrib][macro] = value 

print(dummy) 
# {'device.dummy.1': {'length': '202', 'type': 'first', 'id': '1', 'validity': '10002'}, 'device.dummy.2': {'length': '203', 'type': 'first', 'id': '2', 'validity': '10001'}} 
+0

有沒有可能實現這個沒有默認字典? – sathis

+0

@sathis:是的,請參閱更新 –

+0

正確,它的工作原理 – sathis

1

這是因爲你在重複使用s。你可能想要做更類似的事情

dummy.setdefault(macro, {})[attrib] = value 

如果還沒有虛擬[宏],則將虛擬[宏]設置爲空字典。

0
import pprint 
dict_details = { 
     'device.dummy.1.id': '1', 
     'device.dummy.2.id': '2', 
     'device.dummy.1.length': '202', 
     'device.dummy.2.length': '203', 
     'device.dummy.2.validity': '10001', 
     'device.dummy.1.validity': '10002', 
     'device.dummy.1.type': 'first', 
     'device.dummy.2.type': 'first' 
    } 

dummy = {} 
for key, value in dict_details.items(): 
     attrib = key.rsplit(".",1)[1] 
     macro = key.rsplit(".",1)[0] 
     if macro not in dummy: 
      dummy[macro]={} 
      dummy[macro][attrib]=value 
     else: 
      dummy[macro][attrib]=value 
pprint.pprint(dummy) 

結果

{'device.dummy.1': {'id': '1', 
        'length': '202', 
        'type': 'first', 
        'validity': '10002'}, 
'device.dummy.2': {'id': '2', 
        'length': '203', 
        'type': 'first', 
        'validity': '10001'}}