[英]Convert a Tuple of dictionary to nested dictionary
我的代碼有問題
s1 = ({'server_id':'myserver1','cloud':'google','time':'1hr'},
{'server_id':'myserver2','cloud':'aws','time':'2hr'},
{'server_id':'myserver3','cloud':'google','time':'1hr'}
{'server_id':'myserver4','cloud':'aws','time':'3hr'})
mydict = {'mine':
{data[i]:
{key:value for key,value in data.iteritems() if key!='cloud'}
for data in s1 for i in data if i=='cloud'}}
print mydict
結果:
{'mine': {'aws': {'server_id': 'myserver3','time':'3hr'}}}
但我期待這樣的結果
{'mine':
{'aws':
{'server_id': 'myserver1','time':'1hr'},
{'server_id': 'myserver3','time':'3hr'}},
{
'google':
{'server_id': 'myserver2','time':'2hr'},
{'server_id': 'myserver4','time':'4hr'}}}
任何人都可以幫我這個嗎?
考慮初始化字典並在循環內附加到它。 使用dict.pop
負責擺脫cloud
密鑰,而不必像現在這樣迭代整個事物。
from collections import defaultdict
d = defaultdict(list) # {}
for s in s1:
d[s.pop('cloud')].append(s) # d.setdefault(s.pop('cloud'), []).append(s)
{'mine' : dict(d)}
{'mine': {'aws': [{'server_id': 'myserver1', 'time': '1hr'},
{'server_id': 'myserver2', 'time': '2hr'},
{'server_id': 'myserver3', 'time': '3hr'}]}}
免責聲明! 這會就地修改s1
( pop
改變子句,返回該鍵的值(如果存在)。
要處理KeyErrors,您可以提供合適的默認值 - s.pop('cloud', 'default')
,其中default
是cloud
密鑰不存在時返回的值。
問題是您正在嘗試將三個詞典映射到相同的鍵。 如果你把它作為字典列表,它就可以了。
s1 = ({'server_id':'myserver1','cloud':'aws','time':'1hr'},
{'server_id':'myserver2','cloud':'aws','time':'2hr'},
{'server_id':'myserver3','cloud':'aws','time':'3hr'})
mydict = {'mine':
{data['cloud']:
[{key:value for key, value in data.iteritems() if key != "cloud"}
for data in s1]}}
print mydict
輸出:
{'mine': {'aws': [{'server_id': 'myserver1', 'time': '1hr'},
{'server_id': 'myserver2', 'time': '2hr'},
{'server_id': 'myserver3', 'time': '3hr'}]}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.