2014-12-05 54 views
0

我试图检查一个值与min_value和max_value,但max_value无法设置,因此没有最大限制。再次检查值的最大和最小变量

下面是使用一些TESTDATA我从Atom提要林得到

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

不是很Python的,但它的作品。

+0

可以粘贴从输入文件抓住最小值/最大值的代码? – Stuart 2014-12-05 11:40:10

+0

输入中没有f_max_value_d。你的问题仍然很不清楚。 – kmario23 2014-12-05 11:44:35

+0

@ mario23:对不起,如果不清楚。如果没有f_max_value_d或f_​​max_value_c或f_max_value_b或f_max_value_a,则意味着没有上限,这是我试图解决/检查的问题。 – 2014-12-05 11:52:28

回答

0

您只需检查f_max_value_...是否在数据中,然后再与test_amount进行比较。但是,在循环中执行此操作将比较容易,而不是四次输入相同的比较结果。我想你还需要将数据转换为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设置最大找不到的情况下,无穷大的默认值。那么你的条件为:

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

编辑。如果最小值也可能丢失,可以按如下方式进行更改,以设置最小值和最大值的默认值。但要小心:如果在某些情况下只分配了最小值,并且在其他情况下只分配了最大值,您怎么知道哪个目标是正确的?您需要检查这是给定您的特定输入数据的正确分配目标。

第二次编辑。我添加了一个函数来删除字符串中的所有空白,并在其中有空格(包括非空格)时转换为浮点。

第三次编辑。如果没有找到与特定标签相对应的号码,我做了默认的'nan'。这将处理数据中的缺失值而不会产生错误。

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 
+0

你正在把'data'当作字典对象,你确定这是事实吗?无可否认,如果它在哪里会更pythonic,但恕我直言,我们不知道。 – PeterE 2014-12-05 12:46:23

+0

@Peter我假设它是['feedparser'](http://pythonhosted.org//feedparser)模块,并且已经测试过它并且可以工作。它在文档中并没有完全清楚,但条目似乎是类似字典的对象,其内部的数据可以作为对象属性('data.f_max_value_a')或字典值('data ['f_max_value_a']')访问。例如。参见[此页](http://pythonhosted.org//feedparser/basic-existence.html)上进行测试的存在。 – Stuart 2014-12-05 12:55:16

+0

好吧,这使我的答案无用。 ;) – PeterE 2014-12-05 13:01:30