Python中遍历数据库返回的嵌套列表并提取元素的实现方法求助
解决数据库返回嵌套列表的元素提取问题
看起来你现在的核心问题是要过滤返回数据里的空列表,同时正确提取每个元组中的数值和日期,还要处理无有效数据的场景。我来一步步帮你搞定:
首先先明确你拿到的数据结构——从你给出的打印结果来看,data应该是一个包含空列表和元组列表的嵌套结构,比如:
data = [ [], [(Decimal('34535'), datetime.date(2022,9,15)), (Decimal('1456'), datetime.date(2022,9,11)), (Decimal('3455'), datetime.date(2022,10,15))], [] ]
第一步:过滤空列表,提取有效元组
你需要先剔除data里的空列表,只保留包含数据库行数据(元组)的子列表,再把这些元组展开出来。用这个列表推导式就能实现:
# 过滤空列表,提取所有有效数据行 valid_rows = [row for sublist in data if sublist for row in sublist]
这里的逻辑是:遍历data里的每个子列表,只处理非空的子列表(if sublist做判断),然后把每个子列表里的元组(也就是数据库的每一行)提取出来。
第二步:处理空数据+转换数据格式
接下来判断是否有有效数据:如果没有,返回你需要的提示;如果有,把Decimal类型转成普通数值(比如int或float,根据你的数据类型选择),日期可以保留date对象或者转成你需要的字符串格式:
from decimal import Decimal data = sql.dbconnect(query) # 先过滤出有效行 valid_rows = [row for sublist in data if sublist for row in sublist] if not valid_rows: # 无有效数据的场景 count = ['0 rows returned', '0 rows returned'] else: # 转换每个元组的格式:Decimal转int,日期可保留原对象或转成指定字符串 count = [ (int(row[0]), row[1]) # 如果要转成"2022,9,15"格式,改成 f"{row[1].year},{row[1].month},{row[1].day}"即可 for row in valid_rows ]
第三步:访问提取后的数据
现在count是一个包含多个元组的列表,每个元组对应数据库的一行数据,你可以这样访问:
# 遍历所有行数据 for idx, item in enumerate(count): print(f"第{idx+1}行:count[{idx}][0] = {item[0]}, count[{idx}][1] = {item[1]}")
输出结果会和你的预期完全匹配:
第1行:count[0][0] = 34535, count[0][1] = 2022-09-15 第2行:count[1][0] = 1456, count[1][1] = 2022-09-11 第3行:count[2][0] = 3455, count[2][1] = 2022-10-15
原代码的问题在哪?
你原代码里的[x for x in lis for x in data]有两个明显错误:
lis是未定义的变量,会直接导致报错;- 嵌套循环的顺序搞反了,应该先遍历
data里的子列表,再遍历子列表内的元素,而不是反过来。
如果你的数据库返回的data本身就是元组的列表(比如打印时的空列表是多余输出),那可以直接去掉过滤空列表的步骤,直接遍历data即可。
内容的提问来源于stack exchange,提问作者Enigmaderockz
相关产品推荐
相关产品推荐

