Python3:使用CSV完成文本
我想做的是一个自动完成脚本,它使用一个csv文件,您可以从用户输入中获得最有可能的建议,使用csv的第二行(它说明给定单词的出现次数)来确定相似性 到目前为止,我已经在导入CSV后测试了两种方法,第一种是将其放入排序列表中(首先是最高的数字)。然后我将循环遍历并输出第一个遇到的以用户输入开头的单词。然而,这个想法有根本性的缺陷,因为我找不到一个解决方案来根据数字的实际值对列表进行排序,只有开始的数字。数字九(9)比7184高Python3:使用CSV完成文本,python,python-3.x,csv,autocomplete,Python,Python 3.x,Csv,Autocomplete,我想做的是一个自动完成脚本,它使用一个csv文件,您可以从用户输入中获得最有可能的建议,使用csv的第二行(它说明给定单词的出现次数)来确定相似性 到目前为止,我已经在导入CSV后测试了两种方法,第一种是将其放入排序列表中(首先是最高的数字)。然后我将循环遍历并输出第一个遇到的以用户输入开头的单词。然而,这个想法有根本性的缺陷,因为我找不到一个解决方案来根据数字的实际值对列表进行排序,只有开始的数字。数字九(9)比7184高 thelist = open('alphabetical.csv',
thelist = open('alphabetical.csv', 'r')
csv1 = csv.reader(thelist, delimiter = ',')
sortedlist = sorted(csv1, key = lambda x: x[1], reverse=True)
代码片段可能类似于:
[with'、[1671']、[Novely'、[2']、[green'、[246']等等
这就是函数当前的外观:
def main():
"""Initialize main loop."""
word = ""
while word != "q":
word = input("Type word: ").lower()
print("Autocompletion finished: ", autocomplete())
def autocomplete():
"""Return autocomplete suggestions."""
filtered_words = filter(lambda x: x.startswith(word), sortedlist)
return filtered_words
输入后的结果是:
<filter object at 0x7fbfb27ca860>
我知道代码有缺陷,而且还有更多的缺陷,所以我毫不奇怪输出不是它所需要的
从当前函数获得给定输出后,我担心不可能使用列表,因此我目前正在尝试使用字典,但我最不想做的事情是,当我真正走上正确的道路开始时,再去寻找一个新的解决方案。因此,我向你们寻求任何可能的指导和建议,以解决这个问题
谢谢。首先,为什么要排序然后创建新列表
sort = sorted(csv1, key = lambda x: x[1])
for row in sort:
sortedlist.append(row)
可能是
sortedlist = sorted(csv1, key = lambda x: x[1])
您的另一个错误是:filter
不再返回Python3中的列表,而是延迟计算。您必须对其强制列表迭代
如果这样做,您会发现还有另一个错误,因为startswith
应用于行,而不是字符串
因此,快速修复方法是:
filtered_words = list(filter(lambda x: x[0].startswith(word), sortedlist))
这将返回行,而不是单词,顺便说一句
但是使用列表
+过滤器
+lambda
变得越来越麻烦,性能也越来越差。喜欢简单的列表理解:
filtered_words = [x for x in sortedlist if x[0].startswith(word)]
这也会返回行。要仅获取单词,您可以对这两个字段使用解包,并放弃数字
filtered_words = [x for x,_ in sortedlist if x.startswith(word)]
或者,您可以从一开始就放弃这些数字:
sortedlist = [x[0] for x in sorted(csv1, key = lambda x: x[1])]
这会使您更改过滤器:
filtered_words = [x for x in sortedlist if x.startswith(word)]
此方法很简单,但正如注释中所指出的,它不是最有效的,因为它意味着线性搜索(并且没有利用列表已排序的事实)Python3筛选器需要列表:
filtered\u words=list(filter(lambda x:x[1].startswith(word),sortedlist))
此外,您的排序方式很麻烦。而且,转到列表将不起作用,因为您已经放置了csv文件的行,而不是字符串。此外,我不确定您的自动完成词典的大小,但我建议将您的完成词典表示为一个多路Trie,您可以在其上执行BFS/DFS,而不是使用排序list@NiemaMoshiri我很好奇,我不知道这种方法,因为我是编程的初学者。我会做更多的研究,谢谢!感谢您的回复,繁琐的sortedlist确实是调试完成的,我应该按照建议的方式开始发布,但是结果是一样的,例如,没有按照预期进行排序。我会研究你对列表理解的建议,看看是否能找到解决方案,非常感谢!