3

可以说我正在构建一个基本的搜索引擎。我有一个字符串列表作为搜索结果,我想对搜索结果列表进行排序,其中最匹配的结果位于顶部。

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

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,但我该怎么做呢?

4

2 回答 2

12
>>> 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']
于 2013-07-28T00:08:42.107 回答
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)]
于 2013-07-28T00:16:36.973 回答