2017-06-21 123 views
0

以下嵌套詞典是我的字典:沒有硬編碼

'relay': ['S1=OFF,S2=OFF,S3=OFF,S4=OFF'], 

我想的O/P爲例如:(像嵌套字典)

'relay': [['S1':'OFF'],['S2':'OFF'],['S3','OFF'],['S4':'OFF']] 

的問題是,我不能硬編碼的關鍵和價值觀,它可能會在運行時改變。任何人都可以幫助我呢?

+0

你想要的值是一個列表的列表?或者是一個字典列表?因爲當前字典是* not *語法有效。 –

+0

在你想要的輸出中。這是一個'列表',也不是'字典' – Ludisposed

+0

我想要o/p作爲字典 – Erina

回答

2

一種可能的方法可以是這樣的:

不過,我想提出的假設是:

值是dictified(由於缺乏一個更好的名字)總是在['abc=def,abc=...']形式

d = {'panel': ['STDSWB'], 'relay': ['S1=OFF,S2=OFF,S3=OFF,S4=OFF']} 

from collections import defaultdict 

def dictionary_maker(d, key): 

    # Makes new dict to add to previous dictionary 
    new_dict = defaultdict(dict) 

    # foreach value in the list 
    for v in d[key]: 
     for i in v.split(','): 
      d_new = i.split('=') 
      # populate new dict 
      new_dict[key][d_new[0]] = d_new[1] 

    # remove old key and add new key 
    d.pop(key, None) 
    d[key] = dict(new_dict[key]) 
    return d 

d = dictionary_maker(d, 'relay') 
print (d) 
# d = {'panel': ['STDSWB'], 'relay': {'S1': 'OFF', 'S2': 'OFF', 'S3': 'OFF', 'S4': 'OFF'}} 

現在,你可以看看「S2」的值,例如通過執行類似:

print (d['relay']['S2']) #OFF 
+0

有沒有辦法做到這一點,但沒有硬編碼中繼。 – Erina

+0

*編輯*併爲其製作了一個功能,因此您可以將它用於多個按鍵。希望這會有所幫助 – Ludisposed

+0

但是在這一行中,我們將硬編碼轉換爲詞典權利。因此,如果我想要與其他詞典執行相同的操作,則這種方法無效。 d = dictionary_maker(d,'relay') – Erina

2

鑑於字符串是逗號隔開的鍵 - /值,其中鍵和值由等號分隔,可以使用嵌套字典解析

d['relay'] = dict(v.split('=',1) for v in d['relay'][0].split(',')) 

這將產生:

>>> d = {'panel': ['STDSWB'], 'relay': ['S1=OFF,S2=OFF,S3=OFF,S4=OFF']} 
>>> d['relay'] = dict(v.split('=',1) for v in d['relay'][0].split(',')) 
>>> d 
{'relay': {'S2': 'OFF', 'S4': 'OFF', 'S1': 'OFF', 'S3': 'OFF'}, 'panel': ['STDSWB']} 
+0

@geetha:'d'應該是原來的字典。您可以用變量的名稱替換它。 –

+0

@geetha:你可以發佈你的原始字典(或最小版本)與錯誤。 –

+0

以下是我原來的dic {'panel':['STDSWB'], 'relay':['S1 = OFF,S2 = OFF,S3 = OFF,S4 = OFF']}。我想製作一個嵌套詞典 – Erina