Czy istnieje krótszy sposób przypisania jednej z dwóch zmiennych w Pythonie?

19

To jest dotycząca gry w golfa w .

W wielu golfach, które zrobiłem w Pythonie, stała wartość jest przypisywana do jednej z dwóch zmiennych wybranych przez Boolean. Wybrana zmienna jest nadpisywana przez podaną wartość, a druga pozostaje niezmieniona.

17 znaków:

if b:y=z
else:x=z

Przypisywanie wartości warunkowej jest łatwe , ale przypisywanie do zmiennej warunkowej wydaje się niewygodne. Zastanawiam się, czy brakuje mi krótszej drogi.

Byłoby to łatwe, jeśli x,ybyły, a nie lista L, ale zakładamy, że kontekst wymaga odnosząc się do zmiennych tyle, że pisanie L[0]i L[1]są wygórowane. Konwersja trwa zbyt długo:

20 znaków:

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

Najszybszy sposób, jaki znam, to użycie Pythona 2 exec, co jest dziwne:

16 znaków, Python 2:

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

Wybór krotek wydaje się dłuższy:

18, 19, 18, 18 znaków:

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 

Czy istnieje krótsza metoda lub optymalizacja oszczędzania znaków? Można założyć, bjest 0lub 1nie tylko Falsey lub Truthy, a także założenia dotyczące typów danych i wartości, czy to pomaga.

xnor
źródło
1
Nie znam nic lepszego. Jeśli musisz to zrobić dużo, możesz zrobić x,y=C(x,y,z,b)(14 znaków) i wcisnąć dowolną z tych implementacji do ciała C.
Keith Randall,
Dlaczego nie ma tego w przepełnieniu stosu?
BobTheAwesome
14
@BobTheAwesome Nie proszę o dobre sposoby na zrobienie tego, tylko krótkie.
xnor

Odpowiedzi:

26

12 znaków / przypisanie + 9 znaków kosztów ogólnych

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

Zauważ, że działa to tylko w zakresie globalnym, nie działa wewnątrz funkcji.

Keith Randall
źródło
1
Wow, nie wiedziałem o tym. I fajnie, że Vaktualizuje się automatycznie, bez potrzeby ponownego wywoływania tej funkcji. To zrywa nawet z execdwoma zastosowaniami. Poza tym po prostu robi vars()["xy"[b]]=z17 znaków, co jest najlepszym, jaki do tej pory mamy dla Pythona 3, bez którego sterowanie if/elsemoże powodować problemy.
xnor
3
W rzeczywistości jest to 9 znaków narzutu, ponieważ nowa linia lub średnik muszą podążać za przypisaniem.
xnor
1
Jeśli tylko trzeba zrobić to raz, można to zrobić: vars()["xy"[b]]=z?
aebabis,
@acbabis: tak, jak zauważył Xnor.
Keith Randall,
19

14 znaków, Python 2

exec"xy=z"[b:]

Dwie zmienne to yi xy. Jeśli b = 0, ustawia się xy=z. Jeśli b = 1, to ustawia y=z. Będzie to opłacalne, jeśli xyzostanie użyte nie więcej niż raz w innym miejscu w kodzie.

isaacg
źródło
2
Bardzo mądry! Podejrzewam, że zwykle musisz użyć xyco najmniej dwa razy, do początkowego przypisania, a potem go przeczytać.
xnor
15

15 znaków, Python 2

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

Wymaga wywołania zmiennych FiT zamiast xa y, i że b is Falsealbo b is True, zamiast być równe liczbie 0lub1 .

To oszczędza znak, "xy"[b]biorąc zamiast tego pierwszą literę reprezentującą ciąg znaków b, czyliT lub F.

xnor
źródło
7
Zauważ, że zmienne można również wywoływać ai r, li / ulub si e, z odpowiednimi indeksami.
isaacg,