2017-09-04 110 views
1

我有一本字典:拆分字典基於價值

data = {'cluster': 'A', 'node': 'B', 'mount': ['C', 'D', 'E']} 

我試圖分裂字典data到基於關鍵mount值字典的數量。

我試着使用:

for value in data.items(): 
    print(data) 

但我得到這個:

data = {'cluster': 'A', 'node': 'B', 'mount': ['C', 'D', 'E']} 

data = {'cluster': 'A', 'node': 'B', 'mount': ['C', 'D', 'E']} 

data = {'cluster': 'A', 'node': 'B', 'mount': ['C', 'D', 'E']} 

其實,我想獲得:

data = {'cluster': 'A', 'node': 'B', 'mount': 'C'} 

data = {'cluster': 'A', 'node': 'B', 'mount': 'D'} 

data = {'cluster': 'A', 'node': 'B', 'mount': 'E'} 

回答

2

您需要通過值 - 迭代列表中的密鑰'mount',並更新該密鑰的值:

>>> data = {'cluster': 'A', 'node': 'B', 'mount': ['C', 'D', 'E']} 
>>> 
>>> for v in data['mount']: 
... d = data.copy() 
... d['mount'] = v 
... print(d) 
... 
{'node': 'B', 'cluster': 'A', 'mount': 'C'} 
{'node': 'B', 'cluster': 'A', 'mount': 'D'} 
{'node': 'B', 'cluster': 'A', 'mount': 'E'} 

你也可以用給定的值列表的位置已經被已知的列表理解建立一個列表中的所有類型的字典:

>>> [{'cluster': 'A', 'node': 'B', 'mount': v} for v in data['mount']] 
[{'node': 'B', 'cluster': 'A', 'mount': 'C'}, 
{'node': 'B', 'cluster': 'A', 'mount': 'D'}, 
{'node': 'B', 'cluster': 'A', 'mount': 'E'}] 
3

你可以使用一個列表理解與itertools.product

>>> from itertools import product 
>>> [dict(zip(data.keys(), prod)) for prod in product(*data.values())] 
[{'cluster': 'A', 'mount': 'C', 'node': 'B'}, 
{'cluster': 'A', 'mount': 'D', 'node': 'B'}, 
{'cluster': 'A', 'mount': 'E', 'node': 'B'}] 

如果另一個變量包含一個列表,它甚至可以工作:

>>> data = {'cluster': ['A', 'B'], 'node': 'B', 'mount': ['C', 'D', 'E']} 
>>> [dict(zip(data.keys(), prod)) for prod in product(*data.values())] 
[{'cluster': 'A', 'mount': 'C', 'node': 'B'}, 
{'cluster': 'B', 'mount': 'C', 'node': 'B'}, 
{'cluster': 'A', 'mount': 'D', 'node': 'B'}, 
{'cluster': 'B', 'mount': 'D', 'node': 'B'}, 
{'cluster': 'A', 'mount': 'E', 'node': 'B'}, 
{'cluster': 'B', 'mount': 'E', 'node': 'B'}]