如何通过最佳匹配(difflib比率)对字符串列表进行排序

时间:2013-07-28 00:05:07

标签: python list sorting difflib

让我们说我正在建立各种各样的基本搜索引擎。我有一个字符串列表作为搜索结果,我想在顶部订购具有最佳匹配结果的搜索结果列表。

我当前的代码如下所示(命名参数为例子)

import difflib
def order_by_best_match(search_results=["spam", "eggs", "spammy", "eggy"], search_query="spam"):

    for result in search_results:
        ratio = difflib.SequenceMatcher(None, result, search_query).ratio()

之后我不知道如何处理ratio。我知道我必须按ratio对列表进行排序,但我该怎么办呢?

2 个答案:

答案 0 :(得分:9)

>>> import difflib
>>> a = ["spam", "eggs", "spammy", "eggy"]
>>> b = 'spam'
>>> sorted(a, key=lambda x: difflib.SequenceMatcher(None, x, b).ratio())
['eggy', 'eggs', 'spammy', 'spam']

另外,如果您想要相反的顺序:

>>> sorted(a, key=lambda x: difflib.SequenceMatcher(None, x, b).ratio(), reverse=True)
['spam', 'spammy', 'eggs', 'eggy']

答案 1 :(得分:3)

sorted函数采用key参数,您可以使用该参数来确定事物的排名方式。通常的做法是构建一个元组列表,然后根据元组的一个元素进行排序。

for result in search_results:
    ratio = difflib.SequenceMatcher(None, result, search_query).ratio()
    weighted_results.append((result, ratio))

print weighted_results
print sorted(weighted_results, key=lambda x: x[1])

给我们

[('spam', 1.0), ('eggs', 0.25), ('spammy', 0.8), ('eggy', 0.0)]
[('eggy', 0.0), ('eggs', 0.25), ('spammy', 0.8), ('spam', 1.0)]