在pythonlis中计算字符串匹配百分比

2024-09-28 23:15:45 发布

您现在位置: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运算符来表达?在


Tags: 代码inlenislistcomparetotalstrings
2条回答

这里有它,在一行中有一个lambda函数。Numpy mean是可选的(oyu可以实现自己的mean)

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

您可以使用itertools.combinations来获得所有的组合,然后使用sum,直接计算组合的数量,而不是计数。在

def compare_strings(mylist):
    if len(mylist) < 2: return 0.0
    total = sum(SequenceMatcher(None, a, b).ratio() for a, b in combinations(mylist, 2))
    cnt = (len(mylist) * (len(mylist)-1)) // 2
    return total / cnt

相关问题 更多 >