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

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)

难道没有更简单的方法吗?


当前回答

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

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]

其他回答

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

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

if c in nums:
    nums.remove(c)

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

while c in nums:
    nums.remove(c)

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

要删除一个元素的第一次出现,使用list.remove:

>>> 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 = [0, 1, 1, 0, 1, 2, 1, 3, 1, 4]
while a.count(1) > 0:
    a.remove(1)

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

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

在这些情况下,就地更改列表要快得多。如果你必须从列表中删除一个以上的元素,这可能会很棘手。假设您循环遍历列表,并删除了一个项,那么列表将更改,标准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语句,结果是:

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]

一句话:

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

有时它很有用。

更简单:

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