Сортировка списка на основе поисковых запросов - PullRequest
0 голосов
/ 06 июля 2018

У меня есть список строк, и я должен отсортировать его по какой-то строке поиска.

My Search String is Home Depot

MyList = ['Depot Home','Rollins Home Furniture','HomeDepot 1346','Home Depot']

Ожидаемый результат:

Sorted list: ['HomeDepot 1346','Home Depot','Depot Home','Rollins Home Furniture']

В отсортированном списке первый элемент является точным соответствием строки поиска, удаляя пробелы, второй также является точным соответствием с пробелом, а 3-й элемент является частичным совпадением депо (в алфавитном порядке), а 4-й элемент также является частичным совпадением для Home (алфавитный заказ, размещенный после депо)

Что я сделал до сих пор:

searchquery_startswith=[w for w in Mylist if w.startswith('HOME DEPOT'.strip())]
searchquery_substring= [w for w in Mylist if ('HOME DEPOT' in w and w not in searchquery_startswith)]

Я знаю, что могу сделать что-то подобное, но я ищу более питонский способ достичь этого. Всю помощь оценили

1 Ответ

0 голосов
/ 06 июля 2018

Вы можете определить пользовательскую функцию, которая ранжирует ваши слова по заданному поисковому запросу, а затем использовать ее в сочетании с sorted.

def search_for_home_depot(word):
    result = 0
    if word.lower().startswith('HOME DEPOT'.lower().replace(' ','')):
        result += -2

    if 'HOME DEPOT'.lower() in word.lower():
        result += -1

    return result

l = ['Depot Home','Rollins Home Furniture','HomeDepot 1346','Home Depot']

print([search_for_home_depot(x) for x in l])

print(sorted(l, key=search_for_home_depot))

> [0, 0, -2, -1]
> ['HomeDepot 1346', 'Home Depot', 'Depot Home', 'Rollins Home Furniture']

Вы можете адаптировать условия и веса каждой отдельной проверки к точной детализации ваших результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...