python - 计算python列表中的字符串匹配百分比
问题描述
我有一个文本列表,我想在其中提取它们在 [0,1] 之间的相似程度的百分比。这是我的代码:
from difflib import SequenceMatcher
listA = ['aaa','sss','ba']
listB = ['aa','aa']
def compare_strings(mylist):
if (len(mylist) < 2):
return 0.00
else:
cnt = 0
total = 0.0
for i in range(len(mylist)):
for j in range(i + 1, len(mylist)):
val = SequenceMatcher(None, mylist[i], mylist[j]).ratio()
total += val
cnt += 1
return (total / cnt)
print( "Sting simalarity in list 1 is %.5f" % (compare_strings(listA)))
print( "Sting simalarity in list 2 is %.5f" % (compare_strings(listB)))
>>>
Sting simalarity in list 1 is 0.13333
Sting simalarity in list 2 is 1.00000
这段代码很实用,但我不喜欢它,因为它看起来有点复杂。有没有更好或更优雅的方法来解决这个问题?有没有办法用 lambda 运算符来表达这一点?
解决方案
在这里,您可以在一行中使用一个 lambda 函数。Numpy 均值是可选的(您可以实现自己的均值)
from difflib import SequenceMatcher
import numpy as np
import itertools
listA = ['aaa','sss','ba']
listB = ['aa','aa']
similarity = lambda x: np.mean([SequenceMatcher(None, a,b).ratio() for a,b in itertools.combinations(x, 2)])
similarity(listA)
#> 0.13333333333333333
similarity(listB)
#> 1.0
推荐阅读
- c - 警告:格式“%d”需要类型“int”,但参数 2 的类型为“int (*)(int *)”
- php - $_SESSION 不持有数组
- java - Spark Bean Encoder 为嵌套类映射错误的值
- r - as.Date.numeric : 'origin' 必须由提供
- javascript - 逻辑繁重的 Promise 是否链接“回调地狱”?
- python - 使用画布在网格布局上的预期单元格位置未绘制图形的问题
- password-encryption - 存储数学操作密码的安全性
- vba - 如何将日文日期转换为公历日期格式?
- c++ - 如何让预处理器采用模板参数?
- c# - c# 从第二个列表中删除元素