python 原地删除列表中的多个值

 一个问题:如果人脸库中有多个人脸,我们要实现增删功能,想一次删除多个底库的时候的应该怎么设计算法?要求原地删除,不改变顺序

最粗暴的方式是每删除一个元素,就将其后面的所有元素向前移动一个索引。但是并不是很科学,移动次数太多造成复杂度极高。

优化思路:为底库的所有元素创建一个新list,这个list可以保存每个元素在完成删除任务后要向前移动几步,再一次性移动。

class MyFaceData():
    def __init__(self):
        self.data = [None] * 10000 //列表初始化
        self.data_cnt = 0          //列表长度
    
    def addSingleFaceData(self, to_add_data):  //添加元素的方法(不是重点)
        self.data[self.data_cnt] = to_add_data
        self.data_cnt += 1
    
    def delSingleFace(self, to_delete_data):   //删除单个元素的方法
        for index in range(self.data_cnt):
            if( self.data[index] == to_delete_data ):
                for index2 in range(index, self.data_cnt - 1):
                    self.data[index2] = self.data[index2+1]
                self.data_cnt -= 1
                return
    
    def delManyFaceOld(self, to_delete_data_list)://删除多个元素的方法(旧)
        for item in to_delete_data_list:
            self.delSingleFace(item)

    def delManyFace_new(self, to_delete_data_list):  //删除多个元素的方法(新)
        move_step = 0
        for index in range(self.data_cnt):
            if(self.data[index] in to_delete_data_list):
                move_step += 1
            else:
                self.data[index - move_step] = self.data[index]
        self.data_cnt -= move_step

    def __len__(self):
        return self.data_cnt
    def clear(self):
        self.data_cnt = 0

    def printFaceData(self):
        print("**"*50)
        for index in range(self.data_cnt):
            print("index:",index,"     data:",self.data[index]) 



if __name__ == "__main__":
    myFaceData = MyFaceData()
    for i in range(10):
        myFaceData.addSingleFaceData(i+10)
    myFaceData.printFaceData()
    myFaceData.delManyFace_new( [15,16,17])
    myFaceData.printFaceData()

输出如下:

****************************************************************************************************
index: 0      data: 10
index: 1      data: 11
index: 2      data: 12
index: 3      data: 13
index: 4      data: 14
index: 5      data: 15
index: 6      data: 16
index: 7      data: 17
index: 8      data: 18
index: 9      data: 19
****************************************************************************************************
index: 0      data: 10
index: 1      data: 11
index: 2      data: 12
index: 3      data: 13
index: 4      data: 14
index: 5      data: 18
index: 6      data: 19

move_list值为:

[0, 0, 0, 0, 0, 0, 0, 0, 3, 3]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值