Tengo el siguiente código:
new_index = index + offset
if new_index < 0:
new_index = 0
if new_index >= len(mylist):
new_index = len(mylist) - 1
return mylist[new_index]
Básicamente, calculo un nuevo índice y lo uso para encontrar algún elemento de una lista. Para asegurarme de que el índice esté dentro de los límites de la lista, necesitaba escribir esas 2 if
declaraciones distribuidas en 4 líneas. Eso es bastante detallado, un poco feo ... Me atrevo a decir que es bastante poco pitónico .
¿Existe alguna otra solución más sencilla y compacta? (y más pitónico )
Sí, sé que puedo usar if else
en una línea, pero no se puede leer:
new_index = 0 if new_index < 0 else len(mylist) - 1 if new_index >= len(mylist) else new_index
También sé que puedo encadenar max()
y min()
juntar. Es más compacto, pero siento que es un poco oscuro, más difícil de encontrar errores si lo escribo mal. En otras palabras, no lo encuentro muy sencillo.
new_index = max(0, min(new_index, len(mylist)-1))
clamp = lambda value, minv, maxv: max(min(value, maxv), minv)
Usando la API de arma.sourceforge.net/docs.html#clampRespuestas:
En realidad, esto es bastante claro. Mucha gente lo aprende rápidamente. Puede utilizar un comentario para ayudarlos.
fuente
def clamp(n, smallest, largest): return max(smallest, min(n, largest))
helperFunctions.py
? ¿Un módulo separado? ¿Qué pasa si esto se llena de varias "funciones de ayuda" para cosas completamente diferentes?utils.py
por ejemplo:
fuente
sorted()
integrados. Muy compacto, pero un poco oscuro. De todos modos, ¡siempre es bueno ver otras soluciones creativas!min(max())
construcción. Un poco más rápido en el caso de que el número esté en el rango y no se necesiten cambios.muchas respuestas interesantes aquí, todas casi iguales, excepto ... ¿cuál es más rápida?
¡paxdiablo lo tiene !, usa python simple. La versión numpy es, quizás no sorprendentemente, la más lenta de todas. Probablemente porque está buscando matrices, donde las otras versiones simplemente ordenan sus argumentos.
fuente
mm_clip
ypy_clip
será igualmente rápido si usa el compilador JIT, como PyPy. Excepto que el primero es más legible, y la legibilidad es más importante en la filosofía de Python que una ligera ganancia de rendimiento la mayor parte del tiempo.Ver numpy.clip :
fuente
clip
esa
, una "matriz que contiene elementos para recortar". Entonces tendrías que escribirnumpy.clip([index], …
, nonumpy.clip(index, …
.Encadenar
max()
ymin()
juntar es el idioma normal que he visto. Si le resulta difícil de leer, escriba una función auxiliar para encapsular la operación:fuente
¿Qué pasó con mi amado lenguaje Python legible? :-)
En serio, solo hazlo una función:
luego simplemente llámalo con algo como:
O una solución más simple y flexible en la que usted mismo hace el cálculo:
Si quisiera, incluso podría hacer que el mínimo / máximo sea una lista para que se vea más "matemáticamente puro":
fuente
min
ymax
son mucho más claro que un montón de condicionales. (No sé para quéadd
sirve, solo diloclamp(val + 7, 0, 42)
.)Este me parece más pitónico:
Algunas pruebas:
fuente
Si su código parece demasiado difícil de manejar, una función podría ayudar:
fuente
Evite escribir funciones para tareas tan pequeñas, a menos que las aplique con frecuencia, ya que saturará su código.
para valores individuales:
para listas de valores:
fuente