【易错】Python中for循环删除元素,有个坑,请勿入坑!!

前言

如果有一道程序题,要求删除容器类型中的元素,而且要符合某个条件,所有元素才能删除;一般人会想到,使用for循环遍历出每个元素,再使用if进行条件判断,符合条件就删除。这样你就会陷于一个坑中。

例题1:删除列表中是"大云"的所有元素。

错误的写法:

li = ["紫云","大云","大云","大云","玉溪","紫钻"]
for ele in li:
    if ele == "大云":
        li.remove(ele)

print(li) # ['紫云', '大云', '玉溪', '紫钻']

从上面代码中,可以看到这种代码写法,无法删除所有"大云"的所有元素,原因在于for循环。当第1次for循环,删除元素后,原li列表第2个元素下标为1的就会变成0,而且for循环已经遍历了一次下标为0的元素(不可能从重新遍历),下次就遍历下标为1的元素,这样就造成,符合条件的元素,钻了一个空子,遍历不到它,导致列表元素中符合条件的,没有删到。

正确的代码写法如下:
 

li = ["紫云","大云","大云","大云","玉溪","紫钻"]
removeLi = []
for ele in li:
    if ele == '大云':
        removeLi.append(ele)
# print(removeLi) # ['大云', '大云', '大云']
for i in removeLi:
    li.remove(i)
print(li) # ['紫云', '玉溪', '紫钻']

例题2:移除所有姓为"张"的元素

错误的写法:

li = ['张瑞','张默','张泽','张茹','陈墨','王明']
for ele in li:
    if ele.startswith('张'):
        li.remove(ele)
print(li) # ['张默', '张茹', '陈墨', '王明']

正确的写法:

li = ['张瑞','张默','张泽','张茹','陈墨','王明']
zhangs = [] # 存放要删除的名字
for ele in li:
    if ele.startswith('张'):
        zhangs.append(ele)
# print(li) # ['张瑞', '张默', '张泽', '张茹', '陈墨', '王明']
# print(zhangs) # ['张瑞', '张默', '张泽', '张茹']
# 移除li中含有姓张的所有数据
for i in zhangs: # 遍历存放要删除的名字
    li.remove(i) # 删除li列表中key为i的值
print(li) # ['陈墨', '王明']
  • 上面是以列表为例子,下面谈谈字典类型,具体先遍历出key键名,再根据key键名,删除字典的键值对。
# 正确写法
dic = {'提莫':'冯提莫','发姐':'陈一发儿','55开':'卢本伟'}
li = []
for k in dic:
    li.append(k)
print(li) # ['提莫', '发姐', '55开']
for ele in li:
    dic.pop(ele)
print(dic) # {}

今天就分享到这了,更多精彩的资料下方领取哦!

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值