将字典元组转换为嵌套字典的代码问题求助
解决字典元组转嵌套字典的分组问题
我来帮你搞定这个问题~首先咱们得弄明白你当前代码为啥得不到期望的结果:
你用的字典推导式里,每次遇到同一个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
相关产品推荐
相关产品推荐

