¿Cuál es la forma más eficiente de alternar entre 0
y 1
?
python
python-3.x
codeforester
fuente
fuente
Respuestas:
Solución usando NOT
Si los valores son booleanos, el enfoque más rápido es usar el operador not :
Solución usando resta
Si los valores son numéricos, entonces la resta del total es una forma simple y rápida de alternar valores:
Solución usando XOR
Si el valor alterna entre 0 y 1 , puede usar un exclusivo bit a bit o :
La técnica se generaliza a cualquier par de enteros. El paso xor por uno se reemplaza con una constante xor por precomputado:
(Esta idea fue presentada por Nick Coghlan y luego generalizada por @zxxc).
Solución usando un diccionario
Si los valores son hashable, puede usar un diccionario:
Solución usando una expresión condicional
La forma más lenta es usar una expresión condicional :
Solución usando itertools
Si tiene más de dos valores, la función itertools.cycle () proporciona una forma rápida genérica para alternar entre valores sucesivos:
Tenga en cuenta que en Python 3 el
next()
método se cambió a__next__()
, por lo que la primera línea ahora se escribiría comotoggle = itertools.cycle(['red', 'green', 'blue']).__next__
fuente
.next()
ha sido reemplazado por unanext()
función global . El ejemplo anterior sería:toggle = itertools.cycle(...); next(toggle)
toggle = itertools.cycle(['red', 'green', 'blue'])
next(toggle)
a
yb
usarx = x ^ (a ^ b)
.int(not 0)
yint(not 1)
... hrmmmYo siempre uso:
Si p es un booleano, esto cambia entre verdadero y falso.
fuente
p
¡no es necesario hacer referencia dos veces para que este método funcione! Idea si está alternando un valor con una referencia larga y larga.^=
es asignaciónAquí hay otra forma no intuitiva. La belleza es que puedes recorrer varios valores y no solo dos [0,1]
Para dos valores (alternar)
Para valores múltiples (digamos 4)
No esperaba que esta solución fuera casi la más rápida también
fuente
El
not
operador niega su variable (convirtiéndola en booleana si aún no es una). Puede probablemente utilizar1
y0
de manera intercambiable conTrue
yFalse
, por lo que sólo negarlo:Pero si está utilizando dos valores arbitrarios, use una línea
if
:fuente
toggle = 0 if toggle else 1
es más corto y más generalif
para alternar entre dos variables arbitrarias , no solo1
y0
.Solo entre 1 y 0, haz esto
x puede tomar 1 o 0
fuente
True
y enFalse
realidad son enteros, aunque con un__str__()
método sorprendentemente detallado ,x
también pueden serTrue
oFalse
aquí. Sin embargo, obtendrá 1 o 0 de vuelta.Aproximación trigonométrica , sólo porque
sin
ycos
funciones son frescas.fuente
Sorprendentemente, nadie menciona la buena división anterior módulo 2:
Tenga en cuenta que es equivalente a
x = x - 1
, pero la ventaja de la técnica de módulo es que el tamaño del grupo o la longitud del intervalo puede ser mayor que solo 2 elementos, lo que le brinda un esquema de entrelazado de operación por turnos similar para realizar un bucle.Ahora solo para 2, alternar puede ser un poco más corto (usando el operador de bits):
fuente
una forma de alternar es mediante la asignación múltiple
Usando itertools:
fuente
La forma más fácil de alternar entre 1 y 0 es restar de 1.
fuente
Usando el manejador de excepciones
Ok, soy lo peor:
fuente
¿Qué tal un conmutador imaginario que almacena no solo el conmutador actual, sino también un par de otros valores asociados con él?
Almacene cualquier valor + o - a la izquierda y cualquier valor sin signo a la derecha:
Zero también funciona:
Recupere fácilmente el valor de alternancia actual (
True
yFalse
represente + y -), el valor LHS (real) o el valor RHS (imaginario):Cambie fácilmente LHS y RHS (pero tenga en cuenta que el signo de ambos valores no debe ser importante):
Cambia fácilmente LHS y RHS y también alterna al mismo tiempo:
Protecciones contra errores:
Realizar cambios en LHS y RHS:
... pero tenga cuidado al manipular el RHS:
fuente
Las variables ayb pueden ser CUALQUIER dos valores, como 0 y 1, o 117 y 711, o "caras" y "colas". No se utilizan matemáticas, solo un intercambio rápido de los valores cada vez que se desea alternar.
fuente
Yo uso la función abs, muy útil en bucles
x será 0.
fuente
Hagamos un poco de pirateo de cuadros. Alternar una variable por nombre. Nota: Esto puede no funcionar con todos los tiempos de ejecución de Python.
Digamos que tienes una variable "x"
fuente
Si está tratando con una variable entera, puede incrementar 1 y limitar su conjunto a 0 y 1 (mod)
fuente
El cambio entre -1 y +1 se puede obtener por multiplicación en línea; utilizado para calcular pi de la manera 'Leibniz' (o similar):
fuente
Puede hacer uso de la
index
dellist
s.Pros : No hay bibliotecas adicionales, código autoexplicativo y trabajo con tipos de datos arbitrarios.
Contras : no duplicar-guardar.
toggleValues(["one","two","duped", "three", "duped", "four"], "duped")
siempre regresará"three"
fuente