在Python中搜索元组列表

0 投票
3 回答
705 浏览
提问于 2025-04-16 10:00

我有一个数据库(sqlite),里面存储了一个组织的成员信息(不到200人)。现在我想写一个wx应用程序,用来搜索这个数据库,并在wx.grid中返回一些联系信息。这个应用程序会有两个文本框,一个用来输入名字,另一个用来输入姓氏。我想实现的是,只要在文本框里输入一个或几个字母,就能开始返回结果。比如,如果我想找“John Smith”,我在第一个文本框里输入“Jo”,那么就会返回所有名字以这几个字母开头的John(或者其他任何名字)。这个应用程序不会有一个“搜索”按钮,而是我每按一个键就会自动开始搜索。

解决这个问题的一种方法是用类似“SELECT * FROM contactlistview WHERE forname LIKE 'Jo%'”的查询来搜索数据库。但这样似乎不是个好主意(每按一个键就对数据库进行一次查询,负担太重了)。所以我想到了用fetchall()来执行一个像“SELECT * FROM contactlistview”这样的查询,然后在每次按键时在查询返回的元组列表中进行搜索。这就是我的问题:搜索一个列表并不难,但我该如何在元组列表中使用通配符进行搜索呢?

3 个回答

0

如果你想用LIKE来查找以某个字符串开头的内容,比如说'abc%'(而不是在字符串的任何位置,比如'%abc%'),那么如果你在这个字段上有建立索引,搜索会非常快,因为数据库可以利用这个索引来帮助找到匹配的结果。

2

我觉得一般来说,你不需要害怕把任务交给数据库。其实,LIKE这个条件可能会运行得很快。Sqlite是用相当稳健的C语言写的,它能够很好地处理这样的查询。

如果你担心发送请求太多,那不如等用户输入到一定的字符数,比如三个字符时,再发送查询呢?

如果你想进行更多的筛选,使用列表推导式可能是返回结果的最佳方式。

2
selected = [t for t in all_data if t[1].startswith('Jo')]

但是,测量一下,不要猜。我的意思是,在某些情况下,查询可能会更快,特别是当你有很多记录的时候。也许你可以先用查询来查找第一个字符,然后再在Python这边进行过滤,因为你已经得到了结果。

撰写回答