如何删除和返回python列表中的元素

如何删除和返回python列表中的元素,python,list,Python,List,在python中,您可以使用list.pop(i)删除并返回索引i中的元素,但是是否有一个类似list.remove(e)的内置函数,它删除并返回等于e的第一个元素 谢谢,我是说,是的 但是,我不知道为什么需要它来返回删除的元素。您已将其传递到列表。请删除,以便知道它是什么。。。我想如果你在列表中的对象上重载了\uuuuueq\uuuuu,以至于它实际上不符合某种合理的相等概念,你可能会遇到问题。但是不要那样做,因为那样会很糟糕 如果您做了那件可怕的事情,那么不难实现您自己的功能: def re

在python中,您可以使用list.pop(i)删除并返回索引i中的元素,但是是否有一个类似list.remove(e)的内置函数,它删除并返回等于e的第一个元素

谢谢,我是说,是的

但是,我不知道为什么需要它来返回删除的元素。您已将其传递到
列表。请删除
,以便知道它是什么。。。我想如果你在列表中的对象上重载了
\uuuuueq\uuuuu
,以至于它实际上不符合某种合理的相等概念,你可能会遇到问题。但是不要那样做,因为那样会很糟糕

如果您做了那件可怕的事情,那么不难实现您自己的功能:

def remove_and_return(lst, item):
    return lst.pop(lst.index(item))

有内置的吗?不知道。可能是因为如果您已经知道要删除的元素,那么为什么还要麻烦返回它呢?1

你能做的最好的事情就是获取索引,然后弹出它。归根结底,这并不是什么大不了的事情——链式的2O(n)算法仍然是O(n),所以你仍然可以大致上按照相同的比例进行缩放

def extract(lst, item):
    idx = lst.index(item)
    return lst.pop(idx)

1当然,有些病理情况下,退回的物品可能不是您已知的物品。。。但是,它们的重要性还不足以保证一种只需要3行代码就可以编写自己的新方法:-)

严格来说,您需要这样的东西:

def remove(lst, e):
    i = lst.index(e)
    # error if e not in lst
    a = lst[i]
    lst.pop(i)
    return a
只有当
e==a
为真,而
e为a
为假,并且您确实需要
a
而不是
e
时,这才有意义

不过,在大多数情况下,我认为这表明您的代码中存在可疑之处

简短的版本是:

a = lst.pop(lst.index(e))

如果已经定义了
e
,为什么需要返回它?@TidB--它是第一个等于
e
--对象可以用有趣的方式定义它们自己的相等性。。。(他们是否应该一起讨论)从
列表中返回
e
似乎没有意义。删除(e)
,因为返回值只是
e
。也许您希望在未找到e`时不会出现
ValueError
。为了学究气,如果您执行
x.remove(e1)
e2
是被删除的元素
e1==e2
没有
e1是e2
,因此您需要该元素的特定实例-当然,依赖于此的系统是非常值得怀疑的。@sacma这是对该问题的有效回答,答案是不需要所要求的功能。如果确实需要获取列表中的值,请使用
list.index()
@sacma“但不要这样做,因为那样会很糟糕。”这就是这个答案如何解决你提出的问题。@sacma不,我正在排队等待。我不知道你为什么会这么想。据我所知,这是我第一次与您见面。但是,值得一看您正在做什么,并询问依赖于获得与您拥有的元素相等的元素的特定实例是否是一个好的设计想法(几乎肯定不是)。此外,我是否可以建议
extract()
作为这个方法的好名字?@Lattyware——当然可以:-)。我把不平等的事物描述为“病态的”。诚然,有些(非常常见的)库的对象会遇到这个问题<代码>numpy.ndarray
实例立即浮现在脑海中。。。有点遗憾的是,需要做出让步,但我认为numpy开发人员在这里做的事情是正确的,因为重写
=
返回数组确实使您使用numpy执行的更常见的事情的语法更好。
list.pop(I)
返回
a
,因此,无需单独获取。@Lattyware:我只需要命名值,以便将其与解释中的
e
进行比较,我看到,可能希望在回答中澄清这一点。这个(奇怪)条件可能适用的一个示例是
e
a
numpy.ndarray
实例。当然,这个答案在这方面没有帮助,因为他们的
\uuuuueq\uuuuu
不会返回布尔值,甚至不会返回具有非模糊布尔值的值:-)
a = lst.pop(lst.index(e))