有没有一种简单的方法可以按值删除列表元素?

我想从列表中删除一个值,如果它存在于列表中(它可能不存在)。

a = [1, 2, 3, 4]b = a.index(6)
del a[b]print(a)

上面给出了错误:

ValueError: list.index(x): x not in list

所以我必须这样做:

a = [1, 2, 3, 4]
try:b = a.index(6)del a[b]except:pass
print(a)

难道没有更简单的方法来做到这一点吗?

1942078 次浏览

要删除元素的首次出现,请使用#0

>>> xs = ['a', 'b', 'c', 'd']>>> xs.remove('b')>>> print(xs)['a', 'c', 'd']

要删除元素的所有事件,请使用列表理解

>>> xs = ['a', 'b', 'c', 'd', 'b', 'b', 'b', 'b']>>> xs = [x for x in xs if x != 'b']>>> print(xs)['a', 'c', 'd']

你能做到的

a=[1,2,3,4]if 6 in a:a.remove(6)

但是上面需要在列表a中搜索6 2次,所以尝试除了会更快

try:a.remove(6)except:pass

在列表中找到一个值,然后删除该索引(如果存在),只需使用list的删除方法就可以更容易地完成:

>>> a = [1, 2, 3, 4]>>> try:...   a.remove(6)... except ValueError:...   pass...>>> print a[1, 2, 3, 4]>>> try:...   a.remove(3)... except ValueError:...   pass...>>> print a[1, 2, 4]

如果你经常这样做,你可以把它包装在一个函数中:

def remove_if_exists(L, value):try:L.remove(value)except ValueError:pass

通常,如果你告诉Python做一些它不能做的事情,Python会抛出一个Exception,所以你也必须这样做:

if c in a:a.remove(c)

或:

try:a.remove(c)except ValueError:pass

异常不一定是坏事,只要它是您期望并正确处理的异常。

这里是如何做到这一点(没有列表理解):

def remove_all(seq, value):pos = 0for item in seq:if item != value:seq[pos] = itempos += 1del seq[pos:]

如果你知道要删除什么值,这里有一个简单的方法(就像我能想到的那样简单,无论如何):

a = [0, 1, 1, 0, 1, 2, 1, 3, 1, 4]while a.count(1) > 0:a.remove(1)

你会得到[0, 0, 2, 3, 4]

考虑:

a = [1,2,2,3,4,5]

要删除所有出现的情况,您可以使用python中的filter函数。例如,它看起来像:

a = list(filter(lambda x: x!= 2, a))

因此,它将保留a != 2的所有元素。

只是取出其中一个物品使用

a.remove(2)

这个例子很快,会从列表中删除一个值的所有实例:

a = [1,2,3,1,2,3,4]while True:try:a.remove(3)except:breakprint a>>> [1, 2, 1, 2, 4]

另一种可能性是使用集合而不是列表,如果集合适用于您的应用程序。

IE如果您的数据未排序,并且没有重复项,则

my_set=set([3,4,2])my_set.discard(1)

是无错误的。

列表通常只是一个方便的容器,用于存放实际上无序的项目。有些问题是如何从列表中删除元素的所有出现。如果您首先不想要欺骗,那么集合再次方便。

my_set.add(3)

不会从上面改变my_set。

如果你的元素是不同的,那么一个简单的集合差异就可以了。

c = [1,2,3,4,'x',8,6,7,'x',9,'x']z = list(set(c) - set(['x']))print z[1, 2, 3, 4, 6, 7, 8, 9]

我们也可以使用. pop:

>>> lst = [23,34,54,45]>>> remove_element = 23>>> if remove_element in lst:...     lst.pop(lst.index(remove_element))...23>>> lst[34, 54, 45]>>>

通过索引除要删除的元素之外的所有内容来覆盖列表

>>> s = [5,4,3,2,1]>>> s[0:2] + s[3:][5, 4, 2, 1]

更一般地说,

>>> s = [5,4,3,2,1]>>> i = s.index(3)>>> s[:i] + s[i+1:][5, 4, 2, 1]

有一个for循环和一个条件:

def cleaner(seq, value):temp = []for number in seq:if number != value:temp.append(number)return temp

如果你想删除一些,但不是全部:

def cleaner(seq, value, occ):temp = []for number in seq:if number == value and occ:occ -= 1continueelse:temp.append(number)return temp
 list1=[1,2,3,3,4,5,6,1,3,4,5]n=int(input('enter  number'))while n in list1:list1.remove(n)print(list1)

例如,我们想从x中删除所有1。我是这样做的:

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

现在,这是我的方法的实际应用:

def Function(List, Unwanted):[List.remove(Unwanted) for Item in range(List.count(Unwanted))]return Listx = Function(x, 1)print(x)

这是我在一行中的方法:

[x.remove(1) for Item in range(x.count(1))]print(x)

两者都将其作为输出:

[2, 3, 2, 3, 2, 3]

希望有帮助。PS,请注意,这是在版本3.6.2中编写的,因此您可能需要针对旧版本进行调整。

正如许多其他答案所述,list.remove()可以工作,但如果该项目不在列表中,则抛出ValueError。使用python 3.4+,有一种有趣的方法来处理这个问题,使用抑制上下文管理器

