Если у меня есть функция matchCondition(x)
, как я могу удалить первое n
объекты в списке Python то соответствие то условие?
Одно решение состоит в том, чтобы выполнить итерации по каждому объекту, отметить его для удаления (например, путем установки его на None
), и затем отфильтруйте список с пониманием. Это требует итерации по списку дважды и видоизменяет данные. Существует ли более идиоматический или эффективный способ сделать это?
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)
Начиная Python 3.8
, и введение [1 110] выражения присваивания (PEP 572) (:=
оператор), мы можем использовать и увеличить переменную в понимании списка:
# items = [1, 10, 2, 9, 3, 8, 4, 7]
total = 0
[x for x in items if not (x < 5 and (total := total + 1) <= 3)]
# [10, 9, 8, 4, 7]
Это:
total
к 0
, который будет символизировать количество ранее подобранных случаев в понимании списка x < 5
) total
(total := total + 1
) через выражение присваивания литий> <литий>, и в то же время сравнивающий новое значение total
к макс. количеству объектов для отбрасывания (3
) литий> ул.>