代码15

此代码是公司已写好的代码,自己拿来学习,此代码的目标是得出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

原文地址:https://www.cnblogs.com/ymjyqsx/p/6411159.html