簡體   English   中英

將字典元組轉換為嵌套字典

[英]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'}]}}

免責聲明! 這會就地修改s1pop改變子句,返回該鍵的值(如果存在)。

要處理KeyErrors,您可以提供合適的默認值 - s.pop('cloud', 'default') ,其中defaultcloud密鑰不存在時返回的值。

問題是您正在嘗試將三個詞典映射到相同的鍵。 如果你把它作為字典列表,它就可以了。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM