精华内容
下载资源
问答
  • 给定一个pythonlist对象,想要删除其中指定几个下标所在位置的元素,有什么好的解决方案? e.g. >>> list_given = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> index_to_delete = [1, 3, 6] &g

    缘起

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

    题目

    给定一个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 = 0
      
      for index in index_to_delete:
          index = index - counter
          list_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 - 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] = value
      
      for index in index_to_delete:
          my_dict.pop(index)
      
      result = list(my_dict.values())
      
      这一解决方法本质上与上述新建list的方法没有本质区别,这里只是提供一种思路。

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

    特别鸣谢Skaldak上电。

    展开全文
  • python删除list中某指定元素

    万次阅读 多人点赞 2018-04-09 23:08:58
    python删除一个列表中的某个元素,知道这个元素是什么但不知道它的索引,就可以用list.romove 知道索引的话就可以用del来删除

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

    这里写图片描述

    知道索引的话就可以用del来删除

    这里写图片描述

    展开全文
  • python list删除元素的几种方式

    千次阅读 2018-10-19 10:12:07
    指定元素进行删除 remove(x) remove() 函数用于移除列表中 某个值的第一个匹配项,如果有多个则删除第一个 , 注意list中不存在x,执行会报错 无法指定位置进行删除 >>> a=[1,2,...

    假设我们有一个列表 a=[1,2,3,4,1,2,4,5]

    指定元素进行删除

    remove(x)

    remove() 函数用于移除列表中 某个值的第一个匹配项,如果有多个则删除第一个 ,
    注意list中不存在x,执行会报错
    无法指定位置进行删除

    >>> a=[1,2,3,4,1,2,4,5]
    >>> a.remove(1)
    >>> a
    [2, 3, 4, 1, 2, 4, 5]
    >>> a.remove(7)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: list.remove(x): x not in list
    
    
    

    指定位置进行删除

    pop(index)

    删除index位置上的元素,并返回该位置上的元素值
    如果index越界则会报错

    >>> a=[1,2,3,4,1,2,4,5]
    >>> a.pop(-1)
    5
    >>> a
    [1, 2, 3, 4, 1, 2, 4]
    >>> a.pop(10)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: pop index out of range
    
    

    del x[index]

    和pop所实现的功能是一样的,但是这个没有返回的值

    >>> a=[1,2,3,4,1,2,4,5]
    >>> del a[-1]
    >>> a
    [1, 2, 3, 4, 1, 2, 4]
    >>> del a[-10]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list assignment index out of range
    >>> 
    
    
    展开全文
  • 我们直接先给出输出与预期不同的代码 In[28]: a = [1,2,3,4,5,6...同理,使用list.pop()函数删除指定元素的时候,也会出现上述情况,如: In[33]: a = [1,2,3,4,5,6] In[34]: for index, value in enumerate(a): ...
  • Python3删除列表指定元素

    千次阅读 2019-09-17 18:33:04
    一维列表删除指定元素 test=[1,2,3,4] test.remove(3) ##删除元素3 test.pop(1) ##删除索引为1的元素 print(test) 结果如下: [1, 4] 一维列表删除指定元素一般使用这两种办法,一个是指定元素的值,一个是删除索引...

    一维列表删除指定元素

    test=[1,2,3,4]
    test.remove(3) ##删除元素3
    test.pop(1)    ##删除索引为1的元素
    print(test)
    

    结果如下:
    [1, 4]
    一维列表删除指定元素一般使用这两种办法,一个是指定元素的值,一个是删除索引,也可以使用remove方法指定元素索引,比如test.remove(test[0]),可以删除索引位置为0的元素

    二维列表删除指定元素

    test=[[1,2,3],[4,5,6]]
    print(test[0][2])      ##打印索引位置为0,2的元素
    test.remove(test[0][2])##试图删除3
    print(test)
    

    使用这种方法看起来没有什么错误,但会报以下错误:
    3
    test.remove(test[0][2])##试图删除3
    ValueError: list.remove(x): x not in list
    表示remove方法的参数并不在列表中,但是在打印索引位置是0,2的元素时又输出了3,解决的方法是:在test[0]中调用remove方法即:

    test=[[1,2,3],[4,5,6]]
    print(test[0][2])      ##打印索引位置为0,2的元素
    test[0].remove(test[0][2])##试图删除3
    print(test)
    

    可以得到想要的结果:
    3
    [[1, 2], [4, 5, 6]]

    展开全文
  • Python list列表删除元素(3种方法)

    千次阅读 2019-06-24 12:29:58
    del 语句是 Python 的一种语句,专门用于执行删除操作,不仅可用于删除列表的元素,也可用于删除变量等。 使用 del 语句既可删除列表中的单个元素,也可直接删除列表的中间一段。例如如下代码: a_list = ['...
  • Python list列表删除元素(4种方法)

    千次阅读 2020-04-28 18:19:40
    Python 列表中删除元素主要分为以下 3 种场景: 根据目标元素所在位置的索引进行删除,可以使用 del 关键字或者 pop() 方法; 根据元素本身的值进行删除,可使用列表(list类型)提供的 remove() 方法; 将...
  • 有三种方法:remove()、del、pop() remove() 必须知道列表中的元素的名字,如果用的是...pop() 默认删除列表最后一个元素,但是可以指定pop()然后再括号里面添加索引值进行删除 例如:a=['a','b','c']  a.remove('a')
  • python list删除元素是要注意的坑点

    千次阅读 2018-01-16 17:27:48
    python循环删除列表中的元素的时候,输出不符合我们的预期,简单分析了一下原因与解决方案
  • 主要介绍了Python list列表中删除多个重复元素操作,结合实例形式分析了Python删除list列表重复元素的相关操作技巧与注意事项,需要的朋友可以参考下
  • python删除list元素

    千次阅读 2015-07-02 09:04:24
    li = [1,2,3,4,5,6]1.使用del删除对应下标的元素 del li[2] li = [1,2,4,5,6]2....删除指定值的元素 li.remove(4) li = [1,2,5]4.使用切片来删除 li = li[:-1] li = [1,2] !!!切忌使用这个方法,如果li被作为
  • 如图 我想删除list里面长度为1或2的元素。为什么”P“和”ye“无法被搜寻到?![图片说明](https://img-ask.csdn.net/upload/201609/26/1474885487_548090.png) 结果中没有打印 打印出'P'和'ye' ![图片说明]...
  • 在列表中删除元素,主要分为以下 3 种应用场景: 根据目标元素所在位置的索引值进行删除,可使用 del 语句;...删除列表中指定元素,和删除列表类似,也可以使用del 语句实现。 del 语句是 Pyt...
  • python获取list指定元素的索引 : 使用内置函数 index() list去重有两种方法: 方法一:用in或者not in来判断 li=[1,2,3,4,5,1,2,3] new_li=[] for i in li: if i not in new_li: new_li.append(i) print...
  • python 删除列表中的指定元素 def delete_list(list1,ele):     """     删除列表中的指定元素     :param list1:原列表     :param ele:要删除的元素...
  • del 是 Python 中的关键字,专门用来执行删除操作,它不仅可以删除整个列表,还可以删除列表中的某些元素。我们已经在《Python列表》中讲解了如何删除整个列表,所以本节只讲解如何删除列表元素。www.djznrobot.com ...
  • a = [0,1,2,3] del a[0] print(a)
  • python中使用list的时候,通常需要用到移除其中某些元素,而remove函数就正好可以移除元素,所以就会想到循环遍历list,利用remove函数移除元素,例如下面一段代码:def remove_item(l,n): for item in l: if item...
  • Python删除某个元素的3种方法

    千次阅读 2019-11-10 21:09:57
    python中关于删除list中的某个元素,一般有三种方法:remove、pop、del 1.remove: 删除单个元素删除首个符合条件的元素,按值删除 举例说明: >>> str=[1,2,3,4,5,2,6] >>> str.remove(2) >>...
  • Python之列表list删除元素

    千次阅读 2019-01-05 14:38:50
    0、废话不多说,在List对象中,元素删除,也是很重要的知识点,pop方法会返回删除掉的元素,这是一个很好的点子 1、代码走起 def printListWithChinese(resource): print str(resource).decode('string_escape...
  • python-列表删除所有指定元素

    万次阅读 多人点赞 2017-04-06 18:40:59
    a = [1,1,1,2,3,45,1,2,1] a.remove(1)  result: [1,1,2,3,45,1,2,1] while 1 in a:  a.remove(1) result: [2,3,45,2]
  • python中关于删除list中的某个元素,一般有三种方法:remove、pop、del 1.remove: 删除单个元素删除首个符合条件的元素,按值删除 举例说明: >>> str=[1,2,3,4,5,2,6] >>> str.remove(2) >>...
  • 有两个listlist_1为0-9,list_2为0-4,需要删除list_1中包含在list_2中的元素 list_1 =[] for i in range(10): list_1.append(str(i)) list_1 ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] list_2 =[]...
  • python 删除列表中元素

    千次阅读 2018-01-13 10:54:53
    1. del 删除列表中指定位置上的元素 l = [1,2,3,4,5] del l[2] -> [1,2,4,5] del l -> 删除整个列表 当要用del循环删除元素时,应当倒序删除,否则下标会发生变化; 2. pop 删除并返回指定位置上的元素 l = ...
  • 列表的元素相当于变量,因此程序可以对... a_list = [2, 4, -3.4, 'crazyit', 23] # 对第3个元素赋值 a_list[2] = 'fkit' print(a_list) # [2, 4, 'fkit', 'crazyit', 23] # 对倒数第2个元素赋值 a_list[-2] = 952...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,507
精华内容 29,402
关键字:

pythonlist删除指定元素

python 订阅