from contextlib import suppresswith suppress(ValueError):a.remove('b')
arr = [1, 1, 3, 4, 5, 2, 4, 3]
# to remove first occurence of that element, suppose 3 in this examplearr.remove(3)
# to remove all occurences of that element, again suppose 3# use something called list comprehensionnew_arr = [element for element in arr if element!=3]
# if you want to delete a position use "pop" function, suppose# position 4# the pop function also returns a valueremoved_element = arr.pop(4)
# u can also use "del" to delete a positiondel arr[4]

这将从数组sys.argv中删除"-v"的所有实例,如果没有找到实例,也不会抱怨:

while "-v" in sys.argv:sys.argv.remove('-v')

您可以在名为speechToText.py的文件中看到代码的实际操作:

$ python speechToText.py -v['speechToText.py']
$ python speechToText.py -x['speechToText.py', '-x']
$ python speechToText.py -v -v['speechToText.py']
$ python speechToText.py -v -v -x['speechToText.py', '-x']

也许你的解决方案适用于int,但它不适用于我的字典。

一方面,删除()对我不起作用。但也许它适用于基本类型。我想下面的代码也是从对象列表中删除项目的方法。

另一方面,'del'也没有正常工作。在我的例子中,使用python 3.6:当我尝试使用'del'命令从'for'中的列表中删除一个元素时,python会在进程中更改索引,并且Bucle会提前停止。只有当你按逆转顺序逐个元素删除时,它才会起作用。通过这种方式,当你浏览它时,你不会更改挂起的元素数组索引

然后,我使用:

c = len(list)-1for element in (reversed(list)):if condition(element):del list[c]c -= 1print(list)

其中'list'类似于[{'key1': value e1'},{'key2': value e2},{'key3': value e3},…]

您也可以使用enumerate执行更多pythonic操作:

for i, element in enumerate(reversed(list)):if condition(element):del list[(i+1)*-1]print(list)

在一行:

a.remove('b') if 'b' in a else None

有时它很有用。

更容易:

if 'b' in a: a.remove('b')

这是我的答案,只需使用进行

def remove_all(data, value):i = j = 0while j < len(data):if data[j] == value:j += 1continuedata[i] = data[j]i += 1j += 1for x in range(j - i):data.pop()

这里的许多答案涉及创建一个新列表。这涉及将旧列表中的所有数据复制到新列表中(删除的项目除外)。如果您的列表很大,您可能负担不起(或者您不应该想要)。

在这些情况下,更改列表是更快。如果您必须从列表中删除多个元素,这可能会很棘手。假设您循环遍历列表并删除一个项目,那么列表会发生变化,标准的for循环不会考虑到这一点。循环的结果可能不是您预期的。

示例:

a = [0, 1, 2, 3, 4, 5]for i in a:a.remove(i)  # Remove all itemsprint(a)
Out: [1, 3, 5]

一个简单的解决方案是以相反的顺序遍历列表。在这种情况下,你会得到:

a = [0, 1, 2, 3, 4, 5]for i in reversed(a):a.remove(i)  # Remove all itemsprint(a)
Out: []

然后,如果您只需要删除具有某些特定值的元素,您可以简单地在循环中放入if statement,从而导致:

a = [0, 1, 2, 3, 4, 5]for i in reversed(a):if i == 2 or i == 3:  # Remove all items having value 2 or 3.a.remove(i)print(a)
Out: [0, 1, 4, 5]

一些最简单的方法的基准:

import randomfrom copy import copysample = random.sample(range(100000), 10000)remove = random.sample(range(100000), 1000)
%%timeitsample1 = copy(sample)remove1 = copy(remove)
for i in reversed(sample1):if i in remove1:sample1.remove(i)# 271 ms ± 16 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)# remove all instances
%%timeitsample1 = copy(sample)remove1 = copy(remove)
filtered = list(filter(lambda x: x not in remove1, sample1))# 280 ms ± 18.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)# remove all instances
%%timeitsample1 = copy(sample)remove1 = copy(remove)
filtered = [ele for ele in sample1 if ele not in remove1]# 293 ms ± 72.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)# remove all instances
%%timeitsample1 = copy(sample)remove1 = copy(remove)
for val in remove1:if val in sample1:sample1.remove(val)# 558 ms ± 40.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)# only remove first occurrence
%%timeitsample1 = copy(sample)remove1 = copy(remove)
for val in remove1:try:sample1.remove(val)except:pass# 609 ms ± 11.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)# only remove first occurrence

nums是列表,c是要删除的值时:

要删除列表中第一个出现的c,只需执行以下操作:

if c in nums:nums.remove(c)

要从列表中删除所有出现的c,请执行以下操作:

while c in nums:nums.remove(c)

添加异常处理将是最佳实践,但我主要是想展示如何从列表中删除元素的所有出现。

这是一个效率较低的解决方案,但它仍然有效:

a = [ ]//这是你的列表

b//需要删除的元素

counter = a.count(b)
while counter > 0:if b in a:a.remove(b)counter -= 1
print(a)