Remove all occurrences of a value from a list?

后端 未结 23 1866
佛祖请我去吃肉
佛祖请我去吃肉 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:56

    Remove all occurrences of a value from a Python list

    lists = [6.9,7,8.9,3,5,4.9,1,2.9,7,9,12.9,10.9,11,7]
    def remove_values_from_list():
        for list in lists:
          if(list!=7):
             print(list)
    remove_values_from_list()
    

    Result: 6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11

    Alternatively,

    lists = [6.9,7,8.9,3,5,4.9,1,2.9,7,9,12.9,10.9,11,7]
    def remove_values_from_list(remove):
        for list in lists:
          if(list!=remove):
            print(list)
    remove_values_from_list(7)
    

    Result: 6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11

    0 讨论(0)
  • 2020-11-21 23:57

    See the simple solution

    >>> [i for i in x if i != 2]
    

    This will return a list having all elements of x without 2

    0 讨论(0)
  • 2020-11-21 23:57

    I believe this is probably faster than any other way if you don't care about the lists order, if you do take care about the final order store the indexes from the original and resort by that.

    category_ids.sort()
    ones_last_index = category_ids.count('1')
    del category_ids[0:ones_last_index]
    
    0 讨论(0)
  • 2020-11-21 23:57

    What's wrong with:

    Motor=['1','2','2']
    For i in Motor:
           If i  != '2':
           Print(i)
    Print(motor)
    

    Using anaconda

    0 讨论(0)
  • 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
    0 讨论(0)
  • 2020-11-21 23:59

    All of the answers above (apart from Martin Andersson's) create a new list without the desired items, rather than removing the items from the original list.

    >>> import random, timeit
    >>> a = list(range(5)) * 1000
    >>> random.shuffle(a)
    
    >>> b = a
    >>> print(b is a)
    True
    
    >>> b = [x for x in b if x != 0]
    >>> print(b is a)
    False
    >>> b.count(0)
    0
    >>> a.count(0)
    1000
    
    >>> b = a
    >>> b = filter(lambda a: a != 2, x)
    >>> print(b is a)
    False
    

    This can be important if you have other references to the list hanging around.

    To modify the list in place, use a method like this

    >>> def removeall_inplace(x, l):
    ...     for _ in xrange(l.count(x)):
    ...         l.remove(x)
    ...
    >>> removeall_inplace(0, b)
    >>> b is a
    True
    >>> a.count(0)
    0
    

    As far as speed is concerned, results on my laptop are (all on a 5000 entry list with 1000 entries removed)

    • List comprehension - ~400us
    • Filter - ~900us
    • .remove() loop - 50ms

    So the .remove loop is about 100x slower........ Hmmm, maybe a different approach is needed. The fastest I've found is using the list comprehension, but then replace the contents of the original list.

    >>> def removeall_replace(x, l):
    ....    t = [y for y in l if y != x]
    ....    del l[:]
    ....    l.extend(t)
    
    • removeall_replace() - 450us
    0 讨论(0)
提交回复
热议问题