Remove all occurrences of a value from a list?

后端 未结 23 1894
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-21 23:45

In Python remove() will remove the first occurrence of value in a list.

How to remove all occurrences of a value from a list?

This is w

23条回答
  •  离开以前
    2020-11-21 23:58

    We can also do in-place remove all using either del or pop:

    import random
    
    def remove_values_from_list(lst, target):
        if type(lst) != list:
            return lst
    
        i = 0
        while i < len(lst):
            if lst[i] == target:
                lst.pop(i)  # length decreased by 1 already
            else:
                i += 1
    
        return lst
    
    remove_values_from_list(None, 2)
    remove_values_from_list([], 2)
    remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
    lst = remove_values_from_list([random.randrange(0, 10) for x in range(1000000)], 2)
    print(len(lst))
    
    
    

    Now for the efficiency:

    In [21]: %timeit -n1 -r1 x = random.randrange(0,10)
    1 loop, best of 1: 43.5 us per loop
    
    In [22]: %timeit -n1 -r1 lst = [random.randrange(0, 10) for x in range(1000000)]
    g1 loop, best of 1: 660 ms per loop
    
    In [23]: %timeit -n1 -r1 lst = remove_values_from_list([random.randrange(0, 10) for x in range(1000000)]
        ...: , random.randrange(0,10))
    1 loop, best of 1: 11.5 s per loop
    
    In [27]: %timeit -n1 -r1 x = random.randrange(0,10); lst = [a for a in [random.randrange(0, 10) for x in
        ...:  range(1000000)] if x != a]
    1 loop, best of 1: 710 ms per loop
    
    

    As we see that in-place version remove_values_from_list() does not require any extra memory, but it does take so much more time to run:

    • 11 seconds for inplace remove values
    • 710 milli seconds for list comprehensions, which allocates a new list in memory

提交回复
热议问题