如何用Python从API返回的JSON中提取rating最高值用于Discord机器人开发
实现方案
你原来的代码存在两处核心问题:
udata['legends']中的每一项是字典类型,没有max()方法,直接调用会抛出属性错误- 原逻辑只尝试获取最高数值,没有同步记录对应英雄的名称,无法输出完整信息
你可以直接使用Python内置的max()方法,指定按rating字段排序,直接取出评分最高的英雄对象,修改后的代码如下:
@client.command() async def rankedstats(ctx, msg): id = msg url = f"https://api.brawlhalla.com/player/{id}/ranked?api_key=MY_API_KEY" r = requests.get(url) udata = r.json() uname = udata['name'] upeakrating = udata['peak_rating'] uwins = udata['wins'] urating = udata['rating'] # 替换原for循环,直接获取rating最高的英雄 top_legend = max(udata['legends'], key=lambda item: item['rating']) # 格式化展示信息,名称首字母大写匹配示例效果 top_legend_display = f"{top_legend['legend_name_key'].title()}:{top_legend['rating']}" rsemb = discord.Embed(title="CurrentElo", colour=3092790) rsemb.add_field(name=f"{uname}'s current elo", value=f"{urating}", inline=False) rsemb.add_field(name=f"{uname}'s Peak elo",value=f"{upeakrating}", inline=False) rsemb.add_field(name=f"{uname}'s ranked wins",value=f"{uwins}", inline=False) rsemb.add_field(name="Highest Rated Legend", value=top_legend_display, inline=False) rsemb.set_thumbnail(url="https://p.kindpng.com/picc/s/306-3068244_brawlhalla-will-slam-into-hd-png-download.png") await ctx.send(embed=rsemb)
如果要兼容legends为空的异常场景,可以加一层判断:
if udata['legends']: top_legend = max(udata['legends'], key=lambda item: item['rating']) top_legend_display = f"{top_legend['legend_name_key'].title()}:{top_legend['rating']}" else: top_legend_display = "暂无英雄对战数据"
内容的提问来源于stack exchange,提问作者user14809494
相关产品推荐
相关产品推荐

