Jaki jest najskuteczniejszy sposób przełączania się między 0
i 1
?
python
python-3.x
codeforester
źródło
źródło
Odpowiedzi:
Rozwiązanie wykorzystujące NOT
Jeśli wartości są logiczne, najszybszym podejściem jest użycie operatora not :
Rozwiązanie za pomocą odejmowania
Jeśli wartości są liczbowe, odejmowanie od sumy jest prostym i szybkim sposobem przełączania wartości:
Rozwiązanie wykorzystujące XOR
Jeśli wartość przełącza się między 0 a 1 , możesz użyć bitowego wyłącznika lub :
Technika uogólnia się na dowolną parę liczb całkowitych. Xor-by-one step jest zastępowany przez xor-by-precomputed-fixed:
(Pomysł został zgłoszony przez Nicka Coghlana, a później uogólniony przez @zxxc).
Rozwiązanie za pomocą słownika
Jeśli wartości są hashable, możesz użyć słownika:
Rozwiązanie wykorzystujące wyrażenie warunkowe
Najwolniejszym sposobem jest użycie wyrażenia warunkowego :
Rozwiązanie wykorzystujące itertools
Jeśli masz więcej niż dwie wartości, funkcja itertools.cycle () zapewnia ogólny, szybki sposób przełączania między kolejnymi wartościami:
Zauważ, że w Pythonie 3
next()
metoda została zmieniona na__next__()
, więc pierwsza linia byłaby teraz zapisana jakotoggle = itertools.cycle(['red', 'green', 'blue']).__next__
źródło
.next()
zastąpiono funkcję globalnąnext()
. Powyższy przykład to:toggle = itertools.cycle(...); next(toggle)
toggle = itertools.cycle(['red', 'green', 'blue'])
next(toggle)
a
ib
używaćx = x ^ (a ^ b)
.int(not 0)
iint(not 1)
... hrmmmZawsze używam:
Jeśli p jest wartością logiczną, przełącza się między prawdą a fałszem.
źródło
p
nie trzeba odwoływać się dwa razy, aby ta metoda działała !! Pomysł, jeśli przełączasz wartość z długą długą referencją.^=
to bitowe przypisanie xorOto inny nieintuicyjny sposób. Piękno polega na tym, że możesz zmieniać wiele wartości, a nie tylko dwie [0,1]
Dla dwóch wartości (przełączanie)
Dla wielu wartości (powiedzmy 4)
Nie spodziewałem się, że to rozwiązanie będzie też prawie najszybsze
źródło
not
Operator neguje zmienną (przekształcenie go w logiczną, jeśli nie jest już jeden). Prawdopodobnie możesz używać1
i0
zamiennie zTrue
iFalse
, więc po prostu zaneguj to:Ale jeśli używasz dwóch dowolnych wartości, użyj inline
if
:źródło
toggle = 0 if toggle else 1
jest krótszy i bardziej ogólnyif
do przełączania się między dwiema dowolnymi zmiennymi, a nie tylko1
i0
.Tylko między 1 a 0, zrób to
x może przyjąć 1 lub 0
źródło
True
iFalse
są w rzeczywistości liczbami całkowitymi, chociaż te z zaskakująco rozwlekłą__str__()
metodą,x
mogą również byćTrue
lubFalse
tutaj. Otrzymasz jednak 1 lub 0 z powrotem.Podejście trygonometryczne , tylko dlatego, że funkcje
sin
icos
są fajne.źródło
Zaskakujące jest, że nikt nie wspomniał starego dobrego podziału modulo 2:
Zauważ, że jest to równoważne
x = x - 1
, ale zaletą techniki modulo jest to, że rozmiar grupy lub długość interwału może być większy niż tylko 2 elementy, dając w ten sposób schemat przeplotu podobnego do okrężnego.Teraz tylko dla 2, przełączanie może być nieco krótsze (używając operatora bitowego):
źródło
jednym ze sposobów przełączania jest użycie przypisania wielokrotnego
Korzystanie z itertools:
źródło
Najłatwiejszym sposobem przełączania się między 1 a 0 jest odjęcie od 1.
źródło
Korzystanie z obsługi wyjątków
Ok, jestem najgorszy:
źródło
A co z wyimaginowanym przełącznikiem, który przechowuje nie tylko bieżący przełącznik, ale kilka innych powiązanych z nim wartości?
Przechowuj dowolną wartość + lub - po lewej stronie i każdą wartość bez znaku po prawej:
Zero też działa:
Łatwo pobierz bieżącą wartość przełączania (
True
iFalse
reprezentuj + i -), wartość LHS (rzeczywistą) lub RHS (urojoną):Łatwo zamień LHS i RHS (ale pamiętaj, że znak obu wartości nie może być ważny):
Łatwo zamień LHS i RHS, a także przełączaj w tym samym czasie:
Ochrona przed błędami:
Wykonaj zmiany w LHS i RHS:
... ale zachowaj ostrożność przy manipulowaniu RHS:
źródło
Zmienne a i b mogą mieć DOWOLNE dwie wartości, takie jak 0 i 1 lub 117 i 711 lub „orła” i „reszka”. Nie używa się matematyki, tylko szybka zamiana wartości za każdym razem, gdy wymagane jest przełączenie.
źródło
Używam funkcji abs, bardzo przydatnej na pętlach
x będzie równe 0.
źródło
Zróbmy hakowanie ramek. Przełącz zmienną według nazwy. Uwaga: to może nie działać w każdym środowisku wykonawczym Pythona.
Powiedzmy, że masz zmienną „x”
źródło
Jeśli masz do czynienia ze zmienną całkowitą, możesz zwiększyć 1 i ograniczyć swój zestaw do 0 i 1 (mod)
źródło
Przełączanie między -1 a +1 można uzyskać przez mnożenie w wierszu; stosowany do obliczania liczby pi metodą „Leibniza” (lub podobną):
źródło
Możesz skorzystać
index
zlist
s.Zalety : brak dodatkowych bibliotek, samowyjaśnienia kodu i praca z dowolnymi typami danych.
Wady : nie zapisuj duplikatów.
toggleValues(["one","two","duped", "three", "duped", "four"], "duped")
zawsze wróci"three"
źródło