Python list 删除指定多个下标位置的元素——方法汇总

article/2025/8/26 1:12:00

缘起

最近有段时间不敲代码了,昨天一个好兄弟突然跑过来说问我一道面试题,欣然答应之后发现自己一下被问懵了,由此做一下简单记录。关于该问题的博客数目很多,这里只是给一个总结,也算是记录一下自己的心得。

题目

给定一个python的list对象,想要删除其中指定几个下标所在位置的元素,有什么好的解决方案?

e.g.>>> list_given = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> index_to_delete = [1, 3, 6]>>> delete_target_index(list_given)
[1, 3, 5, 6, 8, 9]

分析

应该说本题是一个不错的面试题目,能够考察受试者对Python数据结构以及内存分配问题的了解深度。对于给定的一个list,使用python 删除单个元素的方法有很多,最常见方法如下:

  • 使用remove方法
    python中list对象的remove方法可以帮我们删除list中出现的某个元素,但是值得注意的是,remove方法只会删除掉该元素在列表中第一次出现的位置,具体使用方法如下:
    >>> list_given = [1, 4, 3, 3, 2, 2, 3, 5, 7]
    >>> list_given.remove(3)
    >>> list_given[1, 4, 3, 2, 2, 3, 5, 7]
    
    可以看到,remove方法可以用来删除一个列表中已经存在的元素,但是也只能删除其第一次出现位置的该元素。值得注意的是,假如待删除元素不在列表中,调用remove方法会出现ValueError
    如果想删除列表中所有位置的该元素,可以使用如下代码段:
    >>> list_given = [1, 4, 3, 3, 2, 2, 3, 5, 7]
    >>> value_to_delete = 3
    >>> while value_to_delete in list_given:list_given.remove(value_to_delete)
    >>> list_given[1, 4, 2, 2, 5, 7]
    
    可以看到该方法与我们的本意相去甚远,因此排除该方法。
  • list的pop方法
    list这一结构在设计时与栈颇为类似,而其对应的两种方法popappend与出栈和进栈完全对应,因此在使用时完全可以将其当做堆栈来使用。pop函数在使用时默认也是不需要参数的,直接弹出当前栈顶元素。当然,list在设计时也并非就是堆栈,因此其有insert方法可以直接在对应下标处插入元素,pop方法也可以带参数使用,从而删除指定下标处的元素。回头看我们当前的问题,一种很常见的思路便出现了:
    >>> list_given = [1, 4, 3, 3, 2, 2, 3, 5, 7]
    >>> index_to_delete = [1, 3, 6]
    >>> for index in index_to_delete:list_given.pop(index)
    >>> list_given[1, 3, 3, 2, 3, 5]
    
    好家伙不仔细看你肯定觉得自己写的没啥问题,这不是都给删除掉了?可是定睛一看才发现,问题并没有那么简单。元素5前面的3理应被我删除掉了,它咋阴魂不散呢?这就是很多时候出现问题的地方,python中list是一个动态分配内存空间的对象,因此当你删除了前面元素的时候,后面元素的索引其实已经变掉了,因此你删除的位置在新的list中其实已经发生了改变,这一点可以在内存分配中观察到:
    在这里插入图片描述
    上图为删除元素之前各个元素的索引结果,下面我们单步执行程序,删除掉第一个被要求删除的位置的元素之后效果如图:
    在这里插入图片描述
    可以看到,下标为1位置的元素4已经飞升了,但是与此同时,列表中其余元素的下标也都对应发生了变化,原列表中的索引与新列表已然不同,假如继续使用上述for循环来解决该问题,就会导致错误的删除元素,从而导致新列表与期望结果不一致。
  • 使用delete方法删除
    删除元素的效果与pop方法类似,当然存在的问题也就是类似的,这里不再赘述。

可以看到,以上几种方法均不能很好地解决我们所提出的问题,那么究竟该如何解决这一问题呢?下面给出几种比较优质的思路供大家伙参考。

  • 动态修改待删除的下标
    敌动我不动的被动打法显然不适合这一问题,因此一种解决方法就是动态修改待删除的下标,这叫随机应变。博主之前其实遇到过这个问题,但是一开始被问上的时候确是一下子没想到,因此面试的心态还是相当重要的,更何况我面对的还不是面试官…,太菜了!
    list_given = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    index_to_delete = [1, 3, 6]
    counter = 0for index in index_to_delete:index = index - counterlist_given.pop(index)counter += 1
    >>> list_given[1, 3, 5, 6, 8, 9]
    
    可以看到此时删除之后的列表与我们问题所描述的要求就完全一致了。
  • 使用python自带的counter
    这一解法来自@Skaldak,就是面试官本官。利用python的enumerate方法我们就自行找到了counter
    list_given = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    index_to_delete = [1, 3, 6]for counter, index in enumerate(index_to_delete):index = index - counterlist_given.pop(index)
    

