如何。删除Python列表中的所有匹配项?

时间:2014-01-30 21:52:33

标签: python list

如果我有一点像Python那样:

n = [1, 3, 5, 1]
n.remove(1)
print n

n将返回[3, 5, 1],因为.remove()在找到第一个匹配后退出。如果找到所有匹配(或者在这种情况下,所有[3, 5] s),我该怎么做只返回1

5 个答案:

答案 0 :(得分:9)

如果创建新列表很好:

n = [x for x in n if x != 1]

当然,您也可以使用切片分配来修改列表:

n[:] = [x for x in n if x != 1]

答案 1 :(得分:2)

使用过滤功能

n = [1, 3, 5, 1]
filter(lambda a:a is not 1,n)
[3,5]

修改

n = [1, 3, 5, 1]
filter(lambda a:a != 1,n)
[3,5]

答案 2 :(得分:1)

简单List Comprehension -

>>> n = [1, 3, 5, 1]
>>> n = [e for e in n if e != 1]
>>> n
[3, 5]

如果您想删除多个元素 -

>>> g = [1,3]
>>> n = [e for e in n if e not in g]
>>> n
[5]

答案 3 :(得分:0)

这不是我通常这样做的方式,但是:

n = [1, 3, 5, 1]
REMOVECHAR = 1
while REMOVECHAR in n:
    n.remove(REMOVECHAR)
# could also do:
# while 1:
#     try: n.remove(REMOVECHAR)
#     except ValueError as e: break

如果我这样做,我会使用list comp来制作一个新列表。

n = [1,3,5,1]
REMOVECHAR = 1
nn = [element for element in n if element != REMOVECHAR]

答案 4 :(得分:0)

您可以向后遍历列表并弹出匹配的元素。

def remove_all_in_place(target, sequence):
    cursor = len(target) - 1
    while cursor >= 0:
        if sequence[cursor] == target:
            sequence.pop(cursor)
        cursor -= 1

列表推导可能更快,因为它们已经过优化,但它们不是就地操作。对于本机Python实现,我认为这将是最快的,并且就地实现。