假设我有一个列表[1, 2, 3, 4, 2, 5]
。由于2
出现两次,我想删除最后一次出现的两次。这是我到目前为止所做的。
list.reverse()
list.remove(value) # value = 2
list.reverse()
但似乎如果我在删除值时进行两次反转,则算法复杂度为O(n)
。有没有更快的方法呢?
答案 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 list
和list.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]
这样你就不会在内存中复制列表,也不会循环两次。