到这里我们就给出了两种很基本的操作方法,这也是python中很常见的操作。但是,问题的本质并没有被发掘出来,那就是下标变化这一问题。下标为什么会变化呢?原因很简单,我们移除了前面的某个元素,其后各个元素的下标自然就发生了变化。那么问题来了,如何不让下标发生变化?其实也很简单,每次我们移除元素的时候,被移除元素之前的所有元素的下标是不会发生变化的,那么思路是不是就有了呢?

  • 逆序遍历法删除元素
    list_given = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    index_to_delete = [1, 3, 6]for index in reversed(index_to_delete):list_given.pop(index)
    
    该方法的有效性在待删除下标数组有序时是不证自明的。在待删除下标数组无序时,需要先进行排序操作(可以考虑直接降序排列,这样子省去了reverse的操作)。

综上所述,很直接的三种方法已经给出来了。可以看到,以上三种操作均基于原始list进行删除,在空间效率上应该说是相当高的。下面介绍的两种方法是牺牲空间复杂度的操作,但是这种曲线救国的思想还是值得借鉴的。

  • 利用列表生成式直接构建新list,上码:
    list_given = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    index_to_delete = [1, 3, 6]new_list = [list_given[i] for i in range(len(list_given)) if i not in index_to_delete]
    
    按照python的特性,这种方式的执行效率可以说是相当高的(列表生成式是python内置的构建方法,执行时间不必多说,懂的都懂:))
  • 利用dict作为中间结构解决上述问题
    目前,我们所遇到的主要问题就是下标的变动问题,那么我们是否可以选择一种无序结构作为中间变量来完成我们删除元素这一任务呢?答案是肯定的,python提供的dict类型可以帮助我们解决这一问题:
    list_given = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    index_to_delete = [1, 3, 6]my_dict = {}
    for index, value in enumerate(list_given):my_dict[index] = valuefor index in index_to_delete:my_dict.pop(index)result = list(my_dict.values())
    
    这一解决方法本质上与上述新建list的方法没有本质区别,这里只是提供一种思路。

到此,本次博客的内容分享结束,希望大家后面有面试的时候提前调整好心态,不要被面试官吓倒,要先吓倒面试官(误)。有问题欢迎评论区交流。

特别鸣谢Skaldak上电。


http://chatgpt.dhexx.cn/article/snmoYwXM.shtml

相关文章

python中删除list中某指定元素

python要删除一个列表中的某个元素,知道这个元素是什么但不知道它的索引,就可以用list.romove 知道索引的话就可以用del来删除

高清图片网站

目录: 1、高清壁纸网站(免费) 2、动漫图片网站(部分需翻墙) 3、高清素材网站(免费) 分割线 一、高清壁纸网站 免费的高清壁纸网站介绍。 2.alphacoders 地址:https://wall.a…

5个高清图片素材网站,免费商用,赶紧收藏~

本期给大家推荐6个超好用的高清图片素材网站,免费下载,还可以商用,建议收藏起来! 1、菜鸟图库 风景图片,高清风景图片大全 - 菜鸟图库 菜鸟图库是我推荐过很多次的一个设计素材网站,除了设计类,还有很多自…

8个好用的图片素材网站,免费资源多,够用一辈子

分享8个好用的免费图片素材网站,不仅图片资源丰富,还能免费商用,强烈建议收藏! 1、Pixabay 一个令人惊叹的免费素材网站,它里面的素材类型有图片、插画、矢量图、视频、音乐、声音特效和GIF,这些素材都可以…

免费好用的图片压缩网站,有这五个就够了(收藏备用)

前言 当我们想要线上报名提交照片时,大小却超过范围,这时就需要压缩软件的帮助。但大多主流的软件可以压缩但想要下载就需要收费了,下面是五个国内外免费的压缩平台。 一、OnlineImage 优点:图片可以压缩90%以上,可以…

找高清图片素材,这8个网站就够了

相信很多设计师、自媒体都为找素材而烦恼,很多朋友不知道去哪里找图片素材,找到了版权还不明确,怕造成侵权,今天我就把我独家珍藏的8个图片素材网站分享给大家,免费下载,还可以商用,建议收藏起来…

这6个超好用的免费图片素材网站,赶紧收藏~

6个高质量图片素材网站,免费可商用,记得收藏! 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYxMjky 菜鸟图库是我推荐过很多次的一个设计素材网站,除了设计类,还有很多自媒体可以用到的素材,比如高…

