我是一个Python的初学者。这里我有一个比较两个列表的问题。我的第一个问题是列表不应该被完全比较。但它应该与另一个列表大约70%匹配,并且如果存在则返回true。在这种情况下,contains()方法无法帮助。这是我的列表:
TotalTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow", "vitamin-A"] #etc
LikedTags = ["citrus", "orange", "vitamin-D"]
我是一个Python的初学者。这里我有一个比较两个列表的问题。我的第一个问题是列表不应该被完全比较。但它应该与另一个列表大约70%匹配,并且如果存在则返回true。在这种情况下,contains()方法无法帮助。这是我的列表:
TotalTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow", "vitamin-A"] #etc
LikedTags = ["citrus", "orange", "vitamin-D"]
Sahil Desai在他的回答中提到的fuzzywuzzy库看起来非常简单。
这里有一个基本函数的想法。
TotalTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow", "vitamin-A"] #etc
LikedTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow"]
print(len(set(TotalTags).intersection(set(LikedTags))) / len(TotalTags)) # 0.8333333
print(sum([True for x in TotalTags if x in LikedTags]) / len(TotalTags)) # 0.8333333
您可以使用fuzzywuzzy Python库。
from fuzzywuzzy import fuzz
TotalTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow", "vitamin-A"] #etc
LikedTags = ["citrus", "orange", "vitamin-D"]
per = fuzz.ratio(TotalTags,LikedTags)
per
65
如果您只想匹配项目,则可以使用Jaccard相似性方法。此方法直接匹配两个列表的字符。
difflib.SequenceMatcher
来比较两个列表中每两个单词之间的相似度,如下所示:(仅输出相似度大于 70% 的两个单词)。from difflib import SequenceMatcher
TotalTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow", "vitamin-A"]
LikedTags = ["citrus", "orange", "vitamin-D"]
for a in LikedTags:
for b in TotalTags:
sim = SequenceMatcher(None, a, b).ratio()
if sim > 0.7:
print(f'similarity of {a} & {b} : {sim}')
输出:
similarity of citrus & citrus : 1.0
similarity of orange & orange : 1.0
similarity of vitamin-D & vitamin-C : 0.8888888888888888
similarity of vitamin-D & vitamin-A : 0.8888888888888888
你也可以使用内置的collections
模块来实现类似的功能。
import collections
TotalTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow", "vitamin-A"] #etc
LikedTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow"]
c = collections.Counter(TotalTags)
c.subtract(LinkedTags)
print(1-c.total()/len(TotalTags))
输出:
0.8333333333333334