any() and all() on empty list?
Steve R. Hastings
steve at hastings.org
Wed Mar 29 13:49:24 EST 2006
On Wed, 29 Mar 2006 21:34:08 +1000, Steven D'Aprano wrote:
> While the implemented behaviour might be more practical than the
> alternatives, it is still worrying paradoxical. If "All sheep are woolly",
> then obviously it must also be true that "Any sheep is woolly". More
> formally, if all(X), then any(X) -- except for the case of empty X. Hmmm.
It seems strange, but Tim Peters explained it well. It would also seem
strange if this didn't work:
all(lst0) and all(lst1) == all(lst0 + lst1)
Clearly that should work, and it shouldn't fail just because one of the
lists happens to be empty.
If you are working with a list, you can just do this:
lst and all(lst)
What bothers me is the iterator case. There is no simple way to write a
test like the above if you have an iterator.
Hmmm. How about this?
def truecount(seq):
count_true = 0
count= 0
for x in seq:
if x:
count_true += 1
count += 1
return count_true, count
count_true, count = truecount(enough_evidence(x) for x in suspected_attacks)
if not count:
print "Walk free!"
elif count == count_true:
print "Send him to Gitmo!"
else:
print "%d proven attacks out of %d suspected" % (count_true, count)
if float(count_true) / float(count) >= 0.8:
print "preponderance of evidence!"
The good thing is that these are simple functions that you can write for
yourself. I'm happy any() and all() will be built in, but I don't know
that there is sufficient need for truecount() or anything similar. If you
need it, just write it.
--
Steve R. Hastings "Vita est"
steve at hastings.org http://www.blarg.net/~steveha
More information about the Python-list
mailing list