python - 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]
解决方案
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))
推荐阅读
- css - 使用 Wordpress 中的字体添加“预加载”
- wordpress - 如何在 Magento Docker 容器上持久化安装?
- node.js - 如何使用无服务器 AWS 进行跨应用程序
- angular - Angular 9 中未加载单个 spa 角度 i18n 文件
- javascript - 在运行时导入模块和导出
- swift-playground - Playground 导入 - 更新到 Xcode 12 后没有这样的模块
- c# - 从没有 DeserializeObject C# 的 Json 中获取值
- javascript - 在节点js中将html表单转换为pdf?
- postgresql - PostgreSQL Update TRIGGER 仅在更新 1 行时触发多次
- javascript - 如何获得 FCM 代币?