Как использовать difflib для возврата списка путем поиска элемента в списке?

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

list123 = [["Title a1","100 Price","Company xx aa"], ["Title b1","200 Price","Company yy bb"], ["Title c1","300 Price","Company zz cc"]]

Как использовать difflab.get_close_matches (или что-то еще) для возврата всего внутреннего списка путем поиска определенного внутреннего-внутреннего элемента, соответствующего параметру поиска?

Как я думал, это будет работать:

print(difflib.get_close_matches('Company xx a', list123))

ожидаемый результат/выход, который я хотел бы:

 ["Title a1","100 Price","Company xx aa"]

Фактический результат:

 []

Я знаю об использовании чего-то вроде:

for item in list123:
    if "Company xx aa" in item:
        print(item)

Но я хотел бы использовать библиотеку difflib (или что-то еще), чтобы обеспечить более человеческий поиск, где допускаются небольшие орфографические ошибки.

Если я неправильно понял цель функции, есть ли другая, которая может достичь того, чего я хочу?


person nordmanden    schedule 02.12.2020    source источник


Ответы (2)


Проблема в том, что вторым параметром get_closest_matches должен быть список строк из файла документация:

Возможности — это список последовательностей, с которыми сопоставляется слово (обычно это список строк).

Чтобы устранить проблему, выполните следующие действия:

import difflib


def key(choices, keyword='Company xx a'):
    matches = difflib.get_close_matches(keyword, choices)
    if matches:
        best_match, *_ = matches
        return difflib.SequenceMatcher(None, keyword, best_match).ratio()
    return 0.0


list123 = [["Title a1", "100 Price", "Company xx aa"],
           ["Title b1", "200 Price", "Company yy bb"],
           ["Title c1", "300 Price", "Company zz cc"]]

res = max(list123, key=key)

print(res)

Вывод

['Title a1', '100 Price', 'Company xx aa']

Идея состоит в том, что ключевая функция будет возвращать сходство наилучшего совпадения каждого списка, после чего вы сможете использовать ее в сочетании с max, чтобы найти список с лучшим соответствием.

person Dani Mesejo    schedule 02.12.2020
comment
Спасибо за ответ и старание, я ценю это! К сожалению, я не могу заставить его работать, кажется, независимо от того, что я использую в качестве ключевого слова, он всегда возвращает первую строку, я попытаюсь отладить больше и вернуться обратно. - person nordmanden; 02.12.2020
comment
@nordmanden Я поместил первый список на вторую позицию, и он все равно вернул его, поэтому, если вы можете предоставить более подробную информацию ... Что вы использовали в качестве ключевого слова? - person Dani Mesejo; 02.12.2020

Я пробовал это:

list123 = [["Title a1", "100 Price", "Company xx aa"], ["Title b1",
                                                    "200 Price", "Company yy bb"], ["Title c1", "300 Price", "Cpswdaany zsdwz cawdc"]]
for item in list123:

     print(difflib.get_close_matches("Company xx aa", item))

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

person Vlad    schedule 02.12.2020
comment
Привет, чувак, я ценю ответ. Я попробовал это, и это не совсем то, что я ожидал, это возвращает результат для каждого списка в моем внешнем списке, даже если результат пуст. Я попытаюсь изменить его и посмотреть, смогу ли я заставить его работать - person nordmanden; 02.12.2020