2017-06-21 125 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