web-dev-qa-db-fra.com

Python: Comment basculer entre deux valeurs

Je souhaite basculer entre deux valeurs en Python, c’est-à-dire entre 0 et 1. 

Par exemple, lorsque j'exécute une fonction pour la première fois, le résultat est 0. La prochaine fois, il donne 1. La troisième fois, il revient à zéro et ainsi de suite.

Désolé si cela n'a pas de sens, mais est-ce que quelqu'un connaît un moyen de faire cela?

29
Yngve

Utilisez 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.

Notez que si vous avez besoin d'un cycle plus compliqué que [0, 1], cette solution devient BEAUCOUP plus attrayante que les autres postées ici ...

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, ...
56
Platinum Azure

Vous pouvez accomplir cela avec un générateur comme celui-ci:

>>> def alternate():
...   while True:
...     yield 0
...     yield 1
...
>>>
>>> alternator = alternate()
>>>
>>> alternator.next()
0
>>> alternator.next()
1
>>> alternator.next()
0
45
g.d.d.c

Vous pouvez trouver utile de créer un alias de fonction comme ceci:

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

puis

myfunc()    # -> returns 0
myfunc()    # -> returns 1
myfunc()    # -> returns 0
myfunc()    # -> returns 1
18
Hugh Bothwell

vous pouvez utiliser l'opérateur mod (%). 

count = 0  # initialize count once

puis 

count = (count + 1) % 2

va basculer la valeur du compte entre 0 et 1 chaque fois que cette instruction est exécutée. Le avantage de cette approche est que vous pouvez parcourir une séquence de valeurs (si nécessaire) depuis 0 - (n-1), où n est la valeur que vous utilisez avec votre opérateur %. Et cette technique ne dépend d'aucune fonctionnalité/bibliothèque spécifique à Python.

par exemple.,

count = 0

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

donne:

1
0
1
0
1
16
Levon

En python, True et False sont des entiers (1 et 0 respectivement). Vous pouvez utiliser un booléen (vrai ou faux) et l'opérateur non:

var = not var

Bien sûr, si vous voulez parcourir des nombres autres que 0 et 1, cette astuce devient un peu plus difficile.

Pour intégrer cela dans une fonction certes laide:

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
9
mgilson
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
8
Marcin

Utiliser xor fonctionne et constitue un bon moyen visuel de basculer entre deux valeurs.

count = 1
count = count ^ 1 # count is now 0
count = count ^ 1 # count is now 1
6
Alex Chamberlain

Pour basculer la variable x entre deux valeurs (entières) arbitraires, par exemple. a et b, utilisez:

    # 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

Exemple:

Basculer entre 3 et 5

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

Cela fonctionne même avec des chaînes (en quelque sorte).

    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
ack
var = 1
var = 1 - var

C'est la manière délicate officielle de le faire;)

3
SetSlapShot

En utilisant l'astuce Tuple indice:

value = (1, 0)[value]
3
Shawn Chin

L'utilisation des indices Tuple est un bon moyen de basculer entre deux valeurs:

toggle_val = 1

toggle_val = (1,0)[toggle_val]

Si vous encapsuliez une fonction autour de cela, vous auriez un commutateur alternatif de Nice.

2
octopusgrabbus

Solution simple et générale sans utiliser aucun intégré. Il suffit de garder la trace de l’élément actuel et d’imprimer/retourner l’autre, puis de modifier le statut de l’élément actuel.

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

Contribution:
3 8
3
5
Sortie:
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

1
Gautam Seth

Si une variable est définie précédemment et que vous souhaitez la basculer entre deux valeurs, vous pouvez utiliser la forme a si b sinon c:

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

En outre, cela fonctionne sur Python 2.5+ et 3.x

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

0
Jorge Valentini