首页 > 编程知识 正文

python 提取列表元素,python中下标怎么表示

时间:2023-05-06 02:30:36 阅读:33067 作者:112

吉利最近不再打代码了,昨天一个好兄弟突然过来跟我说要问面试问题,爽快答应后,发现自己被问得很无知,所以做个简单的记录。 关于这个问题的博客很多,但在这里只需总结一下,就能记录下自己的心得。

我想给主题一个python list对象,然后删除其中指定了几个下标位置的元素,有什么好的解决方案?

e.g.list _ given=[ 1,2,3,4,5,6,7,8,9 ] index _ to _ delete=[ 1,3,6 ] delete _ target _ index确定

使用移除方法

python list对象的remove方法有助于删除list中出现的元素,但值得注意的是,remove方法只删除该元素在列表中的第一个出现位置。 具体使用方法如下: list_given=[1、4、3、3、2、3、5、list_given.remove(3) list_given[1、4、3、2、2、3 值得注意的是假如待删除元素不在列表中,调用remove方法会出现ValueError

要删除列表中所有位置的元素,请执行以下操作: list_given=[1、4、3、3、2、2、3、5、7 ] value _ to _ delete=3while value _ to _ delete

list的结构与堆栈非常相似,但两种相应的方法pop和append完全支持堆栈和提要,因此在使用时完全可以用作堆栈。 缺省情况下,pop函数不需要参数,而是直接弹出当前堆栈顶部元素。 当然,由于list设计为不是堆栈,因此可以使用insert方法直接在相应的下标中插入元素,也可以使用带参数的pop方法删除指定下标的元素。 回顾一下我们现在的问题,就会出现常见的想法。 list _ given=[ 1,4,3,3,2,2,3,5,7 ] index _ to _ delete=[ 1,3,6 ] forindexindex _ to _ delete 33365265306; 元素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=0forindexinindex _ to

_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 - counter list_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上电。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。