39
votes

I want to toggle between two values in Python, that is, between 0 and 1.

For example, when I run a function the first time, it yields the number 0. Next time, it yields 1. Third time it's back to zero, and so on.

Sorry if this doesn't make sense, but does anyone know a way to do this?

14

14 Answers

60
votes

Use itertools.cycle():

from itertools import cycle
myIterator = cycle(range(2))

myIterator.next()   # or next(myIterator) which works in Python 3.x. Yields 0
myIterator.next()   # or next(myIterator) which works in Python 3.x. Yields 1
# etc.

Note that if you need a more complicated cycle than [0, 1], this solution becomes MUCH more attractive than the other ones posted here...

from itertools import cycle
mySmallSquareIterator = cycle(i*i for i in range(10))
# Will yield 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 0, 1, 4, ...
46
votes

You can accomplish that with a generator like this:

>>> def alternate():
...   while True:
...     yield 0
...     yield 1
...
>>>
>>> alternator = alternate()
>>>
>>> alternator.next()
0
>>> alternator.next()
1
>>> alternator.next()
0
20
votes

you can use the mod (%) operator.

count = 0  # initialize count once

then

count = (count + 1) % 2

will toggle the value of count between 0 and 1 each time this statement is executed. The advantage of this approach is that you can cycle through a sequence of values (if needed) from 0 - (n-1) where n is the value you use with your % operator. And this technique does not depend on any Python specific features/libraries.

e.g.,

count = 0

for i in range(5):
     count = (count + 1) % 2
     print count

gives:

1
0
1
0
1
18
votes

You may find it useful to create a function alias like so:

import itertools
myfunc = itertools.cycle([0,1]).next

then

myfunc()    # -> returns 0
myfunc()    # -> returns 1
myfunc()    # -> returns 0
myfunc()    # -> returns 1
9
votes

In python, True and False are integers (1 and 0 respectively). You could use a boolean (True or False) and the not operator:

var = not var

Of course, if you want to iterate between other numbers than 0 and 1, this trick becomes a little more difficult.

To pack this into an admittedly ugly function:

def alternate():
    alternate.x=not alternate.x
    return alternate.x

alternate.x=True  #The first call to alternate will return False (0)

mylist=[5,3]
print(mylist[alternate()])  #5
print(mylist[alternate()])  #3
print(mylist[alternate()])  #5
8
votes
from itertools import cycle

alternator = cycle((0,1))
next(alternator) # yields 0
next(alternator) # yields 1
next(alternator) # yields 0
next(alternator) # yields 1
#... forever
6
votes
var = 1
var = 1 - var

That's the official tricky way of doing it ;)

6
votes

Using xor works, and is a good visual way to toggle between two values.

count = 1
count = count ^ 1 # count is now 0
count = count ^ 1 # count is now 1
5
votes

To toggle variable x between two arbitrary (integer) values, e.g. a and b, use:

    # start with either x == a or x == b
    x = (a + b) - x

    # case x == a:
    # x = (a + b) - a  ==> x becomes b

    # case x == b:
    # x = (a + b) - b  ==> x becomes a

Example:

Toggle between 3 and 5

    x = 3
    x = 8 - x  (now x == 5)
    x = 8 - x  (now x == 3)
    x = 8 - x  (now x == 5)

This works even with strings (sort of).

    YesNo = 'YesNo'
    answer = 'Yes'
    answer = YesNo.replace(answer,'')  (now answer == 'No')
    answer = YesNo.replace(answer,'')  (now answer == 'Yes')
    answer = YesNo.replace(answer,'')  (now answer == 'No')
3
votes

Using the tuple subscript trick:

value = (1, 0)[value]
2
votes

Using tuple subscripts is one good way to toggle between two values:

toggle_val = 1

toggle_val = (1,0)[toggle_val]

If you wrapped a function around this, you would have a nice alternating switch.

1
votes

Simple and general solution without using any built-in. Just keep the track of current element and print/return the other one then change the current element status.

a, b = map(int, raw_input("Enter both number: ").split())
flag = input("Enter the first value: ")
length = input("Enter Number of iterations: ")
for i in range(length):
    print flag
    if flag == a:
        flag = b;     
    else:
        flag = a

Input:
3 8
3
5
Output:
3
8
3
8
3

Means numbers to be toggled are 3 and 8 Second input, is the first value by which you want to start the sequence And last input indicates the number of times you want to generate

0
votes

If a variable is previously defined and you want it to toggle between two values, you may use the a if b else c form:

variable = 'value1'
variable = 'value2' if variable=='value1' else 'value1'

In addition, it works on Python 2.5+ and 3.x

https://docs.python.org/3/reference/expressions.html#conditional-expressions

0
votes

One cool way you can do in any language:

variable = 0
variable = abs(variable - 1)    // 1
variable = abs(variable - 1)    // 0