python - 将两个列表组合成一个字典,元组

标签 python dictionary iterator

我正在使用 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 响应中打印 header 值。当前的响应是:

[
    [
        "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: unhashable type: 'list'”,我知道列表是可变的,这就是我收到此错误的原因,但我如何才能获得所需的字典响应?我在这里做错了什么?

最佳答案

为此,您可以结合使用列表理解和 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---'}]

关于python - 将两个列表组合成一个字典,元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50017155/

相关文章:

python - 在 Python 中 : How to remove an object from a list if it is only referenced in that list?

Python NameError 麻烦

基于Python SSH的基于Web的远程目录/文件查看器

python - Azure Blob 存储 : How can I read a file without having to download the whole thing first?

python - 在 Python 中存储字典路径

java - 自定义迭代器,可以遍历迭代器

c++ - 在 map <std::pair<float,float>, std::vector<float>> 中访问 .first 或 .second 时出错

c# - Dictionary<Entity, int> 的 Fluent NHibernate 映射

vb.net - 在 VB.NET 中重载 Equals/GetHashCode 以将对象用作字典键

python - 以几乎均匀采样的随机顺序迭代长迭代器,而不需要大量内存