首页 > 解决方案 > Python 从包含子字符串的大字符串列表中获取字符串的最快方法(地址自动完成)

问题描述

我正在构建一个具有地址自动完成字段的 GUI。

地址数据库有 400000 个条目,并在程序加载时被拉入内存中的数据帧。

我正在使用 tkinker 并有一个自动完成输入字段,当用户开始键入时,它会显示可能匹配地址的列表。

问题是,他们打字的时候很慢......

当数据加载时,我将地址组合成一个字符串 IE "2 Roderick Lane Knoxville"

然后,用户可以开始输入“Roder”,例如,该地址将显示在下拉列表中以自动完成。

长话短说,我需要一种更快的方法来解析大量字符串并返回与子字符串匹配的任何字符串。我尝试了几种不同的方法,但都不够快:

使用数据框:(self.addresses['combined'] 是字符串)

df = self.addresses[self.addresses['combined'].str.contains(theSubString)]
return list(set(df['combined'].tolist()))

并使用列表:(self.addresses 是字符串列表)

return [w for w in self.addresses if theSubString in w]

标签: pythonarrays

解决方案


filter功能呢?

list(filter(lambda x: theSubString in x, self.addresses))

我假设您不想显示所有结果,但可能只显示包含子字符串的前 n 个结果。这可以使您的代码更快。您可以使用itertools.islice从 中获取第一个结果filter

n = 10
list(islice(filter(lambda x: theSubString in x, addresses), n))

推荐阅读