我试图找出在 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
这是一些看起来很讨厌的代码,所以我提前道歉。预期的结果应该只是“相似”的字符串列表。