如何解决删除列表含星号元素时的索引越界及删除不彻底问题
如何正确删除二维列表中包含星号(*)的元素?
嘿,我来帮你拆解下这两种写法的问题,然后给你两个靠谱的解决方案~
为什么你的两种写法会出问题?
第一种遍历删除的问题
当你用for j in i直接遍历子列表时,同时调用i.remove(j)会打乱迭代器的遍历顺序。举个例子:原先是[' 0 ', '*X*', '*Y*', '*Z*']的子列表,删除*X*后,列表变成[' 0 ', '*Y*', '*Z*'],此时迭代器会直接跳到下一个元素*Z*,跳过了*Y*——不仅删不干净,极端情况下还会因为列表长度突变触发索引相关的错误。
第二种索引遍历的问题
用for j in range(len(a[i]))正向遍历索引时,删除元素会导致后面的元素前移。比如当你删除j=1位置的*X*后,原来的*Y*会移到j=1的位置,但下一次j会递增到2,直接跳过了现在在j=1的*Y*,所以它没被删除。
正确的解决方法
推荐两种简单可靠的方式,按需选择:
方法1:生成新列表(最安全简洁,优先推荐)
不要直接修改原列表,用列表推导式过滤掉包含*的元素,这种方式可读性高,还不会踩迭代的坑:
a = [[' 0 ', '*X*', '*Y*', '*Z*'], [' 0 ', '*X*', '*Y*', '*Z*'], [' 0 ', '*X*', '*Y*', '*Z*']] # 对每个子列表过滤,只保留不含*的元素 a = [[item for item in sublist if '*' not in item] for sublist in a]
执行后,a会变成[[' 0 '], [' 0 '], [' 0 ']],完全符合需求。
方法2:倒序遍历索引删除(必须修改原列表时用)
如果一定要在原列表上修改,可以倒序遍历索引——这样删除元素后,前面未遍历的元素索引不会受影响,不会跳过任何需要删除的项:
a = [[' 0 ', '*X*', '*Y*', '*Z*'], [' 0 ', '*X*', '*Y*', '*Z*'], [' 0 ', '*X*', '*Y*', '*Z*']] for sublist in a: # 从最后一个元素的索引开始,往前遍历到0 for j in range(len(sublist)-1, -1, -1): if '*' in sublist[j]: del sublist[j]
这种方式也能得到和方法1一样的结果。
内容的提问来源于stack exchange,提问作者elfa26
相关产品推荐
相关产品推荐

