2009-11-22 11 views
17

W niektórych częściach mojego programu Python mam zmienną val, która może wynosić 1 lub 0. Jeśli to 1, muszę zmienić na 0, jeśli jest 0, muszę zmienić na 1.Zamiana 1 z 0 i 0 z 1 w sposób Pythonic

Jak to zrobić w sposób Pythoniczny?

if val == 1: 
    val = 0 
elif val == 0: 
    val = 1 

To za długo!

zrobiłem:

swap = {0: 1, 1:0} 

Więc mogę go używać:

swap[val] 

inne pomysły?

+6

Czy istnieje powód, aby nie używać 'TRUE/FALSE' zamiast '1 '/ '0' w twoim przypadku? – jfs

+2

Najbardziej Pythonic sposób to zrobić, wziąć pod uwagę znaczenie zmiennej. Czy to numeryczne? Boolean (to znaczy True/False)? Czy ma jakieś semantyczne znaczenie, które tutaj nie jest oczywiste? Sam fakt, że chcesz go przełączyć, oznacza, że ​​ma jakieś znaczenie ... co to jest? –

+0

Myślę, że termin, którego szukasz, to "przełącz". –

Odpowiedz

91

To nie jest pyton, ale jest neutralne językowo. Często val = 1 - val jest najprostszy.

+28

To jest zbyt czytelne! Idź po 'val^= 1'! – abyx

+7

To jest sprytne, ale wymaga od osoby czytającej kod do myślenia (prawdopodobnie), co może zmusić cię do dodania komentarza. Lubię potrójny lepszy np. val = 0, jeśli val else 1, ponieważ mówi dokładnie, co robi. – rplevy

+2

Innym sposobem powiedzenia tego samego: var = ((var + 1) i 1). – MAK

20

Od True == 1 i False == 0 W Pythonie

można po prostu użyć var = not var

To po prostu zamienić go.

+0

nie 1 == Fałsz, nie 0 == Prawda –

+0

Wydaje się to szczegółem implementacji i nie można na nim polegać. –

+0

ale 'int (nie 1) == 0' i' int (nie 0) == 1' ponieważ 'int (prawda) == 1' i' int (fałsz) == 0'. a ten prawdopodobnie nie jest szczegółem implementacji. –

1

Jeśli chcesz być krótkie:

f = lambda val: 0 if val else 1 

Następnie:

>>> f(0) 
1 
>>> f(1) 
0 
5

W twoim przypadku polecam trójskładnikowej:

val = 0 if val else 1 

Jeśli miał 2 zmienne zamienić Cię może powiedzieć:

(a, b) = (b, a) 
+0

OP nie ma dwóch wartości do zamiany. ma jedną wartość, którą chce zmienić – SilentGhost

+0

Dodano edycję. Ternary ma więcej sensu. – rplevy

9

Kolejna możliwość:

i = (1,0)[i] 

To działa dobrze tak długo, jak jest pozytywna, jak dbr zauważył w komentarzach nie działa nie dla i < 0.

Czy na pewno nie chcesz używać False i True? Brzmi prawie jak to.

+0

Nie będzie błędu, jeśli 'i' jest' -1' lub '-2', i działałoby dziwnie. '{0: 1, 1: 0} [i]' będzie błędem jednak – dbr

+0

@dbr thanks. Chciałem uwzględnić to w odpowiedzi, ale potem zobaczyłem, że OP już znalazł tę odpowiedź. Trzymam się tego, który mam, ponieważ jest naprawdę kompaktowy. –

12

Najkrótszym podejściem jest użycie operatora bitowego XOR.

Jeśli chcesz val zostać przeniesiony:

val ^= 1 

Jeśli nie chcesz val zostać przeniesiony:

val^1 
+0

Podoba mi się ta odpowiedź, ponieważ daje możliwość dynamicznego przełączania, używając "'^1 "lub"^0 ", przy czym ta druga nie powoduje zamiany. –

0

zmienny Funkcja z argumentem. Wywołanie funkcji swaper() będzie zwracać inną wartość za każdym razem.

def swaper(x=[1]): 
    x[0] ^= 1 
    return x[0] 
1

(0,1) [Nie Val] odwraca val od 0 do 1, i odwrotnie.

+0

['not val'] (http://stackoverflow.com/a/1779305/4279) * sam * odwraca wartość z" 0 "na" 1 ". Uwaga: 'False == 0' i' 1 == True' w języku Python. – jfs

1

Aby rozwinąć na answer by "YOU" użyj:

int(not(val)) 

Przykłady:

>>> val = 0 
>>> int(not(val)) 
1 
>>> val = 1 
>>> int(not(val)) 
0 

pamiętać, że ta odpowiedź jest przeznaczone wyłącznie charakter opisowy, a nie nakazowy.

0

Twoja droga działa dobrze!

Co o:

val = abs(val - 1) 

krótkie i proste!

0

Najbardziej pythonic sposób będzie prawdopodobnie

int(not val) 

Ale krótsza droga byłaby

-~-val 
Powiązane problemy