我想要做的是一个自动完成脚本,它使用csv文件,你可以从用户输入获得最可能的建议,使用csv的第二行(它表示给定单词的出现次数)确定可能性。
到目前为止,我在导入CSV后一直在测试两种方法,第一种方法是将其变为排序列表(最高的数字)。然后,我将循环并输出以用户输入开头的第一个遇到的单词。然而,这个想法从根本上是有缺陷的,我无法找到一个解决方案,根据数字的实际值,只有开始数字对列表进行排序。例如。 9号(9)的排名高于7184。
thelist = open('alphabetical.csv', 'r')
csv1 = csv.reader(thelist, delimiter = ',')
sortedlist = sorted(csv1, key = lambda x: x[1], reverse=True)
摘录可能如下所示: [['with','1671'],['很少','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>
我知道代码是有缺陷的,而且还有更多内容,所以对我来说输出不是它所需的并不奇怪。
从当前函数获取给定输出后我的恐惧是不可能使用列表,而我现在正在尝试使用字典,但我最不想要的就是在我使用时寻找新的解决方案实际上是在正确的轨道上开始。因此,我向您寻求有关如何解决此问题的任何可能的指导和建议。
谢谢。
答案 0 :(得分:1)
首先,为什么要排序然后创建一个新列表?
sort = sorted(csv1, key = lambda x: x[1])
for row in sort:
sortedlist.append(row)
可能是
sortedlist = sorted(csv1, key = lambda x: x[1])
你的其他错误:filter
不再在python 3中返回一个列表,它是懒惰评估的。你必须强制列表迭代。
如果你这样做,你会发现还有另一个错误,因为startswith
适用于行,而不适用于字符串。
因此,quickfix将是:
filtered_words = list(filter(lambda x: x[0].startswith(word), sortedlist))
将返回行,而不是单词,BTW。
但使用list
+ filter
+ 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)]
这种方法很简单,但正如评论中所述,它并不是最有效的,因为它意味着线性搜索(并没有利用列表排序的事实)