Is there a good, succinct/built-in way to see if all the values in an iterable are zeros? Right now I am using all()
with a little list comprehension, but (to me) it seems like there should be a more expressive method. I'd view this as somewhat equivalent to a memcmp()
in C.
values = (0, 0, 0, 0, 0) # Test if all items in values tuple are zero if all([ v == 0 for v in values ]) : print 'indeed they are'
I would expect a built-in function that does something like:
def allcmp(iter, value) : for item in iter : if item != value : return False return True
Does that function exist in python and I'm just blind, or should I just stick with my original version?
I'm not suggesting that allcmp()
is the solution. It is an example of what I think might be more meaningful. This isn't the place where I would suggest new built-ins for Python.
In my opinion, all()
isn't that meaningful. It doesn't express what "all" is checking for. You could assume that all()
takes an iterable, but it doesn't express what the function is looking for (an iterable of bool
s that tests all of them for True
). What I'm asking for is some function like my allcmp()
that takes two parameters: an iterable and a comparison value. I'm asking if there is a built-in function that does something similar to my made up allcmp()
.
I called mine allcmp()
because of my C background and memcmp()
, the name of my made up function is irrelevant here.
To check if a value is zero or not None in Python: Use the double equals == operator to check if the value is equal to 0 . Use the is not operator to check if the value is not None .
Python all() Function The all() function returns True if all items in an iterable are true, otherwise it returns False. If the iterable object is empty, the all() function also returns True.
In numpy, we can check that whether none of the elements of given array is zero or not with the help of numpy. all() function. In this function pass an array as parameter. If any of one element of the passed array is zero then it returns False otherwise it returns True boolean value.
Use generators rather than lists in cases like that:
all(v == 0 for v in values)
Edit:
all
is standard Python built-in. If you want to be efficient Python programmer you should know probably more than half of them (http://docs.python.org/library/functions.html). Arguing that alltrue
is better name than all
is like arguing that C while
should be call whiletrue
. Is subjective, but i think that most of the people prefer shorter names for built-ins. This is because you should know what they do anyway, and you have to type them a lot.
Using generators is better than using numpy because generators have more elegant syntax. numpy may be faster, but you will benefit only in rare cases (generators like showed are fast, you will benefit only if this code is bottleneck in your program).
You probably can't expect nothing more descriptive from Python.
PS. Here is code if you do this in memcpm style (I like all version more, but maybe you will like this one):
list(l) == [0] * len(l)
If you know that the iterable will contain only integers then you can just do this:
if not any(values): # etc...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With