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

Python遍历二维列表删除不含指定元素行的代码不生效怎么办

原代码不生效的原因

你写的del cats不会修改原二维列表appdata,因为循环过程中的cats只是每次从appdata中取出的行的临时引用,删除这个临时变量不会对原列表产生任何影响。另外如果直接正向遍历原列表删除元素,还会出现索引错位导致漏删的问题。

贴合原逻辑的实现方案

方案1:新建临时列表存储符合要求的行(新手推荐,最易理解)

完全贴合你筛选保留匹配项的逻辑,不需要处理索引问题:

def categorymenu():
    global appdata # 如果你定义的appdata是全局变量,需要加这个声明才能在函数内修改
    print(catlist)
    catchoice = input('输入你选择的分类: ')
    temp = []
    for cats in appdata:
        # 匹配到分类的行加入临时列表
        if catchoice == cats[1]:
            temp.append(cats)
    # 用筛选后的列表覆盖原列表,完成删除操作
    appdata = temp

用你给出的示例测试运行效果:

# 示例输入(注意字符串需要加引号)
appdata = [['a','b','c','d','e','f'],['a','t','e','g','h','y'],['r','y','i','a','d','c']]
catchoice = 't'
temp = []
for cat in appdata:
    if catchoice == cat[1]:
        temp.append(cat)
appdata = temp
print(appdata)

运行输出:

[['a', 't', 'e', 'g', 'h', 'y']]

完全符合你的预期,后续再叠加筛选也可以直接复用这个逻辑,每次都基于上一次筛选后的appdata再次过滤即可。

方案2:直接删除原列表不符合项(完全匹配你原本的删除逻辑)

如果不想新建列表,要直接删除原列表的不符合项,需要倒序遍历索引避免错位:

def categorymenu():
    global appdata
    print(catlist)
    catchoice = input('输入你选择的分类: ')
    # 从最后一个索引倒着遍历到第一个索引
    for i in range(len(appdata)-1, -1, -1):
        if appdata[i][1] != catchoice:
            del appdata[i]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:36:05