SQL查询结果列表中元组去除及列表匹配问题求助
SQL查询结果列表中元组去除及列表匹配问题求助
大家好,我最近遇到个小麻烦,想请各位帮忙看看。我本来的需求是把SQL查询返回的结果和另一个列表做匹配——就是如果tally_list里的项能在SQL查询结果列表里找到,就把它存到matched_list里。
但现在SQL查出来的结果(存在name_list里)格式有点特殊,是这样的:
[('apple',), ('banana',), ('pear',)]
而不是我预期的普通字符串列表:
['apple', 'banana', 'pear']
我跑了自己写的代码,但输出一直是空的,感觉肯定是这些元组导致匹配不上。我试了好几种办法想把元组去掉都没成功,实在没办法了,来求助大家。下面是我写的代码,可能写得比较粗糙,肯定有优化空间,麻烦各位帮我看看问题出在哪:
import datetime import mysql.connector tally_list = ['pear'] cnx = mysql.connector.connect(user='root', password='password',database='db') cursor = cnx.cursor() # 查询和当前时间分钟数相同的记录 query = ("select fruits from db.table1 where minute(Time) = minute(now())") cursor.execute(query) name_list = [] for i in cursor: # print(i) name_list.append(i) # print(name_list) #[('apple',), ('banana',), ('pear',)] cursor.close() cnx.close() matched_list = [] for item in tally_list: for item1 in name_list: if item == item1: matched_list.append(item) print(matched_list) # 本来应该匹配到'pear'的,结果是空的
其实问题核心很简单:mysql.connector返回的每条查询结果都是元组,哪怕只有一个字段,你直接把元组加到列表里,自然没法和普通字符串匹配。这里给你几个简单的解决办法:
方法一:修改列表添加逻辑
循环cursor的时候,不要直接append整个元组,而是取元组的第一个元素(也就是你要的水果名称),修改后的循环部分如下:name_list = [] for i in cursor: name_list.append(i[0])方法二:用列表推导式简化代码
嫌循环写得麻烦的话,用列表推导式可以一步生成目标列表,代码更简洁:name_list = [row[0] for row in cursor]方法三:用集合优化匹配效率
如果你的列表数据量比较大,双重循环匹配的效率会很低,不如把两个列表转成集合求交集,代码简洁还更快:# 先把name_list转成普通列表再转集合 name_set = set(name_list) # 直接求交集转成列表 matched_list = list(set(tally_list) & name_set) # 或者用列表推导式保持原顺序 matched_list = [item for item in tally_list if item in name_set]
按照上面的方法修改后,再运行代码应该就能正常匹配到'pear'啦。
备注:内容来源于stack exchange,提问作者panzer
相关产品推荐
相关产品推荐

