Esiste un modo più breve per assegnare una delle due variabili in Python?


19

Questa è una domanda di per giocare a golf in .

In più golf che ho fatto in Python, un valore fisso è assegnato a una delle due variabili scelte da un booleano. La variabile scelta viene sovrascritta dal valore dato e l'altra rimane invariata.

17 caratteri:

if b:y=z
else:x=z

Assegnare un valore condizionale è facile , ma l'assegnazione a una variabile condizionale sembra voluminosa. Mi chiedo se mi manca un modo più breve.

Questo sarebbe facile se x,yinvece fosse un elenco L, ma supponiamo che il contesto richieda di fare riferimento alle variabili abbastanza che scrivere L[0]ed L[1]è proibitivo. La conversione richiede troppo tempo:

20 caratteri:

L=[x,y];L[b]=z;x,y=L

Il modo più veloce che conosco è con un Python 2 exec, che è bizzarro:

16 caratteri, Python 2:

exec"xy"[b]+"=z"

La scelta della tupla sembra essere più lunga:

18, 19, 18, 18 caratteri:

x,y=b*(x,z)or(z,y)
x,y=[z,x,y,z][b::2]
y,x=[y,z,x][b:b+2]
y,x,*_=[y,z,x][b:]   # Python 3 

Esiste un metodo più breve o ottimizzazione per il salvataggio dei caratteri? Puoi presumere che bsia 0o 1non solo Falsey o Truthy, e anche fare ipotesi sui tipi di dati e sui valori se aiuta.


1
Non so niente di meglio. Se hai bisogno di fare molto, puoi fare x,y=C(x,y,z,b)(14 caratteri) e inserire una di queste implementazioni nel corpo di C.
Keith Randall,

Perché non è presente in Stack Overflow?
BobTheAwesome

14
@BobTheAwesome Non sto chiedendo buoni modi per farlo, solo brevi.
xnor

Risposte:


26

12 caratteri / assegnazione + 9 caratteri di spese generali

V=vars()     # do once at the start of the program
V["xy"[b]]=z

Si noti che funziona solo nell'ambito globale, non funziona all'interno di una funzione.


1
Wow, non lo sapevo. Ed è bello che si Vaggiorni automaticamente, senza bisogno di richiamare nuovamente la funzione. Quindi questo si interrompe con execin due usi. Inoltre, solo vars()["xy"[b]]=z17 caratteri, che è il migliore che abbiamo finora per Python 3, senza il cui flusso di controllo if/elsepuò causare problemi.
xnor

3
In realtà sono 9 caratteri di sovraccarico perché una riga o un punto e virgola devono seguire il compito.
xnor

1
Se hai bisogno di farlo solo una volta, puoi fare vars()["xy"[b]]=z:?
aebabis

@acbabis: sì, come ha sottolineato xnor.
Keith Randall,

19

14 caratteri, Python 2

exec"xy=z"[b:]

Le due variabili sono ye xy. Se b = 0, questo imposta xy=z. Se b = 1, questo imposta y=z. Ne varrà la pena se non xyviene utilizzato più di una volta altrove nel codice.


2
Molto intelligente! Ho il sospetto che di solito devi usare xyalmeno due volte, per il suo incarico iniziale, e leggerlo in seguito.
xnor

15

15 caratteri, Python 2

exec`b`[0]+"=z"

Richiede che le variabili siano chiamate Fe Tpiuttosto che xe y, e che b is Falseo b is True, anziché essere numeri uguali 0o 1.

Questo salva un carattere "xy"[b]prendendo invece la prima lettera della rappresentazione di stringa di b, che è To F.


7
Si noti che le variabili possono anche essere chiamate ae r, le uo se e, con indici appropriati.
Isaacg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.