2014-12-05 53 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