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

运行Python代码时出现list indices类型错误,请求技术支援

解决 "list indices must be integers or slices, not str" 错误

这个错误的核心逻辑很直白:你尝试用字符串当作列表的索引了——列表只能接受整数(比如my_list[0])或者切片(比如my_list[1:3])作为索引,而你在代码里把某个列表当成字典来用,用字符串键去取值,自然就触发了报错。

结合你的代码来看,最可能的触发场景有两个:

  • API返回结构不符合预期:requests.get(...).json()["items"] 获取到的data可能不是你预想的列表,而是一个字典。这时for x in data会遍历字典的键(字符串),后续执行x["backendType"]就会报错——因为x本身是字符串,你用字符串当索引去访问字符串的元素,完全不符合规则。
  • 列表中混入非字典元素:如果data确实是列表,但里面的部分元素不是字典(比如是嵌套列表),那么x["backendType"]同样会报错,因为列表不支持字符串索引。

修复后的代码

我帮你调整了逻辑,同时增加了异常处理,避免因为API波动或数据格式变化导致崩溃:

import requests
from discord.ext import commands

client = commands.Bot(command_prefix="!")  # 前缀可根据你的实际设置修改

@client.command()
async def skin(ctx):
    skins = ""
    try:
        # 将API请求移至命令内部,每次调用都获取最新数据
        response = requests.get("https://benbotfn.tk/api/v1/cosmetics/br")
        response.raise_for_status()  # 检查请求是否成功
        data = response.json()
        
        # 先验证返回数据的结构是否符合预期
        if "items" not in data or not isinstance(data["items"], list):
            await ctx.send("获取皮肤数据失败:API返回结构异常")
            return
            
        for item in data["items"]:
            # 先确认当前元素是字典,且包含需要的键
            if isinstance(item, dict) and item.get("backendType") == "AthenaCharacter":
                skins += f"{item['name']}:\n{item['id']}\n"
        
        skins = skins if skins else "None"
        await ctx.send(skins)
        
    except requests.exceptions.RequestException as e:
        await ctx.send(f"请求API失败:{str(e)}")
    except Exception as e:
        await ctx.send(f"处理数据时出错:{str(e)}")

关键优化点

  1. 请求逻辑内聚:原来的代码在程序启动时就固定获取一次数据,之后不会更新;现在每次用户调用!skin命令才会拉取最新数据,逻辑更合理。
  2. 增加异常防护:捕获请求失败、JSON解析错误、数据结构异常等情况,避免程序崩溃,同时给用户明确的错误提示。
  3. 类型安全检查:在访问字典键之前,先确认元素是字典且包含目标键,从根源上避免索引类型错误。

内容的提问来源于stack exchange,提问作者Grenade Visuals

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:47:47