python列表操作,删除总是失败

本文记录了一位Python新手在尝试从列表中删除特定元素时遇到的挑战。通过一系列的调试和试验,作者发现直接在迭代过程中修改列表会导致索引错乱,最终找到了使用列表切片创建副本并安全删除元素的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天和今天,调试,怎么弄都出不来,其实很简单的需求,就是两个列表A和B ,A里面有2个值,B里边有5个值, 如果列表B中含有A的值,那么从列表B中踢出去,得到一个新B

代码如下

  if uuids is not None and len(servers_list)!=0:
            for i, s in enumerate(servers_list):
                if not s['uuid'] in uuids:
                   servers_list.remove(s)

看起来没有任何问题, 然而,最后的结果怎么都是3个元素,就是不是我想要的2个元素,我调啊,调啊,然后各种打印,都快吐血了。然后我用fori 去遍历,操作。

  if uuids is not None and len(servers_list)!=0:
            for i in range(len(servers_list)):
                if not servers_list[i]['uuid'] in uuids:
                   servers_list.remove(i)

 

报出来一个列表越界错误 ,然后我想起来一个问题,我是在操作同一个列表,然后呢,他的长度就不对了,肯定越界了。 

然后我指定一个新的列表 = servers_list,然后操作新的列表,发现最后还是操作的servers_list. 反正是怎么都不对,各种打印,输出。

最后发现一个问题是,在利用enumerate的时候,总是最后一个值无法删除,条件判断是对的。然后就猜测一下, 最有可能他在遍历的时候这个 i 出现了问题。 然后加上索引i越界,明白了一个问题,从servers_list中根据对象删除 ,不是根据索引 i 删除的时候,我们应该做一个copy ,然后根据copy到的新的列表,去操作servers_list ,这样也不会有索引 i 越界的问题, 删除的时候也不会出现问题了。然后单元测试通过。

  servers_list_iter = servers_list[:]
  if uuids is not None and len(servers_list) != 0:
      for i, s in enumerate(servers_list_iter):
          if not s['uuid'] in uuids:
              servers_list.remove(s)

 

python小白 今天犯了一个错误, 谨记!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值