打印list_list对比遇到的坑

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

36a81f490c4600ce7fc4c71c3b77bd2d.png

搜狗测试QQ粉丝群:459645679

6ce28a23135dd91bcad57806feb81324.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值