¿Hay una mejor manera de hacer que una función muestre un nombre de color dependiendo del valor que se le pase? Algo más elegante para reemplazar el algoritmo if else
a continuación.
Además, lo ideal sería que los colores provengan de un mapa de colores estándar en lugar de tener que escribir manualmente cada nombre de color en la declaración if else
.
Gracias
def color_from_value(val):
if val <= 1:
return 'red'
elif val < 2:
return 'blue'
elif val < 3:
return 'green'
.
.
.
else:
return 'black'
4 respuestas
Puede usar una lista simple, que puede ser útil para iterar, p. líneas matplotlib / pyplot. (Sin embargo, esto no se ocupa de su rango / límites). Por ejemplo:
colors = ['red','blue','green','black']
i=0
chosen_color = colors[i] # red
Podría hacer de esto una lambda, por ejemplo, para manejar el caso predeterminado (pedir prestado de https://stackoverflow.com/a/2574659 / 1021819):
color_from_value = lambda i: colors[i] if i < len(colors) else 'black'
assert(color_from_value(0) == 'red')
Para matplotlib, suponga que desea trazar dos conjuntos de datos diferentes:
import numpy as np
import matplotlib.pyplot as plt
colors = ['r','b','g','k']
x = np.linspace(0.0,1.0,11)
y = [2.0*x,x**2 + 1.0]
labels = ['linear','quadratic']
Entonces:
for i in range(2):
plt.plot(x,y[i],color=colors[i],label=labels[i])
_=plt.legend()
plt.show()
En su caso, un diccionario simple es suficiente:
options = {1: 'red',
2: 'blue',
3: 'green'}
options[1]
# output: 'red'
Puede generalizar este método asociando una función con cada elemento del diccionario:
def do_red():
return 'red'
def do_blue():
return 'blue'
def do_green():
return 'green'
# map the inputs to the function blocks
options = {1: do_red,
2: do_blue,
3: do_green}
options[1]()
# output: 'red'
NOTA : si desea tener un valor predeterminado cuando la clave no existe en el diccionario, puede acceder de esta manera:
options.get(key, 'black') # or options.get(key, lambda: 'black')()
Si key
no es una tecla options
, entonces devuelve 'black'
.
Puedes crear un archivo llamado color.property
. el contenido de este archivo se vería así:
[color]
1=red
2=blue
3=green
...
Luego en el código:
import ConfigParser
import math
config = ConfigParser.RawConfigParser()
config.read('color.property')
def color_from_value(val):
//using floor to get integer. like 2.98->2
return config.get('color', math.floor(val))
No hay if-else. :)
¿Podrías usar un diccionario en su lugar ?:
mapping = {1: 'red',
2: 'blue',
3: 'green'}
mapping.get(value, 'black') # 'black' is default in case requested key is not in mapping