我有两个不同的变量,每个变量的值在-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中执行此操作)。
答案 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))
语句);当有很多变量和范围要定义时,这将很有帮助。