DDR爱好者之家 Design By 杰米
list.remove方法在删除元素的时候往往会出现漏删或者索引越界的情况示例如下:
漏删:
lst=[9,25,12,36] for i in lst: if i>10: lst.remove(i) print(lst)
>[9, 12]
那么为什么12被漏删了呢?其实原理很简单,如图:
列表从下标为0开始遍历,遍历到25时,将25删除,返回一个新的列表:
注意,原来的25对应的下标是1,所以系统会从下标为2的地方开始遍历,但是在新列表中,下标为2的地方变成了36,所以12就被跳过了。
解决方法:
只需要判断如果列表中删除元素,就要重新从0开始遍历列表。
lst=[9,25,12,36] while True: for i in lst: if i>10: lst.remove(i) #如果删除了元素,退出此次遍历,开始遍历新列表 break else: break print(lst)
>[9]
索引越界:
当我们用下标遍历列表时,会出现索引越界的情况,如图:
lst=[9,25,12,36] for i in range(len(lst)): # print(i) if lst[i]>10: lst.remove(lst[i]) print(lst)
IndexError: list index out of range
原理都是一样的,这里 i 的取值为 0 1 2 3 ,当删除一个元素之后,新列表的长度减少,索引变为 0 1 2 ,但是 i 还是根据原来列表的索引取值,所以当 i 取到 3 的时候,新列表没有该元素,索引越界。
解决方法一:
lst=[25,9,12,36] j=0 for i in range(len(lst)): if lst[j]>10: # 下面以j取0为例: # j =0 时对应元素25被删除, # continue的做法的意思是判断新列表的j元素即0元素是否符合条件 lst.remove(lst[j]) continue # 如果新列表的j = 0 处不符合条件,j+1,然后再判断下一个元素。 j+=1 print(lst)
解决方法二(推荐):
如果让索引倒序遍历列表就不会出现越界的问题了。
这样就算新列表的长度减小了,那么i 的取值是倒着取的,列表缺少一个元素对 i 的取值无影响。
例如 i 为3 的元素被删除了,新列表最高索引为2 而此时 i的下一个取值正好是 2 ,没有影响。
lst=[9,25,12,36] for i in range(len(lst)-1,-1,-1): # i : 3 2 1 0 if lst[i]>10: lst.remove(lst[i]) print(lst)
DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米
暂无评论...
更新日志
2025年02月24日
2025年02月24日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]