首页 > 解决方案 > 将两个列表组合成一个字典,元组

问题描述

我正在使用 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 响应?我在这里做错了什么?

标签: pythondictionaryiterator

解决方案


您可以将列表理解与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---'}]

推荐阅读