当前位置:  开发笔记 > 编程语言 > 正文

如何在Python中通过索引从列表中删除元素?

如何解决《如何在Python中通过索引从列表中删除元素?》经验,为你挑选了14个好方法。

如何在Python中通过索引从列表中删除元素?

我找到了list.remove方法,但是说我要删除最后一个元素,我该怎么做?似乎默认删除搜索列表,但我不希望执行任何搜索.



1> 小智..:

使用del并指定要删除的元素的索引:

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del a[-1]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8]

还支持切片:

>>> del a[2:4]
>>> a
[0, 1, 4, 5, 6, 7, 8, 9]

这是教程中的部分.


pop()返回要删除的元素.del just删除是.
谢谢,pop和del有什么区别?
del超载.例如,del a删除整个列表
另一个例子del a [2:4],删除元素2和3
我在那里看不到"链表"的证明.请看http://svn.python.org/projects/python/trunk/Objects/listobject.c.PyList_GetItem()`本质上如何返回`((PyListObject*)op) - > ob_item [i];` - `我是数组的元素.
@smci直接转到那个索引.长度是已知的(因为它在列表中的某处注明),我只是转到列表中包含的`l-1`引用(它作为数组位于内存中).
@smci这不是证明.您正在比较所包含元素的ID.这与数据存储在列表中的方式无关.

2> Jarret Hardi..:

你可能想要pop:

a = ['a', 'b', 'c', 'd']
a.pop(1)

# now a is ['a', 'c', 'd']

默认情况下,pop不带任何参数会删除最后一项:

a = ['a', 'b', 'c', 'd']
a.pop()

# now a is ['a', 'b', 'c']


我不同意.如果您知道程序员的"pop"的词源(它是删除并返回'堆栈'数据结构的**顶部**的操作),那么`pop()`本身就非常明显,而`pop( -1)`可能会引起混淆_因为它是多余的.
不要忘记pop(-1).是的,这是默认设置,但我更喜欢它,所以我不必记住默认情况下哪个结束弹出使用.
顺便说一句,`pop()`返回它删除的任何元素.
@ zx1986大多数编程语言中的`pop`通常会删除最后一项,就像在Python中一样.所以无论你指定-1还是什么都没有.

3> Raghav RV..:

像其他人一样,pop和del是删除给定索引项有效方法.然而,仅仅是为了完成(因为同样的事情可以通过Python中的许多方式完成):

使用切片(这不会从原始列表中删除项目):

(这也是使用Python列表时效率最低的方法,但是当处理不支持pop的用户定义对象时,这可能很有用(但是效率不高,我重申),但是定义了a __getitem__):

>>> a = [1, 2, 3, 4, 5, 6]
>>> index = 3 # Only positive index

>>> a = a[:index] + a[index+1 :]
# a is now [1, 2, 3, 5, 6]

注意:请注意,此方法不会像pop和那样修改列表del.它改为生成两个列表副本(一个从开始到索引但没有它(a[:index]),一个在索引之后直到最后一个元素(a[index+1:]))并通过添加两个来创建一个新的列表对象.然后将其重新分配给list变量(a).因此,旧列表对象被解除引用并因此被垃圾收集(假设原始列表对象不被除了a之外的任何变量引用).

这使得该方法效率非常低并且还可能产生不期望的副作用(特别是当其他变量指向原始列表对象时仍未修改).

感谢@MarkDickinson指出这一点......

此 Stack Overflow答案解释了切片的概念.

另请注意,这仅适用于正指数.

在使用对象时,__getitem__必须已定义该__add__方法,更重要的是必须定义该方法以返回包含两个操作数的项的对象.

实质上,这适用于类定义如下的任何对象:

class foo(object):
    def __init__(self, items):
        self.items = items

    def __getitem__(self, index):
        return foo(self.items[index])

    def __add__(self, right):
        return foo( self.items + right.items )

这与list定义__getitem____add__方法一起使用.

在效率方面比较三种方式:

假设以下内容已预定义:

a = range(10)
index = 3

del object[index]方法:

到目前为止最有效的方法.它适用于定义__del__方法的所有对象.

拆卸如下:

码:

def del_method():
    global a
    global index
    del a[index]

拆卸:

 10    0 LOAD_GLOBAL     0 (a)
       3 LOAD_GLOBAL     1 (index)
       6 DELETE_SUBSCR   # This is the line that deletes the item
       7 LOAD_CONST      0 (None)
      10 RETURN_VALUE
None

pop 方法:

它的效率低于del方法,并且在需要获取已删除的项目时使用.

码:

def pop_method():
    global a
    global index
    a.pop(index)

拆卸:

 17     0 LOAD_GLOBAL     0 (a)
        3 LOAD_ATTR       1 (pop)
        6 LOAD_GLOBAL     2 (index)
        9 CALL_FUNCTION   1
       12 POP_TOP
       13 LOAD_CONST      0 (None)
       16 RETURN_VALUE

切片和添加方法.

效率最低.

码:

def slice_method():
    global a
    global index
    a = a[:index] + a[index+1:]

拆卸:

 24     0 LOAD_GLOBAL    0 (a)
        3 LOAD_GLOBAL    1 (index)
        6 SLICE+2
        7 LOAD_GLOBAL    0 (a)
       10 LOAD_GLOBAL    1 (index)
       13 LOAD_CONST     1 (1)
       16 BINARY_ADD
       17 SLICE+1
       18 BINARY_ADD
       19 STORE_GLOBAL   0 (a)
       22 LOAD_CONST     0 (None)
       25 RETURN_VALUE
