Объединить два списка в Dict, Tuple - PullRequest
0 голосов
/ 25 апреля 2018

Я создаю rest-api, используя комбо Python + Flask_Restful, нахожу это удивительным. В настоящее время я разрешаю пользователю запускать 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 (25 апреля): мне удалось ответить на мой первый вопрос и я смог отобразить правильный ответ json, если пользователь выбрал инструкцию SELECT * в SQL, но все еще сталкивается с проблемой со вторым фрагментом

Вот ответ на первую часть, если кто-то ищет его: Использование 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")

Часть II: неотвеченный запрос:

Для второй части у меня теперь есть два списка:

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'", я понимаю, что списки изменчивы, и именно поэтому я получаю эту ошибку, но тогда как я могу получить требуемый ответ dict? что я тут не так делаю?

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете использовать понимание списка в сочетании с 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---'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...