首页 > 解决方案 > 计算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 运算符来表达这一点?

标签: pythonstring

解决方案


在这里,您可以在一行中使用一个 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

推荐阅读