python - 将两个列表组合成一个字典,元组
问题描述
我正在使用 Python+Flask_Restful 组合创建一个 rest-api,发现它很棒。目前,我允许用户使用浏览器运行 sql 查询,它工作正常,但问题是,标题信息未显示在响应中。这是我正在使用的代码:
class RunCustomeSQL(Resource):
def get(self, enter_db_name, query):
if not os.path.isfile(enter_db_name+'.db'):
raise BadRequest("Database Doesn't Exist. Please select a valid database")
conn = sqlite3.connect(enter_db_name+'.db')
search_out = []
cursor = conn.execute(query)
row = None
for row in cursor:
search_out.append(row)
if not row: #This means empty response
raise BadRequest("No Results Found")
conn.commit()
conn.close()
return search_out
虽然此代码运行良好,但它不会在 json-response 中打印标头值。目前的回应是:
[
[
"dusiri_bibi",
"11",
"----------",
" srt/None ",
"14.30 MB",
"2017-12-13 23:43:54",
"C:/Test_Software/vc_redist.x64.exe"
],
]
预期输出:
[
[
"Machine Name" : "dusiri_bibi",
"LABEL" : "11",
"PERMISSIONS" : "----------",
"USER" : " srt/None ",
"SIZE" : "14.30 MB",
"CREATED" : "2017-12-13 23:43:54",
"FILENAME" : "C:/Test_Software/vc_redist.x64.exe"
],
]
以上所有文字,如“机器名称、标签等”。是我的表头,我不确定如何将它们与我的输出一起打印。
如果用户select user, size from table_name
只运行怎么办
或者
如果用户运行怎么办select * from table_name
在这两种情况下,输出都应该显示表格标题谢谢
更新#1(4 月 25 日):如果用户在 SQL 中选择 SELECT * 语句但仍然面临第二个问题,我设法回答了我的第一个问题并能够显示正确的 json 响应
如果有人正在寻找它,这是第一部分的答案:使用正则表达式
row = None
if re.search(r'(?<=SELECT)(.*)(?=FROM)',query, re.IGNORECASE).group(1) == ' * ':
for row in cursor:
search_out.append({'NAME' : row[0], 'LABEL_NUMBER' : row[1], 'PERM' : row[2], 'USER' : row[3] , 'SIZE' : row[4], 'DATE' : row[5], 'FILENAME' : row[6]})
if not row: #This means empty response
raise BadRequest("No Results Found")
第二部分:未回答的问题:
对于第二部分,我现在有两个列表:
list_1 : [[u'LABEL_NUMBER', u'PERM', u'FILENAME']]
list_2 : [(u'11', u'----------', u'C:/Test_Software/26.avi'), (u'11', u'----------', u'C:/Test_Software/6.avi'), (u'11', u'-rwx------', u'C:/Test_Software/Debug/Current_Frame1.avi'), (u'10', u'-rwxrwx---', u'C:/Windows/WinSxS/boxed-split.avi')]
如您所见,我有两个列表,我想将它们组合成一个 dict 以显示如下响应:
[
{
LABEL_NUMBER : '11' ,
PERM : '-----------',
FILENAME : 'C:/Test_Software/26.avi'
},
...
....
......
{
LABEL_NUMBER : '10' ,
PERM : '-rwxrwx---',
FILENAME : 'C:/Windows/WinSxS/boxed-split.avi'
},
]
我正在使用以下代码来做同样的事情:
chunks = [list_2[idx:idx+3] for idx in range(0, len(list_2), 3)]
output = []
for each in chunks:
output.append(dict(zip(list_1, each)))
print(output)
但是,这因“TypeError:unhashable type:'list'”而失败,我知道列表是可变的,这就是为什么我会收到这个错误,但是我怎样才能获得所需的 dict 响应?我在这里做错了什么?
解决方案
您可以将列表理解与zip
此结合使用:
list_1 = [[u'LABEL_NUMBER', u'PERM', u'FILENAME']]
list_2 = [(u'11', u'----------', u'C:/Test_Software/26.avi'), (u'11', u'----------', u'C:/Test_Software/6.avi'), (u'11', u'-rwx------', u'C:/Test_Software/Debug/Current_Frame1.avi'), (u'10', u'-rwxrwx---', u'C:/Windows/WinSxS/boxed-split.avi')]
d = [dict(zip(list_1[0], i)) for i in list_2]
结果:
[{'FILENAME': 'C:/Test_Software/26.avi',
'LABEL_NUMBER': '11',
'PERM': '----------'},
{'FILENAME': 'C:/Test_Software/6.avi',
'LABEL_NUMBER': '11',
'PERM': '----------'},
{'FILENAME': 'C:/Test_Software/Debug/Current_Frame1.avi',
'LABEL_NUMBER': '11',
'PERM': '-rwx------'},
{'FILENAME': 'C:/Windows/WinSxS/boxed-split.avi',
'LABEL_NUMBER': '10',
'PERM': '-rwxrwx---'}]
推荐阅读
- php - PHP - 执行此操作,如果下一部分符合此条件,也执行此操作
- php - 递归地在另一个数组中查找数组的匹配不起作用
- node.js - 如果 readable.pipe() 返回一个 Writable,我们如何链接管道?
- php - laravel 5+中的年龄计算错误?
- android - 退避标准到底是什么以及它是如何工作的?
- react-native - 不能在样式组件中使用全局样式
- javascript - 实现全面快速路由解决方案后获取 API 调用失败:位置 0 处的 JSON 中的意外令牌 <
- maven - 具有自定义 settings.xml 的 Jenkins 声明式管道
- ios - 成功登录 Firebase 后尝试执行 segue
- ios - 使 .scn 模型具有前置摄像头视图