将一个字典的元素与另一个字典中的值范围进行比较

时间:2014-09-08 22:17:58

标签: python list dictionary key-value key-value-coding

valid = {'Temp': [10, 55], 'rain_percent': [49, 100], 'humidity': [30,50]}
data = {'Temp': 30.45, 'rain_percent': 80.56 }

min_temp , max_temp = valid['Temp']
if not(min_temp <= data['Temp'] <= max_temp):
    print "Bad Temp"

min_rain , max_rain = valid['rain_percent']
if not(min_rain <= data['rain_percent'] <= max_rain):
    print "It's not going to rain"

这就是我对我所拥有的两个词典所做的事情。我知道这个检查可以进一步修改。由于两个字典validdata具有相同的keys,因此必须有更好的方法来实现此检查。任何人都可以帮助我吗? 非常感谢。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以尝试检查每个值data[k]是否在2元素列表/元组valid[k]定义的范围内。

尝试使用for循环和dict.items()来迭代data并将每个值与valid中的相应范围进行比较:

valid = {'Temp': [10, 55], 'rain_percent': [49, 100], 'humidity': [30,50]}
data = {'Temp': 30.45, 'rain_percent': 80.56, 'humidity': 70 }

for key,val in data.items():
    min, max = valid[key]
    if not( min <= val <= max ):
       print "%s=%g is out of valid range (%g-%g)" % (key, val, min, max)
    else:
       print "%s=%g is in the valid range (%g-%g)" % (key, val, min, max)

对于我给出的示例data值,它将打印出来:

rain_percent=80.56 is in the valid range (49-100)
Temp=30.45 is in the valid range (10-55)
humidity=70 is out of valid range (30-50)

答案 1 :(得分:1)

这个答案是建立在@ Dan的基础上的。

您可能希望将其他参数添加到“有效”状态。 avg,标准偏差等字典以及更多数据点,如air_pressure,wind_speed,visibility等。

特别是在你有更多数据点(温度,湿度等)和更多参数和标签(min,max,&#39)的情况下;高温,低温,等等,你会希望你的有效&#39;字典更具描述性。然后,您可以编写更灵活,更具描述性的一般功能,具体取决于您的有效&#39;的深度。字典。

这是一个例子。我们现在打电话给“有效的”&#39;字典&#39;参数。&#39;

parameters = {
    'temp': {
        'min':10, 
        'max':55,
        'avg':40,
        'stddev':10, 
        'in_range_label':"Good Temp", 
        'out_range_label':"Bad Temp", 
        'above_average_label':"Above average temp", 
        'below_average_label':"Below average temp",
    },
    'rain_percent': {
        'min':49, 
        'max':100,
        'avg':75, 
        'in_range_label':"Going to rain", 
        'out_range_label':"Not going to rain", 
        'above_average_label':"Above average rain", 
        'below_average_label':"Below average rain", 
        }, 
    'humidity': {
        'min':30, 
        'max':50,
        'avg':45, 
        'in_range_label':"Humid", 
        'out_range_label':"Not humid" , 
        'above_average_label':"Above average hemp", 
        'below_average_label':"Below average humidity",
        }
    }

data = {'temp': 30.45, 'rain_percent': 80.56 }

def check_min_max(data, parameters):
    for k, v in data.items():
        min = parameters[k]['min']
        max = parameters[k]['max']
        if min <= v <= max:
            print '{}={}, {}'.format(k, v, parameters[k]['in_range_label'])
        else:
            print '{}={}, {}'.format(k, v, parameters[k]['out_range_label'])

def check_avg(data, parameters):
    for k, v in data.items():
        avg = parameters[k]['avg']
        if v > avg:
            print '{}={}, {}'.format(k, v, parameters[k]['above_average_label'])
        else:
            print '{}={}, {}'.format(k, v, parameters[k]['below_average_label'])

check_min_max(data, parameters)
check_avg(data, parameters)

>>>
rain_percent=80.56, Going to rain
temp=30.45, Good Temp
rain_percent=80.56, Above average rain
temp=30.45, Below average temp