关于python:有没有一种简单的方法可以按值删除一个list元素?

Is there a simple way to delete a list element by value?

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

del a[b]
print a

上述显示以下错误:

1
2
3
4
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

所以我要这样做:

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

try:
    b = a.index(6)
    del a[b]
except:
    pass

print a

但有不simpler的路吗?


要删除元素在列表中的第一次出现,只需使用list.remove

1
2
3
4
>>> a = ['a', 'b', 'c', 'd']
>>> a.remove('b')
>>> print a
['a', 'c', 'd']

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

1
2
3
4
>>> 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]


通常,如果您告诉Python做一些它不能做的事情,那么它会抛出一个异常,因此您必须做以下任一项:

1
2
if c in a:
    a.remove(c)

或:

1
2
3
4
try:
    a.remove(c)
except ValueError:
    pass

一个例外不一定是一件坏事,只要它是一个你期待和妥善处理。


你可以做到

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

但是上面需要在列表A中搜索6两次,所以尝试except会更快

1
2
3
4
try:
    a.remove(6)
except:
    pass


考虑:

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

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

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

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

只取出其中一件物品

1
a.remove(2)


以下是如何就地执行(不理解列表):

1
2
3
4
5
6
7
def remove_all(seq, value):
    pos = 0
    for item in seq:
        if item != value:
           seq[pos] = item
           pos += 1
    del seq[pos:]


如果你知道要删除什么值,这里有一个简单的方法(不管怎样,只要我能想到简单的方法):

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

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


另一种可能是使用集合而不是列表(如果集合适用于应用程序)。

如果您的数据没有排序,并且没有重复的数据,那么

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

是无错误的。

通常列表只是一个方便的容器,用于存放实际无序的项目。有一些问题询问如何从列表中删除元素的所有出现。如果你一开始不想被骗,那么再一次用一套就很方便了。

1
my_set.add(3)

不会从上面改变我的设置。


如许多其他答案所述,list.remove()是可行的,但如果项目不在列表中,则抛出ValueError。对于python 3.4+,使用suppress contextmanager有一种有趣的处理方法:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> 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]

如果经常这样做,您可以将其包装在一个函数中:

1
2
3
4
5
def remove_if_exists(L, value):
  try:
    L.remove(value)
  except ValueError:
    pass


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

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


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

1
2
3
4
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]


在一行中:

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

有时有用


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

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

我们也可以使用.pop:

1
2
3
4
5
6
7
8
9
>>> lst = [23,34,54,45]
>>> remove_element = 23
>>> if remove_element in lst:
...     lst.pop(lst.index(remove_element))
...
23
>>> lst
[34, 54, 45]
>>>


带有for循环和条件:

1
2
3
4
5
6
def cleaner(seq, value):    
    temp = []                      
    for number in seq:
        if number != value:
            temp.append(number)
    return temp

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

1
2
3
4
5
6
7
8
9
def cleaner(seq, value, occ):
    temp = []
    for number in seq:
        if number == value and occ:
            occ -= 1
            continue
        else:
            temp.append(number)
    return temp

1
2
3
4
5
 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。下面是我将如何处理的:

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

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

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

这是我一行的方法:

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

两者都将其作为输出:

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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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]

也许你的解决方案可以与ints一起使用,但它不适用于我的字典。

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

另一方面,"del"也没有正常工作。在我的例子中,使用python 3.6:当我尝试用del命令从"for"bucle的列表中删除元素时,python会更改进程中的索引,bucle会在时间到来之前提前停止。它只在按元素相反的顺序删除元素时起作用。通过这种方式,您在浏览挂起元素数组索引时不会更改它。

然后,IM使用:

1
2
3
4
5
6
c = len(list)-1
for element in (reversed(list)):
    if condition(element):
        del list[c]
    c -= 1
print(list)

其中"list"类似于['key1':value1','key2':value2,'key3':value3,…]

你也可以用Enumerate做更多的Python:

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


语法:lst.remove(x)

例如:

1
2
3
4
5
6
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)

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

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

您可以在名为speechToText.py的文件中看到正在运行的代码:

1
2
3
4
5
6
7
8
9
10
11
$ 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']

对。这是我发现最有用的:

1
2
3
4
5
6
7
8
9
10
11
import sys

a = [1, 2, 3, 4]

y = 0

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

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