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,y
fuera 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 b
es 0
o 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
V
actualice automáticamente, sin necesidad de volver a llamar a la función. Entonces esto se iguala conexec
dos usos. Además, solovars()["xy"[b]]=z
hay 17 caracteres, que es lo mejor que tenemos hasta ahora para Python 3, sin el flujo de controlif/else
que puede causar problemas.vars()["xy"[b]]=z
:?14 caracteres, Python 2
Las dos variables son
y
yxy
. Si b = 0, esto establecexy=z
. Si b = 1, esto establecey=z
. Esto valdrá la pena si noxy
se usa más de una vez en otra parte del código.fuente
xy
embargo, 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
F
y enT
lugar dex
yy
, y esob is False
ob is True
, en lugar de ser números iguales0
o1
.Esto ahorra un carácter
"xy"[b]
al tomar la primera letra de la representación de cadena deb
, que esT
oF
.fuente
a
yr
,l
yu
os
ye
, con los índices apropiados.