为什么在Python中remove()只移除列表中的第一个元素?

xghobddn  于 2022-12-30  发布在  Python
关注(0)|答案(4)|浏览(469)

所以,我在处理一个list lt=[1,1,3,4,5,5]并且k =1的问题,所以,我尝试从列表中删除所有出现的k并返回列表,但是当我使用内置方法remove时()它只删除第一个出现,而忽略其他出现。**我收到的输出是[1,3,4,5,5],我期望的输出是[3,4,5,5]**下面是我的代码,谢谢。

class Solution(object):

    def remove_occurances(self, lt, k):

        i = 0
        while i < len(sorted(lt)):
            if lt[i] == k:
                lt.remove(lt[i])
                i += 1
            return lt

if __name__ == "__main__":
    p = [1, 1, 3, 4, 5, 5]
    k = 1
    print(Solution().remove_occurances(p, k))
jtoj6r0c

jtoj6r0c1#

remove_occurances中,您可以改为:

def remove_occurances(self, lt, k):
    while k in lt:
        lt.remove(k)

    return lt

注意,这个函数直接作用于输入列表,所以remove调用会改变输入列表,并且返回的列表lt和这个输入列表lt是 * 相同的 * 列表(即指向同一个内存的指针,而不是一个副本)。
如果你希望原始的输入列表保持不变,你需要做如下的事情:

def remove_occurances(self, lt, k):
    newlist = list(lt)  # make a copy of lt
    while k in newlist:
        newlist.remove(k)  # remove from the copy

    return newlist  # return the copy

这将在列表lt仍然包含值k时继续循环。

ar7v8xwq

ar7v8xwq2#

你回来得太快了:

def remove_occurances(self, lt, k):

    i = 0
    while i < len(sorted(lt)):
        if lt[i] == k:
            lt.remove(lt[i])
        else:
            i += 1
    
    return lt

输出:

[3, 4, 5, 5]
sc4hvdpw

sc4hvdpw3#

您应该删除in loop。
不是从特定位置移除,而是移除特定值(只要该值存在于列表中)。
当没有更多的这个数组时-它将引发valueEttor,您将知道所有请求的值都已被删除。

try:
        while True:
            lt.remove(k)
    except ValueError:
        pass

编辑:测量时间:

from time import time

    start_time = time()

    try:
        while True:
            lt.remove(k)
    except ValueError:
        pass

    end_time = time()
     
        
    print("TOTAL TIME: " + str(end_time-start_time))
3pvhb19x

3pvhb19x4#

p = [1, 1, 3, 4, 5, 5]
k = 1
def remove_occurances(p, k):
    return [i for i in p if i != k] # here we are using list comprehension and taking only values expect the value to be removed.
remove_occurances(p, k)
#[3, 4, 5, 5]

相关问题