¿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'
1
Mario Reyes 10 oct. 2019 a las 12:19

4 respuestas

La mejor respuesta

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()
1
jtlz2 10 oct. 2019 a las 10:29

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'.

1
Massifox 10 oct. 2019 a las 09:54

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. :)

0
Cody huang 10 oct. 2019 a las 09:34

¿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
0
Arno Maeckelberghe 10 oct. 2019 a las 09:26
58319521