前段时间在做算法优化改动评测时,需要将测试服务器和线上服务器的结果转换成两个list,再对两个list进行结果验证。在进行两个list的距离相似度验证时,遇到了一点小波折,在这里和大家分享下~
问题发现:
在分析对比结果badcase时,发现在传给pygetdisval.py两个list:[‘a’,’b’]和[‘c’,’d’]时,发现返回的结果不符合预期:
pygetdisval.py代码如下:
#!/usr/bin/env python
# coding=utf-8
import Levenshtein,sys
a = sys.argv[1]
b = sys.argv[2]
#print a,b
print Levenshtein.seqratio(a, b)
运行结果如下:
[@hbhly_56_129 levenshtein]# python pygetdisval.py "['a','b']" "['c','d']"
0.777777777778
而实际上,这两个list的相似度应该是0的。那么问题到底出现在哪呢?
打印出两个参数看一下:
[@hbhly_56_129 levenshtein]# python pygetdisval.py "['a','b']" "['c','d']"
['a','b'] ['c','d']
0.777777777778
打印出a、b两个类型来看一下:
[@hbhly_56_129 levenshtein]# python pygetdisval.py "['a','b']" "['c','d']"
'str'> 'str'>
0.777777777778
果然,传入的两个参数list会变成str。这样的对比就不是两个list对比了,而是两个string的对比。而levenshtein对于两个string的对比,levenshtein算法对于字符串是逐个字符,也就是[‘a’,’b’]和[‘c’,’d’]都会变成9个字符,而[ ] ’ ’ , 这些字符在两个字符串中都存在,所有结果为0.77这个结果也就能说的通了。
知道问题后,解决方案自然是将两个str转成list。
首先试了一下强转:
a = list(sys.argv[1])
b = list(sys.argv[2])
print type(a),type(b)
print a,b
print Levenshtein.seqratio(a, b)
[@hbhly_56_129 levenshtein]# python pygetdisval.py "['a','b']" "['c','d']"
'list'> 'list'>
['[', "'", 'a', "'", ',', "'", 'b', "'", ']'] ['[', "'", 'c', "'", ',', "'", 'd', "'", ']']
0.777777777778
发现结果还是没变,而且虽然转成list,但是将每个字符转成list中的元素,这显然是不行的。
重新调整了下:
1、传入的参数不再是两个list,而是以 , 分割的字符串:a,b和c,d
2、在py里面先将字符串转成list,再进行距离对比。
脚本调整如下:
#!/usr/bin/env python
# coding=utf-8
import Levenshtein,sys
#b = ['a','b']
#a = ['c']
a = list(sys.argv[1].split(','))
b = list(sys.argv[2].split(','))
print type(a),type(b)
print a,b
print Levenshtein.seqratio(a, b)
[@hbhly_56_129 levenshtein]# python pygetdisval.py "a,b" "c,d"
'list'> 'list'>
['a', 'b'] ['c', 'd']
0.0
这样看结果就正确了。总结一下:
给py文件传list参数时,不能直接通过参数传,需要先通过string传输,在脚本中转成list。
搜狗测试微信号:Qa_xiaoming
搜狗测试QQ粉丝群:459645679