神剑山庄资源网 Design By www.hcban.com
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)
神剑山庄资源网 Design By www.hcban.com
神剑山庄资源网
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
神剑山庄资源网 Design By www.hcban.com
暂无Python中remove漏删和索引越界问题的解决的评论...
更新日志
2024年11月18日
2024年11月18日
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】