我试图根据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_amount
为3000000.00
,我应该获得data.f_target_d
变量。
如果test_amount
为50000.00
,我应该获得data.f_target_a
变量。
我需要帮助来检查是否设置了任何max_value_ *(如果未设置,则表示没有上限最大值)
以下是我现在使用的代码:
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_label
和target_2_label
会在所有数据上返回nan
。
对于每个字母(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,但它的工作原理。
答案 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