2013-07-28 2 views
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, но как бы я это сделал?

+2

Помимо: использование изменяемых аргументов в качестве значений по умолчанию является [плохая привычка] (http://stackoverflow.com/questions/1132941/least-astonishment-in-python- параметр-mutable-default-argument), поэтому, вероятно, это хорошая идея, чтобы избежать этого, даже здесь, где это не имеет большого значения. – DSM

+0

Просто используя это в качестве примера. Я бы не сделал этого в производственном коде :) – ron975

ответ

6
>>> 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'] 
+0

Не могли бы вы дать мне знать, как использовать этот метод для сортировки списка dicts по наилучшему совпадению? – coda

+0

@coda SequenceMatcher может работать только с элементами хеширования. Поскольку dict не хешируется, вы не можете использовать его непосредственно для сортировки dicts. Как использовать это должно зависеть от вашего использования. Например, используйте что-то в dicts для сортировки. – zhangyangyu

+0

Спасибо @zhangyangyu! Я пробовал что-то вроде 'sorted (result, key = lambda x: difflib.SequenceMatcher (None, x ['artist_name'] + x ['name'], query) .ratio(), reverse = True)' и это кажется, дает мне (я думаю) желаемые результаты. Я не знаю, почему это работает. Вам кажется правильным? – coda

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)]