Как я могу использовать предикаты в Python
Я хочу использовать python более декларативно, максимально используя предикаты, чтобы упростить вещи, но мне трудно понять, как это сделать "просто" в python.
Например, при подсчете элементов в списке я хочу иметь возможность передать предикат, например:
mylist.count(lambda x: x.contains("f"))
для подсчета элементов в списке, содержащих и "f".
Я вижу, как это сделать с помощью itertools:
sum(map(lambda x: 1 if x.contains("f") else 0, l))
но это хуже, чем цикл for. Я что-то упустил или Python просто не допускает такого выражения?
1 ответ
Самый "простой" (или, по крайней мере, самый разложимый) способ будет использовать operator.methodcaller
вместе с sum
.
from operator import methodcaller
p = methodcaller("contains", "f")
sum(map(p, l))
Это работает, потому что contains
возвращает экземпляр bool
, который является подклассом int
.
Вы также можете использовать выражение генератора для создания последовательности 1
s из отфильтрованного итеративного объекта.
sum(1 for x in l if x.contains("f"))