-
-
Notifications
You must be signed in to change notification settings - Fork 33.3k
Description
Documentation
filterfalse
The doc says "Make an iterator that filters elements from iterable returning only those for which the predicate is False". That's not correct, it also returns other false elements:
>>> list(filterfalse(lambda x: x, [False, 0, 1, '', ()]))
[False, 0, '', ()]quantify
This recipe has the opposite issue:
def quantify(iterable, pred=bool):
"Count how many times the predicate is true"
return sum(map(pred, iterable))It says "true", but it only really works with True. Other predicates, like re.compile(...).match returning re.Match objects or None, don't work and quantify crashes. Predicates returning numbers other than 1 and 0 don't crash it but lead to wrong "counts". So quantify is limited. A pity and an odd outlier, since the other six tools/recipes and filter all support Python's general truth value concept.
The easy fix is to map bool over the predicate values:
def quantify(iterable, pred=bool):
"Count how many times the predicate is true"
return sum(map(bool, map(pred, iterable)))I don't see something "nicer" with the available tools/recipes. If only there was a length recipe, then we could do:
def quantify(iterable, pred=bool):
"Count how many times the predicate is true"
return length(filter(pred, iterable))filter
The doc says:
filter(function,iterable)
Construct an iterator from those elements of iterable for which function returns true.
The "returns true" doesn't work well. I'd say "returns a true value" or "for which function is true".
The last paragraph has the same issue:
See
itertools.filterfalse()for the complementary function that returns elements of iterable for which function returns false.