Чи є коротший спосіб призначити одну з двох змінних у Python?


19

Це питання щодо гольфу в .

У кількох гольфах, які я робив у Python, фіксоване значення присвоюється одній із двох змінних, обраних булевим. Обрана змінна перезаписується заданим значенням, а інша - незмінною.

17 символів:

if b:y=z
else:x=z

Призначення умовного значення просто , але присвоєння умовної змінної здається незграбним. Мені цікаво, чи є коротший шлях, який я пропускаю.

Це було б легко, якби x,yзамість цього був список L, але припустимо, що контекст вимагає посилання на змінні, достатньо написання, L[0]і L[1]є непосильним. Перетворення триває занадто довго:

20 символів:

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

Найшвидший спосіб, який я знаю, - це з Python 2 exec, який є химерним:

16 символів, Python 2:

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

Вибір кортежів, здається, довший:

18, 19, 18, 18 символів:

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 

Чи існує коротша методика чи оптимізація збереження символів? Ви можете припустити, що bце, 0або 1, не лише Фальсі або Труті, а також робити припущення щодо типів даних і значень, якщо це допомагає.


1
Я нічого кращого не знаю. Якщо вам потрібно зробити це багато, ви можете зробити x,y=C(x,y,z,b)(14 символів) і натиснути будь-яку з цих реалізацій в тіло C.
Кіт Рендалл

Чому це не в стеці переповнення?
BobTheAwesome

14
@BobTheAwesome Я не прошу хороших способів зробити це, лише короткі.
xnor

Відповіді:


26

12 символів / завдання + 9 символів накладних витрат

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

Зауважте, що це працює лише в глобальному масштабі, воно не працює всередині функції.


1
Нічого собі, я про це не знав. І це здорово, що Vоновлюється автоматично, без необхідності повторного виклику функції. Таким чином, це зводиться навіть execу двох напрямках. Крім того, vars()["xy"[b]]=zце 17 символів, що є найкращим у нас для Python 3, без управління потоком if/elseяких може виникнути проблеми.
xnor

3
Це фактично 9 знаків накладних витрат, тому що новий запис або крапка з комою повинні відповідати призначенню.
xnor

1
Якщо вам потрібно тільки зробити це один раз, ви можете зробити: vars()["xy"[b]]=z?
аебабіс

@acbabis: так, як вказував xnor.
Кіт Рендалл

19

14 символів, Python 2

exec"xy=z"[b:]

Дві змінні є yі xy. Якщо b = 0, це встановлюється xy=z. Якщо b = 1, це встановлюється y=z. Це буде варте того, якщо xyйого використовуватимуть не більше одного разу в коді.


2
Дуже розумний! Я підозрюю, що зазвичай потрібно використовувати xyпринаймні двічі для свого початкового призначення, а потім прочитати його.
xnor

15

15 символів, Python 2

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

Потрібно, щоб змінні можна назвати Fі Tшвидше , ніж xта y, і що b is Falseабо b is True, а не рівні числа 0або 1.

Це зберігає знак "xy"[b], замість того, щоб взяти першу букву рядкового зображення b, що є Tабо F.


7
Зауважте, що змінні можуть бути також викликані aі r, lі uабо sі e, за допомогою відповідних індексів.
isaacg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.