Boolean indices

In Python, not only is 0 False and 1 True, but True is 1 and False is 0. This means you can do weird things like:

>>> a = 1
>>> (a==1) + (a>0) + (a==2)

I'm not sure why you'd want to do this unless you wanted to count how many conditions had been met. More usefully, you can use a boolean test as an index for an array or tuple. For example, rather than write:

if a % 2 == 0:
    print "a is even"
    print "a is odd"

You can write:

print ("a is odd", "a is even")[a % 2 == 0]

Admittedly, this is probably less readable.


An example of when I've found this trick useful is when I wanted to create a play/pause button. In response to a keystroke, I wanted flip the value of a boolean variable call 'paused': if it was currently True then it should becomes False, if it were False then it should become True. This can be achieve like so:

paused = (True, False)[paused]

Another situation in which using a boolean test as a index might be useful is when you don't have the luxury of writing multiple lines of code, e.g. within a lambda function or list comprehension. For example:

>>> my_list = [1, 7, 11, 8, 13, 2]
>>> [("odd","even")[i % 2 == 0] for i in my_list]

A more useful example would be to threshold a list of data:

thresholded_data = [(0,1)[i > threshold] for i my_list]

But in that situation, it's easier to just coerce the test into an integer:

thresholded_data = [int(i > threshold) for i my_list]


Great tricks. Thanks!

To flip a boolean, why not simply use the following?

paused = !paused

`print 'a is even' if a%2==0 else 'a is odd'` is much more readable than `print ("a is odd", "a is even")[a % 2 == 0]` and `paused = not paused` is a much more readable than `paused = (True, False)[paused]`.

Boolean indices is indeed a clever trick, but Python gives you much more readable ways of doing things like this.

You can flip a boolean with

a = not a



Post new comment

The content of this field is kept private and will not be shown publicly.