基于值返回颜色名称的优雅方法

时间:2019-10-10 09:19:57

标签: python

是否有更好的方法让函数根据传递给它的值来输出颜色名称?可以替换下面的if else算法。

此外,理想情况下,颜色将来自标准颜色图,而不必在if else语句中手动编写每个颜色名称。

谢谢

def color_from_value(val):
    if val <= 1:
        return 'red'
    elif val < 2:
        return 'blue'
    elif val < 3:
        return 'green'
    .
    .
    .
    else:
        return 'black'

4 个答案:

答案 0 :(得分:1)

在您的情况下,一个简单的字典就足够了:

options = {1: 'red',
           2: 'blue',
           3: 'green'}

options[1]

# output: 'red'

您可以通过将函数与字典的每个元素相关联来泛化此方法:

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'

注意:如果要在字典中不存在该键时使用默认值,则可以通过以下方式访问它:

options.get(key, 'black') # or options.get(key, lambda: 'black')()

如果key不是options键,则返回'black'

答案 1 :(得分:1)

您可以使用一个简单的列表,这对于迭代例如matplotlib / pyplot行。 (但是,这不会处理您的范围/限制。)例如:

colors = ['red','blue','green','black']
i=0
chosen_color = colors[i] # red

例如,您可以将其设为lambda以便处理默认情况(从health_check_type借用):

color_from_value = lambda i: colors[i] if i < len(colors) else 'black'

assert(color_from_value(0) == 'red')

对于matplotlib,假设您要绘制两个不同的数据集:

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

然后:

for i in range(2):
    plt.plot(x,y[i],color=colors[i],label=labels[i])
_=plt.legend()
plt.show()

答案 2 :(得分:0)

您可以改用词典吗?:

mapping = {1: 'red',
           2: 'blue',
           3: 'green'}
mapping.get(value, 'black')  # 'black' is default in case requested key is not in mapping

答案 3 :(得分:0)

您可以创建一个名为color.property的文件。 该文件的内容将如下所示:

[color]
1=red
2=blue
3=green
...

然后输入代码:

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

没有if-else。 :)