Quelle est la manière la plus efficace de basculer entre 0
et 1
?
python
python-3.x
codeforester
la source
la source
Réponses:
Solution utilisant NOT
Si les valeurs sont booléennes, l'approche la plus rapide consiste à utiliser l' opérateur not :
Solution utilisant la soustraction
Si les valeurs sont numériques, la soustraction du total est un moyen simple et rapide de basculer les valeurs:
Solution utilisant XOR
Si la valeur bascule entre 0 et 1 , vous pouvez utiliser un ou exclusif au niveau du bit :
La technique se généralise à n'importe quelle paire d'entiers. Le pas xor-par-un est remplacé par une constante xor-par-précalculée:
(Cette idée a été soumise par Nick Coghlan et plus tard généralisée par @zxxc.)
Solution utilisant un dictionnaire
Si les valeurs sont hachables, vous pouvez utiliser un dictionnaire:
Solution utilisant une expression conditionnelle
Le moyen le plus lent est d'utiliser une expression conditionnelle :
Solution utilisant itertools
Si vous avez plus de deux valeurs, la fonction itertools.cycle () fournit un moyen générique rapide de basculer entre les valeurs successives:
Notez que dans Python 3, la
next()
méthode a été changée en__next__()
, donc la première ligne serait maintenant écrite commetoggle = itertools.cycle(['red', 'green', 'blue']).__next__
la source
.next()
a été remplacé par unenext()
fonction globale . L'exemple ci-dessus serait:toggle = itertools.cycle(...); next(toggle)
toggle = itertools.cycle(['red', 'green', 'blue'])
next(toggle)
a
et l'b
utilisationx = x ^ (a ^ b)
.int(not 0)
etint(not 1)
... hrmmmJ'utilise toujours:
Si p est un booléen, cela bascule entre vrai et faux.
la source
p
n'a pas besoin d'être référencé deux fois pour que cette méthode fonctionne !! Idée si vous basculez une valeur avec une longue référence longue.^=
est l' assignation de xor bit à bitVoici une autre manière non intuitive. La beauté est que vous pouvez parcourir plusieurs valeurs et pas seulement deux [0,1]
Pour deux valeurs (basculement)
Pour plusieurs valeurs (disons 4)
Je ne m'attendais pas à ce que cette solution soit presque la plus rapide aussi
la source
L'
not
opérateur nie votre variable (en la convertissant en booléen si ce n'est déjà fait). Vous pouvez probablement utiliser1
et de0
manière interchangeable avecTrue
etFalse
, alors annulez-le:Mais si vous utilisez deux valeurs arbitraires, utilisez un inline
if
:la source
toggle = 0 if toggle else 1
est plus court et plus généralif
pour basculer entre deux variables arbitraires , pas seulement1
et0
.Juste entre 1 et 0, faites ceci
x peut prendre 1 ou 0
la source
True
etFalse
sont en fait des entiers, bien que ceux avec une__str__()
méthode étonnamment verbeuse ,x
peuvent également êtreTrue
ouFalse
ici. Vous obtiendrez cependant 1 ou 0.Approche trigonométrique , juste parce que
sin
et lescos
fonctions sont cool.la source
Étonnamment, personne ne mentionne le bon vieux module de division 2:
Notez que cela équivaut à
x = x - 1
, mais l'avantage de la technique modulo est que la taille du groupe ou la longueur de l'intervalle peut être plus grande que 2 éléments, vous donnant ainsi un schéma d'entrelacement similaire au round-robin sur lequel boucler.Maintenant, juste pour 2, le basculement peut être un peu plus court (en utilisant un opérateur binaire):
la source
une façon de basculer est d'utiliser l'affectation multiple
Utilisation d'itertools:
la source
Le moyen le plus simple de basculer entre 1 et 0 est de soustraire de 1.
la source
Utilisation du gestionnaire d'exceptions
Ok, je suis le pire:
la source
Que diriez-vous d'une bascule imaginaire qui stocke non seulement la bascule actuelle, mais quelques autres valeurs qui lui sont associées?
Stockez toute valeur + ou - à gauche et toute valeur non signée à droite:
Zéro fonctionne aussi:
Récupérez facilement la valeur de bascule actuelle (
True
etFalse
représentent + et -), la valeur LHS (réelle) ou la valeur RHS (imaginaire):Échangez facilement LHS et RHS (mais notez que le signe des deux valeurs ne doit pas être important):
Échangez facilement LHS et RHS et basculez également en même temps:
Protège contre les erreurs:
Effectuer les modifications de LHS et RHS:
... mais soyez prudent en manipulant le RHS:
la source
Les variables a et b peuvent être N'IMPORTE QUELLE deux valeurs, comme 0 et 1, ou 117 et 711, ou "heads" et "tails". Aucun calcul n'est utilisé, juste un échange rapide des valeurs chaque fois qu'une bascule est souhaitée.
la source
J'utilise la fonction abs, très utile sur les boucles
x sera égal à 0.
la source
Faisons un peu de piratage de cadre. Basculer une variable par son nom. Remarque: cela peut ne pas fonctionner avec tous les environnements d'exécution Python.
Disons que vous avez une variable «x»
la source
Si vous avez affaire à une variable entière, vous pouvez incrémenter 1 et limiter votre ensemble à 0 et 1 (mod)
la source
La commutation entre -1 et +1 peut être obtenue par multiplication en ligne; utilisé pour le calcul de pi la manière 'Leibniz' (ou similaire):
la source
Vous pouvez utiliser le
index
oflist
s.Avantages : Aucune bibliothèque supplémentaire, code auto-explicatif et utilisation de types de données arbitraires.
Inconvénients : pas de duplication-sauvegarde.
toggleValues(["one","two","duped", "three", "duped", "four"], "duped")
reviendra toujours"three"
la source