从Python中的列表中删除最后一个匹配的值

时间:2018-04-07 06:09:15

标签: python algorithm

假设我有一个列表[1, 2, 3, 4, 2, 5]。由于2出现两次,我想删除最后一次出现的两次。这是我到目前为止所做的。

list.reverse()
list.remove(value) # value = 2
list.reverse()

但似乎如果我在删除值时进行两次反转,则算法复杂度为O(n)。有没有更快的方法呢?

4 个答案:

答案 0 :(得分:1)

if value in list:
    list.reverse()
    list.remove('ch')
    list.reverse()

最狡猾的方式是在try: except周围删除:

list.reverse()
try:
    list.remove(value)
except:
    pass
list.reverse()

根据你对速度的评论,这两种方法都是O(N),因为x in listlist.reverse()都是O(N),所以它们之间并不多。如果您希望元素通常在那里,您可以使用try:catch保存x in list检查,但是如果您希望它通常不存在,则可以通过检查来保存2 reverse()首先是会员资格。

答案 1 :(得分:1)

这种方法至少消除了一次逆转:

def rremove(alist, x):
    alist.pop(len(alist) - alist[::-1].index(x) - 1)

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

print(my_list)

rremove(my_list, 2)

print(my_list)

<强>输出

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

就像list.remove()一样,如果该值不存在,则会引发ValueError。

答案 2 :(得分:1)

你可以创建一个dict,因为dict可以有唯一的值:

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


no_repeat ={}
for i,j in enumerate(values):
    if j not in no_repeat:
        no_repeat[i]=j
    else:
        pass

print(no_repeat.values())

输出

[1, 2, 3, 4, 5]

答案 3 :(得分:1)

IMO,最有效的方法是以相反的顺序迭代列表,找到值2,删除它并打破循环:

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

for index, item in enumerate(reversed(l)):
    if item == 2:
        l.pop(len(l) - 1 - index)
        break

你得到:

[1, 2, 3, 4, 5]

这样你就不会在内存中复制列表,也不会循环两次。