Remove the first N items that match a condition in a Python list
<p>If I have a function <code>matchCondition(x)</code>, how can I remove the first <code>n</code> items in a Python list that match that condition?</p>

<p>One solution is to iterate over each item, mark it for deletion (e.g., by setting it to <code>None</code>), 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?</p>

<pre><code>n = 3

def condition(x):
    return x &lt; 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)
</code></pre>

<p>Straightforward Python:</p>

<pre><code>N = 3
data = [1, 10, 2, 9, 3, 8, 4, 7]

def matchCondition(x):
    return x &lt; 5

c = 1
l = []
for x in data:
    if c &gt; N or not matchCondition(x):
        l.append(x)
    else:
        c += 1

print(l)
</code></pre>

<p>This can easily be turned into a generator if desired:</p>

<pre><code>def filter_first(n, func, iterable):
    c = 1
    for x in iterable:
        if c &gt; n or not func(x):
            yield x
        else:
            c += 1

print(list(filter_first(N, matchCondition, data)))
</code></pre>

python list list-comprehension