Как можно оптимизировать этот код?
if message.lower().startswith("!top"):
sql.execute("SELECT * FROM users ORDER BY messages DESC") # Возвращает столбцы userid(тип данных TEXT), nick(тип данных TEXT), messages(тип данных INT) с таблицы users
rows = sql.fetchmany(10) # Первые 10 записей
z = [] # Этот массив для добавления сюда nick и messages
for x in rows:
z.append(x[1]) # Добавляет в массив nick
z.append(x[2]) # Добавляет в массив messages(кол-во сообщений пользователя)
sub_client.send_message(chatId=chatid,
message="TOP-10: \n" + "1. " + str(
z[0]) + " " + str(z[1]) + "\n" + "2. " + str(
z[2]) + " " + str(z[3]) + "\n" + "3. " + str(
z[4]) + " " + str(z[5]) + "\n" + "4. " + str(
z[6]) + " " + str(z[7]) + "\n" + "5. " + str(
z[8]) + " " + str(z[9]) + "\n" + "6. " + str(
z[10]) + " " + str(z[11]) + "\n" + "7. " + str(
z[12]) + " " + str(z[13]) + "\n" + "8. " + str(
z[14]) + " " + str(z[15]) + "\n" + "9. " + str(
z[16]) + " " + str(z[17]) + "\n" + "10. " + str(
z[18]) + " " + str(z[19])) # Отправляет сообщение в чат
Так как массив z выглядит таким образом [nick, messages, nick, messages, nick, messages ...] то обращаясь по индексам z[0], z[1] можно вывести сообщение с форматом "Ник кол-во сообщений". Но если нужно будет вывести топ 50, то каждый раз вписывать индексы это довольно муторно, как можно это сделать по другому?
Ответы (1 шт):
Автор решения: Ildar
→ Ссылка
проще использовать сущность nick message, объединяя её в кортеж или свой класс какой-то, чем хранить отдельными элементами, я сделал кортежами, потом в цикле просто формируем сообщение, проходясь по списку кортежей
if message.lower().startswith("!top"):
sql.execute("SELECT * FROM users ORDER BY messages DESC")
rows = sql.fetchmany(10)
z = []
for x in rows:
z.append((x[1], x[2])) # Добавляет в z (nick, message)
full_message = "TOP-10: \n"
for i, (name, message) in enumerate(z, 1):
full_message += f'{i}. {name} {message}\n'
sub_client.send_message(chatId=chatid, message=full_message)