Esta es una pregunta de consejos para jugar golf en python .
En varios campos de golf que he hecho en Python, se asigna un valor fijo a una de las dos variables elegidas por un booleano. La variable elegida se sobrescribe por el valor dado, y la otra no se modifica.
17 caracteres:
if b:y=z
else:x=z
Asignar un valor condicional es fácil , pero asignarlo a una variable condicional parece torpe. Me pregunto si hay un camino más corto que me falta.
Esto sería fácil si x,yfuera una lista L, pero suponga que el contexto requiere referirse a las variables lo suficiente como para escribir L[0]y L[1]es prohibitivo. La conversión lleva demasiado tiempo:
20 caracteres:
L=[x,y];L[b]=z;x,y=L
La forma más rápida que conozco es con un Python 2 exec, lo cual es extraño:
16 caracteres, Python 2:
exec"xy"[b]+"=z"
La elección de tuplas parece ser más larga:
18, 19, 18, 18 caracteres:
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
¿Hay algún método más corto u optimización de ahorro de caracteres? Puede suponer que bes 0o 1, no solo Falsey o Truthy, y también hacer suposiciones sobre los tipos y valores de datos si es útil.

x,y=C(x,y,z,b)(14 caracteres) e insertar cualquiera de estas implementaciones en el cuerpo deC.Respuestas:
12 caracteres / asignación + 9 caracteres de sobrecarga
Tenga en cuenta que esto solo funciona a nivel global, no funciona dentro de una función.
fuente
Vactualice automáticamente, sin necesidad de volver a llamar a la función. Entonces esto se iguala conexecdos usos. Además, solovars()["xy"[b]]=zhay 17 caracteres, que es lo mejor que tenemos hasta ahora para Python 3, sin el flujo de controlif/elseque puede causar problemas.vars()["xy"[b]]=z:?14 caracteres, Python 2
Las dos variables son
yyxy. Si b = 0, esto establecexy=z. Si b = 1, esto establecey=z. Esto valdrá la pena si noxyse usa más de una vez en otra parte del código.fuente
xyembargo, sospecho que generalmente necesita usar al menos dos veces, para su asignación inicial, y leerlo después.15 caracteres, Python 2
Requiere que las variables se llamen
Fy enTlugar dexyy, y esob is Falseob is True, en lugar de ser números iguales0o1.Esto ahorra un carácter
"xy"[b]al tomar la primera letra de la representación de cadena deb, que esToF.fuente
ayr,lyuosye, con los índices apropiados.