如何从嵌套字典的列表中提取指定服务器的所有exp值?
问题:提取嵌套字典中指定服务器的用户exp值
给定如下嵌套字典结构:
{"0": {"server": 681262466650734596, "channel": 693639674841006101, "balance": 1000, "bal2": 30000, "regd": [{"user": 624748908479905812, "exp": 2015.0, "rank": 2, "points": 125.69999999999996, "msgs": 9999, "tokens": 10000}, {"user": 1096531392369807492, "exp": 501.0, "rank": 1, "points": 1.4000000000000004, "msgs": 1, "tokens": 10000}, {"user": 603657446233210908, "exp": 600, "rank": 2, "points": 169, "msgs": 0, "tokens": 12000}, {"user": 248793436293955584, "exp": 630, "rank": 2, "points": 169, "msgs": 0, "tokens": 12000}, {"user": 217098431393431553, "exp": 555, "rank": 2, "points": 169, "msgs": 0, "tokens": 12000}]}}
需要编写Python函数,接收服务器编号参数,找到匹配服务器的条目后,提取regd列表中所有元素的exp值,预期输出为[2015.0, 501.0, 600, 630, 555]。以下是对现有两个函数的问题排查及修复方案:
现有函数问题分析
函数1问题点:
def PBX(self, User: int, Server: int): dop = self.ReadLevel() for key, value_key in dop.items(): if value_key['server'] == Server: nd = value_key['regd'] for key, value in nd.items(): # 错误:regd是列表,不是字典,不能用items() if 'exp' in key: # 错误:key是列表索引,不是字典键,判断逻辑完全错误 res = [] # 错误:每次循环初始化列表,无法累积结果 res.append(value['exp']) print(res) return # 错误:找到第一个元素就返回,无法收集所有exp值
regd是列表类型,遍历应该直接取元素,而非用items()- 判断
'exp' in key逻辑错误,key是列表的索引(整数),不是用户字典的键 - 结果列表
res在循环内初始化,每次循环都会清空之前的内容 - 提前
return导致只处理第一个元素就退出,无法收集所有exp值
函数2问题点:
def PBX(self, User: int, Server: int): dop = self.ReadLevel() for key, value_key in dop.items(): if value_key['server'] == Server: nd = value_key['regd'] res = [] for value_key in nd: exp_value = value_key['exp'] if exp_value is not None: # 错误:无法判断'exp'键是否存在,若键不存在会直接报错 res.append(exp_value) return print(res) # 错误:添加第一个元素就返回,只得到单个值 return []
- 循环内添加第一个exp值后就
return,导致只返回第一个结果,无法收集全部 - 用
exp_value is not None无法处理exp键不存在的情况,会直接抛出KeyError
修复后的函数
def PBX(self, User: int, Server: int): dop = self.ReadLevel() for entry in dop.values(): if entry['server'] == Server: # 遍历regd列表,提取每个用户的exp值,处理键不存在的情况 return [user.get('exp') for user in entry['regd'] if user.get('exp') is not None] # 未找到匹配服务器时返回空列表 return []
修复说明:
- 直接遍历字典的值(
dop.values()),无需关注外层键 - 使用列表推导式简洁收集所有
exp值,同时用get('exp')避免键不存在的报错 - 遍历完所有用户条目后再返回结果,确保收集全部exp值
- 若服务器未匹配,返回空列表
测试验证:
传入服务器编号681262466650734596,函数将返回预期结果:
[2015.0, 501.0, 600, 630, 555]
内容的提问来源于stack exchange,提问作者Roy Eastman-Kodak
相关产品推荐
相关产品推荐

