list对比遇到的坑

原创
2020/05/26 18:08
阅读数 844


前段时间在做算法优化改动评测时,需要将测试服务器和线上服务器的结果转换成两个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']"

<type 'str'> <type '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']"

<type 'list'> <type '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"

<type 'list'> <type 'list'>

['a', 'b'] ['c', 'd']

0.0

这样看结果就正确了。
总结一下:
给py文件传list参数时,不能直接通过参数传,需要先通过string传输,在脚本中转成list。








搜狗测试微信号:Qa_xiaoming

搜狗测试QQ粉丝群:459645679

本文分享自微信公众号 - 搜狗测试(SogouQA)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部