代码之家  ›  专栏  ›  技术社区  ›  PanDe

将两个列表合并为一个Dict、Tuple

  •  2
  • PanDe  · 技术社区  · 6 年前

    我正在使用Python+Flask\u Restful组合创建一个restapi,觉得它很神奇。 目前,我允许用户使用浏览器运行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响应中打印头值。当前的响应是:

    [
        [
            "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响应

    如果有人在寻找第一部分的答案:使用Regex

    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:Unhabable type:‘list’”失败了,我知道列表是可变的,这就是为什么我会出现这个错误,但是我如何才能得到所需的dict响应呢?我做错了什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   jpp    6 年前

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