0

我试图找出在 excel .xlsx 文档的指定列(不是所有列)中查找特定单元格的相似值的最有效方法。我目前的代码假定所有字符串都是未排序的。但是,我正在使用的文件和我将使用的文件都具有从 AZ 排序的字符串。因此,与其进行线性搜索,我想知道我可以使用什么其他搜索算法以及能够修复我的编码,例如(二进制搜索等)。

到目前为止,我已经创建了一个函数:find(). 在函数运行之前,程序从用户输入中获取一个值,然后将其设置为工作表名称。我在 excel 文档中打印出所有可用的工作表名称只是为了帮助用户。我创建了一个空数组results[]来存储好......结果。我创建了一个仅遍历 A 列的 for 循环,因为我只想遍历自定义列。我创建了一个名为start的变量,它是A 列中的第一个坐标,例如(A1 或 A400),这将根据循环所在的迭代而改变。我创建了一个名为next的变量,它将与start进行比较。接下来是技术上只是start + 1,但是由于我无法将 +1 添加到字符串中,因此我连接并键入强制转换所有内容,以便迭代变为A1-100的范围,或者在 A 列中有许多单元格。我的函数getVal()使用两个参数调用,坐标我们正在使用的单元格和工作表。从返回的值getVal()也在我的函数内部传递Similar(),该函数只是一个调用SequenceMatcher() from difflib. 相似只返回两个字符串相似程度的百分比。例如。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

这是一些看起来很讨厌的代码,所以我提前道歉。预期的结果应该只是“相似”的字符串列表。

4

0 回答 0