Stop a value from being incremented in each dictionary iteration
我使用的是 Python 2.7。我有两个 tsv 数据文件,我将它们读入两个字典,我想计算它们的
这些是我的字典的样子:
1 2 | gold = {'A11':'cat', 'A22':'cat', 'B3':'mouse'} results = {'A2':'cat', 'B2':'dog'} |
我的代码主要是迭代
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | from __future__ import division import string def eval(): tp=0 #true positives fn=0 #false negatives fp=0#false positives gold = {'A11':'cat', 'A22':'cat', 'B3':'mouse'} results = {'A2':'cat', 'B2':'dog'} #iterate gold dictionary for i,j in gold.items(): #remove the digits off gold keys i_stripped = i.rstrip(string.digits) #iterate results dictionary for k,v in results.items(): #remove the digits off results keys k_stripped = k.rstrip(string.digits) # check if key match! if i_stripped == k_stripped: #check if values match then increment tp if j == v: tp += 1 #delete dictionary entries to avoid counting them again del gold_copy[i] del results_copy[k] #get out of this loop we found a match! break continue # NO match was found in the results, then consider it as fn fn += 1 #<------ wrong calculations caused in this line print 'tp = %.2f fn = %.2f recall = %.2f ' % (tp, fn, float(tp)/(tp+fn)) |
这是输出:
1 | tp = 1.00 fn = 3.00 recall = 0.25 |
谢谢你,
在我看来,只有在结果中没有找到匹配项时,您才想增加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #iterate gold dictionary for i,j in gold.items(): # create a variable that indicates whether a match was found match_found = False #remove the digits off gold keys i_stripped = i.rstrip(string.digits) #iterate results dictionary for k,v in results.items(): #remove the digits off results keys k_stripped = k.rstrip(string.digits) # check if key match! if i_stripped == k_stripped: #check if values match then increment tp if j == v: tp += 1 # now a match has been found, change variable match_found = True #delete dictionary entries to avoid counting them again del gold_copy[i] del results_copy[k] #get out of this loop we found a match! break continue # NO match was found in the results, then consider it as fn # now, only if no match has been found, increment fn if not match_found : fn += 1 #<------ wrong calculations caused in this line |
如果这不是您所需要的,您应该能够对其进行修改以使其正常工作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | tp = 0 #true positives fn = 0 #false negatives fp = 0 #false positives gold = {'A11':'cat', 'A22':'cat', 'B3':'mouse'} results = {'A2':'cat', 'B2':'dog'} for gold_k, gold_v in gold.items(): # Remove digits and make lower case clean_gold_k = gold_k.rstrip(string.digits).lower() for results_k, results_v in results.items(): # Remove digits and make lower case clean_results_k = results_k.rstrip(string.digits).lower() keys_agree = clean_gold_k == clean_results_k values_agree = gold_v.lower() == results_v.lower() print('\ -------------------------------------') print('Gold = ' + gold_k + ': ' + gold_v) print('Result = ' + results_k + ': ' + results_v) if keys_agree and values_agree: print('tp') tp += 1 elif keys_agree and not values_agree: print('fn') fn += 1 elif values_agree and not keys_agree: print('fp') fp += 1 |