Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3:使用CSV完成文本_Python_Python 3.x_Csv_Autocomplete - Fatal编程技术网

Python3:使用CSV完成文本

Python3:使用CSV完成文本,python,python-3.x,csv,autocomplete,Python,Python 3.x,Csv,Autocomplete,我想做的是一个自动完成脚本,它使用一个csv文件,您可以从用户输入中获得最有可能的建议,使用csv的第二行(它说明给定单词的出现次数)来确定相似性 到目前为止,我已经在导入CSV后测试了两种方法,第一种是将其放入排序列表中(首先是最高的数字)。然后我将循环遍历并输出第一个遇到的以用户输入开头的单词。然而,这个想法有根本性的缺陷,因为我找不到一个解决方案来根据数字的实际值对列表进行排序,只有开始的数字。数字九(9)比7184高 thelist = open('alphabetical.csv',

我想做的是一个自动完成脚本,它使用一个csv文件,您可以从用户输入中获得最有可能的建议,使用csv的第二行(它说明给定单词的出现次数)来确定相似性

到目前为止,我已经在导入CSV后测试了两种方法,第一种是将其放入排序列表中(首先是最高的数字)。然后我将循环遍历并输出第一个遇到的以用户输入开头的单词。然而,这个想法有根本性的缺陷,因为我找不到一个解决方案来根据数字的实际值对列表进行排序,只有开始的数字。数字九(9)比7184高

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确实是调试完成的,我应该按照建议的方式开始发布,但是结果是一样的,例如,没有按照预期进行排序。我会研究你对列表理解的建议,看看是否能找到解决方案,非常感谢!