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

时间:2010-05-08 07:48:29

标签: python list

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

del a[b]
print a

以上显示以下错误:

Traceback (most recent call last):
  File "D:\zjm_code\a.py", line 6, in <module>
    b = a.index(6)
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

但有没有更简单的方法呢?

25 个答案:

答案 0 :(得分:1387)

要删除元素在列表中的第一个匹配项,只需使用list.remove

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

请注意,它不会删除所有元素。使用列表理解。

>>> a = [10, 20, 30, 40, 20, 30, 40, 20, 70, 20]
>>> a = [x for x in a if x != 20]
>>> print a
[10, 30, 40, 30, 40, 70]

答案 1 :(得分:165)

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

if c in a:
    a.remove(c)

或:

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

异常并不一定是坏事,只要它是你期待并妥善处理的。

答案 2 :(得分:75)

你可以做到

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

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

try:
    a.remove(6)
except:
    pass

答案 3 :(得分:52)

考虑:

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

要取出所有实例,可以在python中使用过滤器功能。 例如,它看起来像:

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

所以,它会保留一个!= 2的所有元素。

只需取出其中一项使用

a.remove(2)

答案 4 :(得分:14)

以下是如何在原地进行(没有列表理解):

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

答案 5 :(得分:12)

如果您知道要删除的值,这里有一个简单的方法(无论如何我都能想到这么简单):

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

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

答案 6 :(得分:11)

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

IE如果您的数据没有订购,并且没有重复项,那么

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

没有错误。

通常,列表只是实际无序的项目的便利容器。有些问题询问如何从列表中删除元素的所有出现。如果你不想在第一时间使用傻瓜,那么套装也很方便。

my_set.add(3)

不会从上面更改my_set。

答案 7 :(得分:9)

正如许多其他答案所述,list.remove()可以使用,但如果项目不在列表中,则抛出ValueError。使用python 3.4+,使用suppress contextmanager处理此问题的方法很有趣:

from contextlib import suppress
with suppress(ValueError):
    a.remove('b')

答案 8 :(得分:8)

只需使用list的remove方法,就可以更轻松地在列表中查找值然后删除该索引(如果存在):

>>> 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

答案 9 :(得分:7)

此示例很快,将从列表中删除值的所有实例:

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

答案 10 :(得分:7)

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

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]

答案 11 :(得分:5)

一行:

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

有时有用

答案 12 :(得分:3)

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

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

答案 13 :(得分:3)

我们也可以使用.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]
>>> 

答案 14 :(得分:2)

使用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 -= 1
            continue
        else:
            temp.append(number)
    return temp

答案 15 :(得分:2)

 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)

答案 16 :(得分:2)

比方说,我们想从x中删除所有1。我就是这样做的:

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

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

def Function(List, Unwanted):
    [List.remove(Unwanted) for Item in range(List.count(Unwanted))]
    return List
x = 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版本中编写的,因此您可能需要针对旧版本进行调整。

答案 17 :(得分:1)

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

# to remove first occurence of that element, suppose 3 in this example
arr.remove(3)

# to remove all occurences of that element, again suppose 3
# use something called list comprehension
new_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 value
removed_element = arr.pop(4)

# u can also use "del" to delete a position
del arr[4]

答案 18 :(得分:1)

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

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

另一方面,“ del”也无法正常工作。就我而言,使用python 3.6:当我尝试使用'del'命令从'for'bucle中的列表中删除元素时,python会更改进程中的索引,而bucle会在时间之前过早停止。仅当您按颠倒的顺序逐个删除元素时,此方法才有效。这样,您在遍历时不会更改未决元素数组索引

然后,我用过:

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

其中“列表”类似于[{'key1':value1'},{'key2':value2},{'key3':value3},...]

还可以使用enumerate做更多的pythonic操作:

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

答案 19 :(得分:0)

这将从数组public LocationsRecycleAdapter(List<LocationViewModel> locations, Activity activity) { this.mLocations = locations; this.mFilteredLocations = locations; this.mActivity = activity; Filter = new LocationFilter(this); } 中删除mFilteredLocations的所有实例,并且如果没有找到实例也不会抱怨:

"-v"

您可以在名为sys.argv的文件中查看运行中的代码:

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

答案 20 :(得分:0)

语法:lst.remove(x)

例如:

lst = ['one', 'two', 'three', 'four', 'two']

lst.remove('two') #it will remove first occurence of 'two' in a given list
del lst[2] #delete item by index value

print(lst)

答案 21 :(得分:0)

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

在这些情况下,就地更改列表要快得多。如果您必须从列表中删除 1 个以上的元素,这可能会很棘手。假设您遍历列表并删除一个项目,然后列表更改并且标准 for 循环不会考虑到这一点。循环的结果可能不是您所期望的。

示例:

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

Out: [1, 3, 5]

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

a = [0, 1, 2, 3, 4, 5]
for i in reversed(a):
    a.remove(i)  # Remove all items
print(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]

答案 22 :(得分:0)

一些最简单方法的基准:

import random
from copy import copy
sample = random.sample(range(100000), 10000)
remove = random.sample(range(100000), 1000)

%%timeit
sample1 = 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

%%timeit
sample1 = 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

%%timeit
sample1 = 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

%%timeit
sample1 = 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

%%timeit
sample1 = 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

答案 23 :(得分:-1)

这是我的答案,只需同时用于

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

答案 24 :(得分:-2)

是。这是我发现最有用的东西:

import sys

a = [1, 2, 3, 4]

y = 0

if y < 1:
      a.remove(1)
      print len(a)
else:
    sys.exit()

现在.remove()只接受一个参数,因此您只能从列表中删除一个整数。