将两个列表合并成一个Dict,元组

潘卡·潘德(Pankaj Pande)

我正在使用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')]

如您所见,我有两个列表,我想将它们组合成字典以显示如下响应:

[
   {  
      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:不可散列的类型:'list'”,我知道列表是可变的,这就是为什么我遇到此错误,但是又如何获得所需的dict响应呢?我在这里做错了什么?

pp

您可以结合使用列表理解功能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---'}]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章