Python3:基于CSV的自动补全脚本开发问题求助
解决CSV自动补全脚本的核心问题
我来帮你一步步搞定这些问题,咱们完全保留你的列表方案,从最关键的排序问题入手,再逐个解决输出和变量作用域的问题:
1. 修复排序逻辑(数字字符串排序错误)
你遇到的排序问题根源很明确:CSV里的次数是字符串类型,sorted()默认按字符ASCII码顺序比较,所以"9"会排在"7184"前面(因为字符'9'的编码比'7'大)。解决方法很简单,把次数转成整数再作为排序依据:
import csv # 读取并排序CSV数据的修正代码(推荐用with语句自动管理文件) sortedlist = [] with open('alphabetical.csv', 'r') as thelist: csv1 = csv.reader(thelist, delimiter=',') # 先过滤掉格式不完整的行,再转int排序 sortedlist = sorted( (row for row in csv1 if len(row) >= 2), key=lambda x: int(x[1]), reverse=True )
2. 修复变量作用域与输出问题
你的autocomplete()函数存在两个明显问题:
- 无法访问
main()里的word变量(函数作用域不共享) filter()返回的是迭代器对象,不是直观的结果列表
修正后的函数需要接收输入的关键词作为参数,并且把匹配结果转成列表返回:
def main(): """Initialize main loop.""" print("Type 'q' to quit") word = "" while word != "q": word = input("Type word: ").lower() if word == "q": print("Exiting...") break # 把输入的关键词传给autocomplete函数 suggestions = autocomplete(word) print("Autocompletion suggestions: ", suggestions) def autocomplete(input_word): """Return autocomplete suggestions sorted by occurrence count.""" if not input_word: return "Please enter a word fragment" # 直接用列表推导式过滤,比filter更直观,同时保留原排序(次数降序) filtered_words = [item[0] for item in sortedlist if item[0].startswith(input_word)] return filtered_words if filtered_words else "No matching words found"
3. 额外优化建议
- 如果CSV文件很大,建议提前把单词单独提取成一个列表(比如
[item[0] for item in sortedlist]),后续匹配会更快 - 可以限制返回的建议数量,比如只返回前3个最热门的:
return filtered_words[:3] if filtered_words else "No matches"
完整修正代码
把所有部分整合起来的最终版本:
import csv # 提前加载并排序数据,只运行一次 sortedlist = [] with open('alphabetical.csv', 'r') as thelist: csv1 = csv.reader(thelist, delimiter=',') sortedlist = sorted( (row for row in csv1 if len(row) >= 2), key=lambda x: int(x[1]), reverse=True ) def main(): """Initialize main loop.""" print("Type 'q' to quit") word = "" while word != "q": word = input("Type word: ").lower() if word == "q": print("Exiting...") break suggestions = autocomplete(word) print("Autocompletion suggestions: ", suggestions) def autocomplete(input_word): """Return autocomplete suggestions sorted by occurrence count.""" if not input_word: return "Please enter a word fragment" filtered_words = [item[0] for item in sortedlist if item[0].startswith(input_word)] return filtered_words if filtered_words else "No matching words found" if __name__ == "__main__": main()
现在运行脚本,输入关键词后就能得到按出现次数降序排列的自动补全建议,完全符合你的需求,而且全程用列表方案实现。
内容的提问来源于stack exchange,提问作者Holmberg
相关产品推荐
相关产品推荐