None

注意:在所有三个反汇编中忽略最后两行基本上是return None.前两行也是加载全局值aindex.


也许答案并非完全基于主题,但如果您需要省略不可变对象(例如元组)中的项,则索引方法很有用.pop()和del()在这种情况下不起作用.
@ rvraghav93在所有提出的方法中,在整个帖子中,`a = a [:index] + a [index + 1:]`-trick是最好的,当涉及到巨大的列表时.所有其他方法最终陷入僵局.非常感谢你
切片方法不会从列表中删除元素:而是创建一个*new*list对象,其中包含原始列表中除第i个条目以外的所有条目.原始列表未经修改.
确实马克,你脾气暴躁.这个答案是我最喜欢的,因为它真的是教学法.我从这个答案和所提供的拆卸细节以及对性能的影响中学到了很多东西.再加上切片方法,是的,创建另一个对象,但现在它被指定,有时这也是你需要的.

4> boatcoder..:

pop从列表中删除和保留项目也很有用.del实际上在哪里破坏物品.

>>> x = [1, 2, 3, 4]

>>> p = x.pop(1)
>>> p
    2



5> Neil Chowdhu..:

这取决于你想做什么.

如果要返回删除的元素,请使用pop():

>>> l = [1, 2, 3, 4, 5]
>>> l.pop(2)
3
>>> l
[1, 2, 4, 5]

但是,如果您只想删除元素,请使用del:

>>> l = [1, 2, 3, 4, 5]
>>> del l[2]
>>> l
[1, 2, 4, 5]

此外,del允许您使用切片(例如del[2:]).



6> Mayur Koshti..:

一般来说,我使用以下方法:

>>> myList = [10,20,30,40,50]
>>> rmovIndxNo = 3
>>> del myList[rmovIndxNo]
>>> myList
[10, 20, 30, 50]



7> xiaojia zhan..:

如果要删除列表中的特定位置元素,例如2日,3日和7日.你不能用

del my_list[2]
del my_list[3]
del my_list[7]

由于在删除第二个元素后,实际删除的第三个元素是原始列表中的第四个元素.您可以过滤原始列表中的第2,第3和第7个元素并获取新列表,如下所示:

new list = [j for i, j in enumerate(my_list) if i not in [2, 3, 7]]



8> 小智..:

另一种通过索引从列表中删除元素的方法.

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# remove the element at index 3
a[3:4] = []
# a is now [0, 1, 2, 4, 5, 6, 7, 8, 9]

# remove the elements from index 3 to index 6
a[3:7] = []
# a is now [0, 1, 2, 7, 8, 9]

a [x:y]指向从索引x到的元素y-1.当我们将列表的那部分声明为空列表([])时,将删除这些元素.



9> SollyBunny..:

您可以只搜索要删除的项目.这很简单.例:

    letters = ["a", "b", "c", "d", "e"]
    letters.remove(letters[1])
    print(*letters) # Used with a * to make it unpack you don't have to (Python 3.x or newer)

输出:acde


我喜欢这个解决方案,但当然它假设你的列表没有重复.

10> jitsm555..:

使用以下代码从列表中删除元素:

list = [1, 2, 3, 4]
list.remove(1)
print(list)

output = [2, 3, 4]

如果要从列表中删除索引元素数据,请使用:

list = [1, 2, 3, 4]
list.remove(list[2])
print(list)
output : [1, 2, 4]


这不是通过索引删除,而是通过匹配值删除.对于访问这里的一些人来说,这可能是有价值的信息,但根本不会尝试回答OP问题.
请注意,您的列表不能包含重复项。

11> litepresence..:

如前所述,最佳实践是del(); 或pop()如果你需要知道值.

另一种解决方案是仅重新堆叠您想要的元素:

    a = ['a', 'b', 'c', 'd'] 

    def remove_element(list_,index_):
        clipboard = []
        for i in range(len(list_)):
            if i is not index_:
                clipboard.append(list_[i])
        return clipboard

    print(remove_element(a,2))

    >> ['a', 'b', 'd']

eta:嗯...不会对负指数值起作用,会进行思考和更新

我想

if index_<0:index_=len(list_)+index_

会修补它...但突然间这个想法似乎非常脆弱.虽然有趣的思想实验.似乎应该有一个"正确"的方法来执行append()/ list comprehension.

琢磨



12> Mo Ali..:

听起来你并没有使用列表列表,所以我会保持这个简短.你想使用pop,因为它将删除元素而不是列表元素,你应该使用del.要调用python中的最后一个元素,它是"-1"

>>> test = ['item1', 'item2']
>>> test.pop(-1)
'item2'
>>> test
['item1']



13> Jo Ja..:

l - 值列表; 我们必须从inds2rem列表中删除索引.

l = range(20)
inds2rem = [2,5,1,7]
map(lambda x: l.pop(x), sorted(inds2rem, key = lambda x:-x))

>>> l
[0, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]



14> lloydyu24..:

使用"del"功能:

del listName[-N]

例如,如果要删除最后3项,则代码应为:

del listName[-3:]

例如,如果要删除最后8个项目,则代码应为:

del listName[-8:]

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有