Python删除列表最小第二元素项 报索引不能为列表错误
错误产生原因
报错来自代码的两处问题:
- 变量名覆盖导致索引类型错误:出错行
x = [x for x in x if x[x][1] != x[0][1]]中,列表推导式的迭代变量和外层存储排序列表的变量同名,都叫x。迭代过程中,x会被赋值为每次取到的子列表(比如["Rachel", -50]),此时写x[x]相当于拿列表类型的值当索引去访问列表,而Python要求列表索引必须是整数或切片,因此直接抛出"List indices must be integers or slices, not list"错误。 - 取值逻辑错误:就算修正变量名冲突,
x[x][1]的写法也不成立——你需要判断的是当前遍历到的子元素自身的第二个字段值,不需要用子元素当索引去访问外层列表。另外如果直接在筛选条件里取x[0][1]当最小值基准,逻辑也不稳定:列表推导式执行过程中新的x还未完成赋值,一旦筛选过程中第一个元素被过滤,后续判断的基准值就会出错。
仅使用变量x的实现方案
完全可以仅通过变量x完成“删除所有第二个元素为最小值的条目”的需求,实现逻辑如下:
- 对原嵌套列表按第二个元素排序,结果赋值给x
- 在x未被修改时,先取出最小值(排序后第一个元素的第二个字段,取值稳定)
- 遍历排序后的列表,筛选出所有第二个字段不等于最小值的条目,重新赋值给x即可
修正后的可运行代码:
mlist = [["Rachel", -50],["Mawer", -50],["Sheen",-50],["Shaheen",51]] x = sorted(mlist, key=lambda item: item[1]) # 提前取出最小值,避免后续筛选时基准值变化 min_val = x[0][1] # 迭代变量不要和外层x重名,过滤掉所有值等于最小值的条目 x = [item for item in x if item[1] != min_val] # 调试打印校验结果 print(x) # 输出:[['Shaheen', 51]],符合预期
如果需要实现原代码中“将剩余条目按名字排序后逐行输出”的逻辑,也可以直接操作x完成,不需要额外定义其他列表变量:
# 按姓名字段排序 x.sort(key=lambda item: item[0]) # 逐行打印名字 for name, _ in x: print(name)
内容的提问来源于stack exchange,提问作者Mindtrip
相关产品推荐
相关产品推荐

