Python操作MySQL拉取词黑名单时如何将元组列表转为字符串列表
实现格式转换的方案
核心原理
MySQL的cursor.fetchall()返回的查询结果是由「行元组」组成的列表,哪怕你只查询word单个字段,每一行的结果也会被封装成长度为1的元组,所以你只需要取出每个元组的第0位元素,就能得到纯字符串的敏感词列表。
适配不同需求的实现方式
方案1:无需保持查询顺序、优先去重效率(最高效,适配万级数据无压力)
直接用集合推导式去重,再转成列表:
cursor.execute('SELECT word FROM blacklist') # 集合自动去重,取每个行元组的第0位元素 blacklist = list({row[0] for row in cursor.fetchall()})
方案2:需要保持数据库查询的原始顺序
如果需要保留敏感词在数据库中返回的顺序,推荐用有序字典去重(Python 3.7+版本原生支持字典有序),比列表循环判断in的效率高很多:
cursor.execute('SELECT word FROM blacklist') blacklist = list(dict.fromkeys(row[0] for row in cursor.fetchall()))
方案3:保留原有循环逻辑(修正原有代码的bug)
你原有代码里的return逻辑存在问题:遇到第一个重复的敏感词就会直接终止整个循环,后续未处理的敏感词都不会加入列表,修正后写法如下:
cursor.execute('SELECT word FROM blacklist') blacklist1 = [] for row in cursor.fetchall(): word = row[0] # 取元组的第一个元素得到字符串 if word not in blacklist1: blacklist1.append(word)
后续敏感词匹配优化建议
后续遍历校验文本敏感词时,如果只需要判断是否存在敏感词,可以直接把列表转成集合使用,判断xxx in 集合的时间复杂度是O(1),比列表的O(n)性能高很多,尤其数据量越大优势越明显。
内容的提问来源于stack exchange,提问作者user14904935
相关产品推荐
相关产品推荐

