python:返回没有给定元素的列表的函数

python:返回没有给定元素的列表的函数,python,Python,我熟悉list.remove,它将通过删除传递的元素的第一个实例来改变列表,如果该元素不存在,则会引发值错误 我要寻找的是一个函数,它不改变列表,而是返回一个没有给定元素的列表副本。因此,例如,不是执行 l = [1,2,3] l.remove(2) 我会执行 l = [1,2,3].remove(2) 这样做的目的是使将这种类型的逻辑放入dict定义中变得更简单。因此,与其说: l = [1,2,3] l.remove(2) d = { 'theList': l } 我只是 d =

我熟悉
list.remove
,它将通过删除传递的元素的第一个实例来改变列表,如果该元素不存在,则会引发值错误

我要寻找的是一个函数,它不改变列表,而是返回一个没有给定元素的列表副本。因此,例如,不是执行

l = [1,2,3]
l.remove(2)
我会执行

l = [1,2,3].remove(2)
这样做的目的是使将这种类型的逻辑放入dict定义中变得更简单。因此,与其说:

l = [1,2,3]
l.remove(2)
d = {
  'theList': l
}
我只是

d = {
  'theList': [1,2,3].remove(2)
}
这样的功能存在吗


请注意,我只想删除所讨论的值的第一个实例,而不是所有实例,因此
[x在[1,2,3]中代表x,如果x!=2]
不符合我的要求。尽管我不确定是否有一种列表理解方法可以做到这一点。

对于
列表
类型,这样的方法并不存在

不过,您可以先复制列表,删除元素并返回新列表,然后自己编写

代码 例子
您可以使用
索引

a = [1,2,3]
{'a': a[:a.index(2)] + a[a.index(2)+1:]}
或作为功能:

def remove(a, e):
    idx = a.index(e)
    return a[:idx] + a[idx+1:]
你能做到:

lst = [1, 2, 3]

def remove(l, i):
    r = l[:]
    r.remove(i)
    return r

>>> remove(lst, 2)
[1, 3]
>>> lst 
[1, 2, 3]

答案真的能改善代码的复杂性吗?@roganjosh嗯,它可以防止不必要的局部变量,例如,我的linter抱怨的。我感觉它们比你目前的方法慢,例如,对列表进行双重索引,然后将结果连接起来。或者复制整个列表。我不确定我是否会相信这里的门楣,但我希望它是定时的。而且,在我看来,没有可读性。@Aran Fey我可以用“有趣”来代替“整洁”,如果你愿意的话。Copy remove比itertools和索引解决方案要好得多。再清楚不过了。@Aran Fey因为速度慢了大约4-5倍,所以我将简单地删除itlist。remove返回None,而不是列表。
def remove(a, e):
    idx = a.index(e)
    return a[:idx] + a[idx+1:]
lst = [1, 2, 3]

def remove(l, i):
    r = l[:]
    r.remove(i)
    return r

>>> remove(lst, 2)
[1, 3]
>>> lst 
[1, 2, 3]