You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将字典元组转换为嵌套字典的代码问题求助

解决字典元组转嵌套字典的分组问题

我来帮你搞定这个问题~首先咱们得弄明白你当前代码为啥得不到期望的结果:

你用的字典推导式里,每次遇到同一个cloud值(比如google或者aws),新生成的服务器字典会直接覆盖掉之前的——因为字典的键是唯一的,所以循环到最后,每个cloud只会保留最后一条服务器数据,这就是为啥你最后只看到aws的最后一台服务器。

接下来给你两种靠谱的实现方式,都能实现按cloud分组,把对应所有服务器信息存起来:

方法一:普通循环(直观易懂)

这种方式逻辑清晰,适合刚接触这类场景的同学:

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

# 遍历每台服务器的数据
for server in s1:
    # 取出当前服务器所属的云厂商
    cloud = server['cloud']
    # 生成不含cloud字段的服务器信息字典
    server_info = {key: value for key, value in server.items() if key != 'cloud'}
    
    # 如果这个云厂商还没在分组里,先初始化一个列表(用来存多台服务器)
    if cloud not in mydict['mine']:
        mydict['mine'][cloud] = []
    # 把当前服务器信息添加到对应云厂商的列表里
    mydict['mine'][cloud].append(server_info)

print(mydict)

运行后你会得到期望的结果:

{'mine': {'google': [{'server_id': 'myserver1', 'time': '1hr'}, {'server_id': 'myserver3', 'time': '1hr'}], 'aws': [{'server_id': 'myserver2', 'time': '2hr'}, {'server_id': 'myserver4', 'time': '3hr'}]}}

方法二:用collections.defaultdict简化代码

如果想让代码更简洁,可以用Python标准库的defaultdict,它会自动帮我们处理键不存在的情况:

from collections import defaultdict

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

# 初始化一个默认值为列表的字典
cloud_groups = defaultdict(list)

for server in s1:
    cloud = server['cloud']
    server_info = {key: value for key, value in server.items() if key != 'cloud'}
    # 直接添加,不用判断键是否存在
    cloud_groups[cloud].append(server_info)

# 转换成普通字典后放到目标结构里
mydict = {'mine': dict(cloud_groups)}
print(mydict)

这个代码的运行结果和方法一完全一致,只是写法更简洁。

额外拓展:如果想按server_id作为子键

要是你希望每个云厂商下面的服务器用server_id作为键(而不是列表),可以这么调整:

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': {}}
for server in s1:
    cloud = server['cloud']
    server_id = server['server_id']
    # 生成不含cloud和server_id的信息字典
    server_info = {key: value for key, value in server.items() if key not in ['cloud', 'server_id']}
    
    if cloud not in mydict['mine']:
        mydict['mine'][cloud] = {}
    mydict['mine'][cloud][server_id] = server_info

print(mydict)

运行结果会是:

{'mine': {'google': {'myserver1': {'time': '1hr'}, 'myserver3': {'time': '1hr'}}, 'aws': {'myserver2': {'time': '2hr'}, 'myserver4': {'time': '3hr'}}}}

内容的提问来源于stack exchange,提问作者sudeep Krishnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:29:19