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
相关产品推荐
相关产品推荐

