Я пытаюсь найти наиболее эффективный способ поиска похожих значений определенной ячейки в указанном столбце (не во всех столбцах) в документе 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
Это какой-то неприятный код, поэтому я заранее извиняюсь. Ожидаемые результаты должны быть просто списком строк, которые «похожи».