根据最大和最小变量检查值

时间:2014-12-05 11:35:17

标签: python

我试图根据min_value和max_value检查一个值,但是无法设置max_value,因此没有最大限制。

这是我使用

从原子进料Im得到的一些测试数据
<entry>
    <content type="application/xml">
        <f:fpdata>
             <f:max_value_a>500 000</f:max_value_a> #OPTIONAL
             <f:max_value_b>100 0000</f:max_value_b> #OPTIONAL
             <f:max_value_c>2 000 000</f:max_value_c> #OPTIONAL
             <f:max_value_d>3 000 001</f:max_value_d> #OPTIONAL
             <f:min_value_a>0</f:min_value_a>
             <f:min_value_b>500 000</f:min_value_b> #OPTIONAL
             <f:min_value_c>100 0000</f:min_value_c> #OPTIONAL
             <f:min_value_d>2 000 000</f:min_value_d> #OPTIONAL
             <f:target_1_a>1,1</f:f:target_1_a>
             <f:target_1_b>2,2</f:target_1_b> #EXIST ONLY IF <f:min_value_b> is set
             <f:target_1_c>3,3</f:target_1_c> #EXIST ONLY IF <f:min_value_c> is set
             <f:target_1_d>4,4</f:target_1_d> #EXIST ONLY IF <f:min_value_d> is set
             <f:target_2_a>10</f:f:target_2_a>
             <f:target_2_b>20</f:target_2_b> #EXIST ONLY IF <f:min_value_b> is set
             <f:target_2_c>30</f:target_2_c> #EXIST ONLY IF <f:min_value_c> is set
             <f:target_2_d>40</f:target_1_d> #EXIST ONLY IF <f:min_value_d> is set
         </f:fpdata>
     </content>
</entry>

编辑:

以下是较大数据集的粘贴:http://pastebin.com/r5HkWHA5

这是我到目前为止所尝试的内容

request = urllib2.Request(settings.FEED_URL)
base64string = base64.encodestring('%s:%s' % (settings.FEED_USERNAME, settings.FEED_PASS)).replace('\n', '')
request.add_header("Authorization", "Basic %s" % base64string)   
result = urllib2.urlopen(request)    

d = feedparser.parse(result)

for data in d.entries:

    test_amount = 3000000.00

    values = {}

    if (data.f_min_value_d <= test_amount) and (data.f_max_value_d >= test_amount):
        values.update({'target' : data.f_target_d})
    if (data.f_min_value_c <= test_amount) and (data.f_max_value_c >= test_amount):
        values.update({'target' : data.f_target_c})
    if (data.f_min_value_b <= test_amount) and (data.f_max_value_b >= test_amount):
        values.update({'target' : data.f_target_b})
    if (data.f_min_value_a <= test_amount) and (data.f_max_value_a >= test_amount):
        values.update({'target' : data.f_target_a})

如果test_amount3000000.00,我应该获得data.f_target_d变量。

如果test_amount50000.00,我应该获得data.f_target_a变量。

我需要帮助来检查是否设置了任何max_value_ *(如果未设置,则表示没有上限最大值)

编辑2:

以下是我现在使用的代码:

values = {}
values.update({'query' : None})


def clean(entry, label, default='nan'):
    return float(''.join(entry.get(label, default).split()))

labels = [['f_{}_{}'.format(label, c) for label in 'min_value', 'max_value', 'target_1', 'target_2'] 
          for c in 'abcd']
for data in d.entries:
    for min_label, max_label, target_1_label, target_2_label in labels:
        min_value = clean(data, min_label, '-inf')
        max_value = clean(data, max_label, 'inf')
        if min_value < test_amount <= max_value:
            target = clean(data, target_label)

            values.update({'target_1' : clean(data, target_1_label),  'target_2' : clean(data, target_2_label), 'query' : True})

我没有收到任何错误,但target_1_labeltarget_2_label会在所有数据上返回nan

编辑3

对于每个字母(a,b,c,d)

,结束这样做
if hasattr(data, 'f_max_value_d'):
    max_value_d = int(data.f_max_value_d.replace(u'\xa0',''))
else:
    max_value_d = None

if hasattr(data, 'f_min_value_d'):
    min_value_d = int(data.f_min_value_d.replace(u'\xa0',''))
else:
    min_value_d = None


if (min_value_d is None or min_value_d <= test_amount) and (max_value_d is None or max_value_d >= test_amount) and min_value_d is not None:
    values.update({'target1' : int(data.f_target_1_d.replace(u'\xa0','')), 'target2' : int(data.f_target_2_d.replace(u'\xa0','')), 'query' : True})

不是非常pythonic,但它的工作原理。

1 个答案:

答案 0 :(得分:0)

您必须先检查f_max_value_...是否在数据中,然后再与test_amount进行比较。但是,在循环中执行此操作会更容易,而不是输入相同的比较4次。我认为您还需要将数据转换为float才能进行比较。

labels = [['f_{}_{}'.format(label, c) for label in 'min_value', 'max_value', 'target'] 
          for c in 'abcd']
for data in d.entries:
    test_amount = 3000000
    for min_label, max_label, target_label in labels:
        if float(data[min_label]) < test_amount and (max_label not in data or test_amount <= float(data[max_label])):
            target = data[target_label]
    print target

或者更整洁,如果找不到最大值,您可以使用data.get设置默认值infinity。然后你的状况变成:

if float(data[min_label]) < test_amount <= float(data.get(max_label, float('inf'))):

EDIT。如果还可能缺少最小值,则可以按如下方式更改以设置最小值和最大值的默认值。但是要小心:如果在某些情况下仅分配了最小值,并且在其他情况下仅分配了最大值,您将如何知道哪个目标是正确的?您将需要检查这是否正确地为给定您的特定输入数据分配目标。

第二次编辑。我添加了一个函数来从字符串中删除所有空格并转换为float,以防其中有空格(包括非破坏空格)。

第三次编辑。我做了默认的&#39; nan&#39;如果没有找到对应于特定标签的数字。这将处理数据中的缺失值而不会引发错误。

def clean(entry, label, default='nan'):
    return float(''.join(entry.get(label, default).split()))

labels = [['f_{}_{}'.format(label, c) for label in 
           'min_value', 'max_value', 'target_1', 'target_2'] for c in 'abcd']
for data in d.entries:
    for min_label, max_label, target_label_1, target_label_2 in labels:
        min_value = clean(data, min_label, '-inf')
        max_value = clean(data, max_label, 'inf')
        if min_value < test_amount <= max_value:
            target = data[target_label_1], data[target_label_2]
    print target