如何将SQL表描述返回的特殊格式列表转换为Python字典列表?
SQL查询表结构结果转字典列表实现方案
问题描述
使用SQL查询表结构时,调用的查询函数返回了特殊格式的列表类型结果,需要将其转换为字段字典组成的列表,初步设想通过两层循环实现,需验证思路可行性并获取具体实现代码。
原始输入数据
[ ['Field', 'Type', 'Null', 'Key', 'Default', 'Extra'], ( ('_id', 'bigint(20) unsigned', 'NO', 'PRI', None, ''), ('_load_dt', 'date', 'NO', '', None, ''), ('_load_dt_time', 'timestamp', 'YES', 'MUL', 'current_timestamp()', ''), ('_data_hash', 'char(160)', 'YES', 'UNI', None, ''), ('_host', 'char(200)', 'YES', '', None, ''), ('_port', 'int(6)', 'YES', '', None, ''), ('_schema', 'char(200)', 'YES', '', None, ''), ('_deleted', 'tinyint(1)', 'YES', '', '0', ''), ('acct_id', 'varchar(200)', 'NO', 'MUL', None, ''), ('account_title', 'varchar(200)', 'NO', 'MUL', None, ''), ('signup_date', 'varchar(200)', 'NO', 'MUL', None, ''), ('admin_email', 'varchar(200)', 'NO', 'MUL', None, '') ) ]
期望输出格式
由字段字典组成的列表,每个字典以首行的Field/Type/Null/Key/Default/Extra为键,对应每行元组同位置的值为值,格式参考:
[ {'Field': '_id', 'Type': 'bigint(20) unsigned', 'Null': 'NO', 'Key': 'PRI', 'Default': None, 'Extra': ''}, {'Field': '_load_dt', 'Type': 'date', 'Null': 'NO', 'Key': '', 'Default': None, 'Extra': ''}, ... ]
实现方案
你最初设想的两层循环思路完全可行,同时Python提供了更简洁的内置方法快速实现该需求,两种实现方式如下:
简洁实现(推荐)
利用zip配对表头和行数据,直接通过dict()生成单条字段字典,配合列表推导式即可完成核心转换:
# 原始数据 raw_data = [ ['Field', 'Type', 'Null', 'Key', 'Default', 'Extra'], ( ('_id', 'bigint(20) unsigned', 'NO', 'PRI', None, ''), ('_load_dt', 'date', 'NO', '', None, ''), ('_load_dt_time', 'timestamp', 'YES', 'MUL', 'current_timestamp()', ''), ('_data_hash', 'char(160)', 'YES', 'UNI', None, ''), ('_host', 'char(200)', 'YES', '', None, ''), ('_port', 'int(6)', 'YES', '', None, ''), ('_schema', 'char(200)', 'YES', '', None, ''), ('_deleted', 'tinyint(1)', 'YES', '', '0', ''), ('acct_id', 'varchar(200)', 'NO', 'MUL', None, ''), ('account_title', 'varchar(200)', 'NO', 'MUL', None, ''), ('signup_date', 'varchar(200)', 'NO', 'MUL', None, ''), ('admin_email', 'varchar(200)', 'NO', 'MUL', None, '') ) ] # 拆分表头和行数据 headers = raw_data[0] rows = raw_data[1] # 核心转换逻辑 result = [dict(zip(headers, row)) for row in rows]
两层循环实现(匹配初始思路)
如果需要显式写循环逻辑,按你最初的两层遍历思路实现即可:
result = [] headers = raw_data[0] rows = raw_data[1] # 外层遍历每一行字段数据 for row in rows: single_field_dict = {} # 内层遍历表头,按索引匹配对应值 for index, key_name in enumerate(headers): single_field_dict[key_name] = row[index] result.append(single_field_dict)
两种写法输出结果完全一致,直接运行即可得到符合要求的字典列表。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

