将字典的元组转换为嵌套字典

2024-10-01 07:31:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码有问题

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'}}}

有人能帮我吗?你知道吗


Tags: keyinawsidcloudfordataserver
2条回答

考虑初始化字典并将其附加到循环中。使用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,如果存在,则返回该键的值。你知道吗

要处理keyrerrors,可以提供一个合适的默认值-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'}]}}

相关问题 更多 >