Есть ли более короткий способ назначить одну из двух переменных в 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, а не только Falsey или Truthy, а также делать предположения о типах данных и значениях, если это помогает.


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]]=z17 символов, что является лучшим из всех, что у нас есть для Python 3, без потока управления, if/elseкоторый может вызвать проблемы.
xnor

3
На самом деле это 9 символов накладных расходов, потому что после назначения должна следовать новая строка или точка с запятой.
xnor

1
Если вам нужно сделать это только один раз, можете ли вы vars()["xy"[b]]=z:?
aebabis

@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, с соответствующими индексами.
Исаак
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.