几个免费的高清图片网站推荐

搞设计找配图,真的很揪心,虽然百度可以搜索到很多,但是可能不是免费的。今天为大家介绍几个实用的图片网站,所有的图片都是免费高清,几个高清图片素材网站推荐,都是免费图片素材下载的网站,非常…

高清图片免费下载网站

高清图片免费下载网站 (如果下面的博客没有能解决你的问题或者你还有其他关于计算机方面的问题需要咨询可以加博主QQ:1732501467) 当你看到一张心仪的照片。想把它当做自己的电脑(手机、平板)壁纸,或者单纯…

优质且免费的10个在线图片设计网站!

1.即时设计 即时设计资源社区是一个开源式免费商用图片素材网站,将社交、作品浏览和模板复用融合在一起。它内置了来自国内外优秀设计系统如TDesign、Arco Design、Ant Design和Material Design等的海量设计规范,以及超过3000个UI组件库和每月更新的上百…

10 个免费的高清图库网站,强烈推荐

转自:https://zhuanlan.zhihu.com/p/23411438 写东西找配图,真的很揪心,虽然从搜索引擎可以搜索很多,但是可能不是免费使用的,今天为大家介绍的这是个网站,所有的图片都是免费高清,你想怎么用就…

8个免费图片素材网,赶紧收藏起来

现在图片素材变得越来越重要了,除了平常设计经常要用到图片之外,大到平常文章、自媒体、视频制作配图,小到我们发朋友圈、日志、说说,都会用到图片来衬托。 但图片版权一直是设计师、自媒体和各大企业的一大难题。 要不就花钱买…

MySQL 开发小型商城管理系统

一、MySQL workbench 的使用 1、打开MySQL workbench的主界面可以看见 2、连接已经存在的数据库(例如上方的local instance mysql 80) 连接时的密码是安装时设置的,仅本机使用可以不设计密码,在弹出的界面中填好sql数据库的连接…

基于springboot的在线商城管理系统

1、项目介绍 基于springboot的在线商城管理系统3拥有两种角色,分别为管理员和用户 管理员:用户信息管理、商品信息管理、类型管理、订单管理、留言管理等用户:商品查看、购买、购物车、订单详情、收藏、意见反馈等 2、项目技术 后端框架&…

基于php的婚纱商城管理系统

摘要 网络技术给生活带来了十分的便利。所以把婚纱商城管理系统与现在网络相结合。在婚纱商城发展的整个过程中,婚纱信息管理担负着最重要的角色。为满足如今日益复杂的管理需求,各类管理系统程序也在不断改进。本课题所设计的婚纱商城管理系统&#xff…

免费分享一个SSM商城管理系统,很漂亮的

大家好,我是锋哥,看到一个不错的SSM商城管理系统,分享下哈。 项目介绍 这是基于SSM框架开发的项目,前端用户界面采用 HtmlcssJavaScriptAjax开发,后台管理页面采用Easyui技术开发。 项目展示 1、主界面 2、商品详…

在线商城和商城后台管理系统

在线商城和商城后台管理系统 1、商城使用了vue2elementUI 实现了登录注册、浏览商品、购买商品、收藏商品、商品搜索、加入购物车、查看订单、添加收货地址、在线客服、分类查看商品的等功能 没什么难的地方,都很基本。随便写下功能实现。 查看商品详情把商品id传…

JavaWeb蛋糕商城管理系统(客户端+后台管理端)+ppt+万字论文

JavaWeb蛋糕商城管理系统 需要资源qq:1597720408获取 一、系统总模块 二、管理员模块流程图 三、用户登录模块 四、各功能模块 1、用户登录模块 2、用户注册模块 3、主页面模块 4、商品分类模块 5、购物车模块 6、结算模块 7、管理员登录模块 8、管理员模块主页面 9、管理员管…

Java项目-宠物商城管理系统

题目:基于JavaWeb宠物商城管理系统的设计与实现-Servlet_宠物店管理系统_jsp_petmall 注意:这里不是全部功能,需要全部功能的可以看评论联系我 1.系统总体设计 1.1开发环境 操作系统:Windows10; 编程语言&#xff1a…

微服务项目之电商--9.商城架构图及商城管理系统前端页面介绍及电商项目初步搭建(1)

目录 一、商城架构图 前端: 二、商城管理系统前端页面 1、SPA介绍 2、webpack 四个核心概念 3、vue-cli 安装 4、项目测试 三、电商项目搭建 创建父模块管理 创建子模板注册中心ly-registry 创建modul子项目ly-gateway 创建ly-item父工程(…