Was ist der effizienteste Weg, um zwischen 0
und umzuschalten 1
?
python
python-3.x
Codeforester
quelle
quelle
Antworten:
Lösung mit NOT
Wenn die Werte boolesch sind, besteht der schnellste Ansatz darin, den Operator not zu verwenden :
Lösung mit Subtraktion
Wenn die Werte numerisch sind, ist die Subtraktion von der Summe eine einfache und schnelle Möglichkeit, Werte umzuschalten:
Lösung mit XOR
Wenn der Wert zwischen 0 und 1 wechselt , können Sie ein bitweises Exklusiv-Oder verwenden :
Die Technik verallgemeinert sich auf ein beliebiges Paar von ganzen Zahlen. Der xor-by-one-Schritt wird durch eine xor-by-vorberechnete Konstante ersetzt:
(Diese Idee wurde von Nick Coghlan eingereicht und später von @zxxc verallgemeinert.)
Lösung mit einem Wörterbuch
Wenn die Werte hashbar sind, können Sie ein Wörterbuch verwenden:
Lösung unter Verwendung eines bedingten Ausdrucks
Der langsamste Weg ist die Verwendung eines bedingten Ausdrucks :
Lösung mit itertools
Wenn Sie mehr als zwei Werte haben, bietet die Funktion itertools.cycle () eine generische schnelle Möglichkeit, zwischen aufeinanderfolgenden Werten umzuschalten :
Beachten Sie, dass in Python 3 die
next()
Methode in geändert wurde__next__()
, sodass die erste Zeile jetzt als geschrieben wirdtoggle = itertools.cycle(['red', 'green', 'blue']).__next__
quelle
.next()
durch eine globalenext()
Funktion ersetzt. Das obige Beispiel wäre:toggle = itertools.cycle(...); next(toggle)
toggle = itertools.cycle(['red', 'green', 'blue'])
next(toggle)
a
undb
Verwendung umzuschaltenx = x ^ (a ^ b)
.int(not 0)
undint(not 1)
... hrmmmIch benutze immer:
Wenn p ein Boolescher Wert ist, wird zwischen true und false umgeschaltet.
quelle
p
muss nicht zweimal referenziert werden, damit diese Methode funktioniert !! Idee, wenn Sie einen Wert mit einer langen langen Referenz umschalten.^=
ist bitweise xor ZuordnungHier ist ein anderer nicht intuitiver Weg. Das Schöne ist, dass Sie über mehrere Werte fahren können und nicht nur über zwei [0,1]
Für zwei Werte (Umschalten)
Für mehrere Werte (sagen wir 4)
Ich hatte nicht erwartet, dass diese Lösung auch fast die schnellste sein würde
quelle
Der
not
Operator negiert Ihre Variable (konvertiert sie in einen Booleschen Wert, falls dies noch nicht geschehen ist). Sie können wahrscheinlich verwenden1
und0
austauschbar mitTrue
undFalse
, so ist es einfach zu negieren:Wenn Sie jedoch zwei beliebige Werte verwenden, verwenden Sie eine Inline
if
:quelle
toggle = 0 if toggle else 1
ist kürzer und allgemeinerif
um zwischen zwei beliebigen Variablen umzuschalten, nicht nur1
und0
.Tun Sie dies nur zwischen 1 und 0
x kann 1 oder 0 annehmen
quelle
True
undFalse
eigentlich ganze Zahlen sind, wenn auch solche mit einer überraschend ausführlichen__str__()
Methode,x
können auchTrue
oderFalse
hier sein. Sie erhalten jedoch 1 oder 0 zurück.Trigonometrischer Ansatz , nur weil
sin
undcos
Funktionen cool sind.quelle
Überraschenderweise erwähnt niemand die gute alte Division Modulo 2:
Beachten Sie, dass dies äquivalent zu
x = x - 1
ist, der Vorteil der Modulo-Technik jedoch darin besteht, dass die Größe der Gruppe oder die Länge des Intervalls größer als nur 2 Elemente sein kann, sodass Sie ein ähnliches Round-Robin-Interleaving-Schema zum Schleifen erhalten.Nur für 2 kann das Umschalten etwas kürzer sein (mit dem bitweisen Operator):
quelle
Eine Möglichkeit zum Umschalten ist die Verwendung der Mehrfachzuweisung
Verwenden von itertools:
quelle
Der einfachste Weg, zwischen 1 und 0 umzuschalten, ist das Subtrahieren von 1.
quelle
Ausnahmebehandler verwenden
Ok, ich bin das Schlimmste:
quelle
Wie wäre es mit einem imaginären Umschalter, der nicht nur den aktuellen Umschalter, sondern auch einige andere damit verbundene Werte speichert?
Speichern Sie einen beliebigen + oder - Wert links und einen beliebigen Wert ohne Vorzeichen rechts:
Null funktioniert auch:
Rufen Sie einfach den aktuellen Umschaltwert ab (
True
undFalse
stellen Sie + und - dar), den LHS-Wert (real) oder den RHS-Wert (imaginär):Tauschen Sie einfach LHS und RHS aus (beachten Sie jedoch, dass das Vorzeichen der beiden Werte nicht wichtig sein darf):
Tauschen Sie einfach LHS und RHS aus und schalten Sie gleichzeitig um:
Schutz vor Fehlern:
Führen Sie Änderungen an LHS und RHS durch:
... aber seien Sie vorsichtig beim Manipulieren der RHS:
quelle
Die Variablen a und b können JEDE zwei Werte sein, wie 0 und 1 oder 117 und 711 oder "Köpfe" und "Schwänze". Es wird keine Mathematik verwendet, nur ein schneller Austausch der Werte jedes Mal, wenn ein Umschalten gewünscht wird.
quelle
Ich benutze die abs-Funktion, sehr nützlich bei Loops
x wird 0 sein.
quelle
Lassen Sie uns ein paar Frame-Hacking machen. Schalten Sie eine Variable nach Namen um. Hinweis: Dies funktioniert möglicherweise nicht mit jeder Python-Laufzeit.
Angenommen, Sie haben eine Variable "x"
quelle
Wenn Sie es mit einer ganzzahligen Variablen zu tun haben, können Sie 1 erhöhen und Ihre Menge auf 0 und 1 (mod) beschränken.
quelle
Das Umschalten zwischen -1 und +1 kann durch Inline-Multiplikation erfolgen. wird zur Berechnung von pi nach 'Leibniz'-Art (oder ähnlich) verwendet:
quelle
Sie können die
index
vonlist
s verwenden.Pros : Keine zusätzlichen Bibliotheken, self.explanatory Code und arbeitet mit beliebigen Datentypen.
Nachteile : nicht doppelt speichern.
toggleValues(["one","two","duped", "three", "duped", "four"], "duped")
wird immer wiederkommen"three"
quelle