Как я могу использовать предикаты в 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.

Вы также можете использовать выражение генератора для создания последовательности 1s из отфильтрованного итеративного объекта.

sum(1 for x in l if x.contains("f"))
Другие вопросы по тегам