值范围到字符串的映射

时间:2018-12-19 14:26:24

标签: python python-3.x

我有两个不同的变量,每个变量的值在-1和1之间。

我希望能够根据其值在一定范围内,将每个变量映射到其对应的字符串,例如:

var_a = 0.34
var_b = 0.94

# var_a ranges:

if var_a is between -0.1 and 0.1, then var_a = 'pink'
if var_a is between 0.1 and 0.35, then var_a = 'red'
...

# thus var_a = 'red'


# var_b ranges:

if var_b is between 0 and 1.0, then var_b = 'yellow'
if var_b is between -1.0 and -0.01, then var_b = 'lilac'
...

# thus var_b = 'yellow'

我已经能够使用if语句完成上述操作,但是其中有很多语句,因此感觉必须有更好的解决方案(尝试在Python中执行此操作)。

4 个答案:

答案 0 :(得分:3)

这将起作用

ranges = {
    'red': (-1, 0),
    'blue': (0, 0.5),
    'pink': (0.5, 1),
}

var_x = 0.7

for name, range in ranges.items():
  if range[0] <= var_x <= range[1]:
    var_x = name
    break

print (var_x)

答案 1 :(得分:1)

您可以使用IntervalIndex中的pandas API真正轻松地做到这一点。

import pandas as pd

labels = ['pink', 'red']

idx = pd.IntervalIndex.from_breaks([-0.1, 0.1, 0.35], closed='left')
labels[idx.get_loc(0.34)]
# 'red'
对于给定值,

索引是对数时间复杂度(与此处的所有其他解决方案(线性时间)不同)。如果需要检索多个索引,或者需要处理越界范围,请使用idx.get_indexer

答案 2 :(得分:0)

if链的一种替代方法是使用字典映射函数(如果可能,可以使用lambda)映射到所需的值。因此,使用您的示例:

d = {(lambda x: -0.1 < x <= 0.1): 'pink', (lambda x: 0.1 < x <= 0.35): 'red'}
var_a = 0.2

for check in d:
    if check(var_a):
        var_a = d[check]
        break

如果您正在寻找一个干净,简洁,可理解的解决方案,这很好。

答案 3 :(得分:0)

一种解决方案可能是这样的:

sum

可以这样使用:

class Element:
    def __init__(self, id, value):
        self.id = id
        self.value = value

l = [Element(1, 100), Element(1, 200), Element(2, 1), Element(3, 4), Element(3, 4)]

ids = set(elem.id for elem in l)
totals = [Element(i, sum(elem.value for elem in l if elem.id == i)) for i in ids]
# [Element(1, 300), Element(2, 1), Element(3, 8)]

这具有以下优点:(大多数)值范围易于读取并且全部集中在一个位置(之间没有def get_color(var_name, value): the_ranges = { 'var_a': [ (-0.1, 0.1 , 'pink'), ( 0.1, 0.35, 'red'), ], 'var_b': [ ( 0 , 1.0 , 'yellow'), (-1.0, -0.01, 'lilac'), ], } for v_min, v_max, color in the_ranges[var_name]: if v_min <= value <= v_max: return color raise ValueError('nothing found for {} and value {}'.format(var_name, value)) 语句);当有很多变量和范围要定义时,这将很有帮助。