Search code examples
pythonlistlist-comprehension

Remove the first N items that match a condition in a Python list


If I have a function matchCondition(x), how can I remove the first n items in a Python list that match that condition?

One solution is to iterate over each item, mark it for deletion (e.g., by setting it to None), and then filter the list with a comprehension. This requires iterating over the list twice and mutates the data. Is there a more idiomatic or efficient way to do this?

n = 3

def condition(x):
    return x < 5

data = [1, 10, 2, 9, 3, 8, 4, 7]
out = do_remove(data, n, condition)
print(out)  # [10, 9, 8, 4, 7] (1, 2, and 3 are removed, 4 remains)

Solution

  • One way using itertools.filterfalse and itertools.count:

    from itertools import count, filterfalse
    
    data = [1, 10, 2, 9, 3, 8, 4, 7]
    output = filterfalse(lambda L, c=count(): L < 5 and next(c) < 3, data)
    

    Then list(output), gives you:

    [10, 9, 8, 4, 7]