Лучший алгоритм поиска для поиска «похожих» строк в таблице Excel - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь найти наиболее эффективный способ поиска похожих значений определенной ячейки в указанном столбце (не во всех столбцах) в документе Excel .xlsx. Код, который я сейчас использую, предполагает, что все строки не отсортированы. Однако все файлы, которые я использую, и все файлы, которые я буду использовать, отсортированы из A-Z. Поэтому вместо линейного поиска мне интересно, какой другой алгоритм поиска я мог бы использовать, а также возможность исправить свое кодирование, например (бинарный поиск и т. Д.).

Пока что я создал функцию: find(). Перед запуском функции программа получает значение из пользовательского ввода, которое затем устанавливается как имя листа . Я распечатываю все доступные имена листов в документе Excel, чтобы помочь пользователю. Я создал пустой массив results[], чтобы хорошо хранить .... результаты. Я создал цикл for, который перебирает только столбец A, потому что я хочу перебирать только пользовательский столбец Я создал переменную с именем start , которая является первой координатой в столбце A , например, (A1 или A400), это изменится в зависимости от итерации цикла. Я создал переменную с именем next , которая будет сравниваться с start . Далее технически просто start + 1 , однако, так как я не могу добавить +1 к строке, я объединяю и набираю cast, так что итерация становится диапазоном от A1-100 или сколько угодно ячеек в столбце А. Моя функция getVal() вызывается с двумя параметрами: координата ячейки и лист , с которым мы работаем. Значение, которое возвращается из getVal(), также передается внутри моей функции Similar(), которая является просто функцией, которая вызывает SequenceMatcher() from difflib. Similar просто возвращает процент того, насколько похожи две строки. Например. similar(hello, helloo) возвращает int 90 или что-то в этом роде. Когда аналогичная функция вызывается, если строки превышают 40 процентов, аналог добавляет координаты в массив results[].


def setSheet(ws):
    sheet = wb[ws]
    return sheet

def getVal(coordinate, worksheet):
    value = worksheet[coordinate].value
    return value

def similar(first, second):
    percent = SequenceMatcher(None, first, second).ratio() * 100
    return percent

def find():
    column = "A"
    print("\n")
    print("These are all available sheets: ", wb.sheetnames)
    print("\n")
    name = input("What sheet are we working out of> ")

    results = []

    ws = setSheet(name)
    for i in range(1, ws.max_row):
        temp = str(column + str(i))
        x = ws[temp]
        start = ws[x].coordinate
        y = str(column + str(i + 1))
        next = ws[y].coordinate
        if(similar(getVal(start,ws), getVal(next,ws)) > 40):
            results.append(getVal(start))
    return results

Это какой-то неприятный код, поэтому я заранее извиняюсь. Ожидаемые результаты должны быть просто списком строк, которые «похожи».

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