此代码是公司已写好的代码,自己拿来学习,此代码的目标是得出pr图(即准确率和召回率图)所需数据
import csv def get_pr(test_result_file): table = [] reader = csv.reader(open(test_result_file)) for items in reader: table.append((items[1], items[2], float(items[3]))) table = sorted(table, lambda x, y : cmp(x[2], y[2]), reverse = True) length = len(table) count = 0 prs = {} for i in range(length): if table[i][0] == table[i][1]: count += 1 prs[table[i][2]] = (float(count) / (i+1), float(i+1) / length) prs = sorted(prs.iteritems(), key=lambda x : x[0], reverse = True) 1.没经过sorted前pres还是字典的结构,经过了sorted之后就是list的结构,所以后面print k[0]能用下标访问,如果还是字典就不行,因为字典只能按key访问 for k in prs: 2.sorted是不会改变原来的可迭代对象,只是生成一个新的经过顺序处理的可迭代对象,只是这里又用了prs= 来重新对prs更改 # threshold, precision, recall 3.如果把sorted中的prs.iteritems()去掉就会报错。不是因为sorted必须要用iteritems,是因为后面的函数处理是下标访问,如果不处理就仍是字典,字典不能 print k[0], k[1][0], k[1][1] 下标访问。这里如果去掉iteritems,同时去掉key,是可以跑成功,就和prs.key()效果一样,对key排序,但同时会只有key保留下来。所以代码只能这样写。也就是 return prs 说以后排序想同时保留key和value,只能这样写代码 get_pr("/home/xbwang/Desktop/s4.txt")
s4.txt结构:query,标准intend,测出的intend,得分
输出结果:
没经过sorted的prs:
经过sorted的prs:
如果按照.key()方式处理,prs的样子为:
http://www.cnblogs.com/nju2014/p/5569983.html