Задать вопрос
  • Как работает это решение задачи с LeetCode?

    @o5a
    Я понимаю, как tail меняется и зачем это нужно, но как head становится без дублей - не понимаю.

    tail - последний обработанный (недублирующийся) узел
    current - текущий узел
    Когда переходим к новому узлу (присваивая его текущему), проверяем, а не совпадает ли он с предыдущим (по значению).
    Если совпадает, то текущий узел мы просто выкидываем из цепочки, как бы прицепляя выход предыдущего узла к входу последующего, в обход текущего, за счет:
    tail.next = current.next
    Таким образом после проверки 2-го узла (повтор значения 1) получится такая картина:
    63d8f2d68cb94688580440.png
    Надеюсь, так понятнее ;)

    P.S. а если вопрос именно в том, почему head при этом тоже изменился, то head это просто ссылка на сам список (список = его первый элемент). Мы действиями изменили линковку списка.
    Ответ написан
    Комментировать
  • Как получить PNG из NumPy array без сохранения?

    @o5a
    PIL.Image.fromarray(array)
    Ответ написан
    Комментировать
  • Ошибка telebot при попытки отправки фото пользователю. Как исрпавить?

    @o5a
    Когда файл открывается через open, то он не считывает содержимое файла в эту переменную, а возвращает можно сказать указатель на начало файла. При каждом считывании данных из переменной указатель перемещается до конца файла. Поэтому повторное считывание из той же самой переменной ничего не возвратит, т.к. указатель будет уже в конце файла.
    Можно этот указатель "перематывать" в начало, с помощью file.seek(0)
    file = open('pon.jpg' , 'rb')
    file.read()
    file.seek(0)
    file.read()


    Но в данном случае лучше просто считывать файл непосредственно перед отправкой:
    @bot.message_handler(commands=['start'])
    def first(message):
      with open('pon.jpg' , 'rb') as file:
        bot.send_photo(message.chat.id , file)
    Ответ написан
    Комментировать
  • Как отформатировать таблицу в pandas?

    @o5a
    Pandas выдает правильно отформатированную таблицу. Просто проблема в том, что для текста в телеграм используется не моноширинный шрифт, поэтому при ее отображении колонки так съезжают.
    Чтобы исправить это, можно указать ему четко следовать форматированию, добавив тэг 'pre' и обработку как html. Так должно сработать.
    def SWHL_sniper():
        url = "http://www.swhl.ru/tournament/1026071/stats?common=1"
        response = requests.get(url)
        df_list = pd.read_html(response.text)
        return df_list[0].to_string(index=False)
    
    table = SWHL_sniper()
    text=f'<pre>{table}</pre>'
    bot.send_message(message.chat.id, text=text, parse_mode='HTML')
    Ответ написан
    6 комментариев
  • Get_file очень сильно сжимает фото?

    @o5a
    Division991, В вопросе не указали, откуда у вас берется этот file_id. В message.photo содержится список из разных разрешений. Выбирайте из них наибольшее, которое и будет основным. Например
    photo_info = max(message.photo, key=lambda x: x.height)
    file_id = photo_info.file_id
    file_info = await bot.get_file(file_id)
    Ответ написан
    Комментировать
  • Как int из rect float?

    @o5a
    Хранить эти положения отдельными переменными (где они будут float), и только потом присваивать их самим rect.x/y
    Тут для примера я завел отдельные (rx/ry), но можно использовать и уже заведенные x/y только с учетом, что это предполагалось как центр объекта.
    ..
        class Bullet(pygame.sprite.Sprite):
            def __init__(self, screen, speed_x):
                pygame.sprite.Sprite.__init__(self)
                self.x, self.y = 550.0, 450.0
                self.screen = screen
                self.image = pygame.image.load("img/bullet.png").convert()
                self.rect = self.image.get_rect(center=(self.x, self.y))
                # для хранения наших координат
                self.rx, self.ry = self.rect.x, self.rect.y
                self.speed_x = speed_x
                self.speed_y = 0.1
    
            def update(self):
                if self.ry > 0:
                    self.ry -= self.speed_y
                    self.rx += self.speed_x
                    # и вот теперь уже присваиваем значения
                    self.rect.x, self.rect.y = self.rx, self.ry
                else:
                    self.kill()


    Можно и напрямую присваивать x/y (без этих rx/ry) только работать с rect.centerx:
    ..
            def update(self):
                if self.y > 0:
                    self.y -= self.speed_y
                    self.x += self.speed_x
                    self.rect.centerx, self.rect.centery = self.x, self.y
                else:
                    self.kill()
    Ответ написан
    1 комментарий
  • Как отправить json информацию в боте ВК?

    @o5a
    В сообщении передаете текст вида '/команда ник сервер' т.е. например '/find n4g1b4t0r 31337',
    а затем делаете такую проверку:
    if event.text == '/find'
    Не находите противоречий?
    Ответ написан
    Комментировать
  • Query is too old and response timeout expired or query id is invalid, как решить?

    @o5a
    Потому что answer_callback_query первым параметром принимает id, а не текст.
    await bot.answer_callback_query(callback_query.id, 'Выбери удобное время')
    Ответ написан
    4 комментария
  • SQLite + Python, как проверить есть ли данные в базе?

    @o5a
    Проще всего в цикле перебирать значения и для каждого без проверки просто запускать запрос на вставку, используя дополнительное on conflict - он позволит игнорировать команду при наличии этого значения в базе.
    for n in res:
        c.execute('INSERT INTO Zayavka(id) VALUES(?) ON CONFLICT(id) DO NOTHING', (n, ) )


    Вместо цикла можно использовать c.executemany, который сам последовательно применит команду ко всем элементам списка, но это должен быть вложенный список, где каждый элемент - набор данных для одной строки, т.е.
    res = [[40065], [40064]]
    c.executemany('INSERT INTO Zayavka(id) VALUES(?) ON CONFLICT(id) DO NOTHING', res )
    Ответ написан
    Комментировать
  • Как проверить реферальную ссылку в Telegram bot?

    @o5a
    Если речь про то, как считать передаваемые в команду аргументы, то просто разбором текста (команда по сути приходит как message.text в виде '/start 12345678').
    @bot.message_handler(commands=['start'])
    def start(message):
        # соответственно берем первый аргумент
        per = message.text.split()[1]

    Можно предусмотреть проверку на случай, если запустят команду без аргументов, например так
    args = message.text.split()[1:]
    per = args[0] if args else None
    Ответ написан
    Комментировать
  • Почему два CSV файла после удаления нескольких строк читаются по разному?

    @o5a
    Потому что надо учитывать разделители колонок. Задается параметром sep у pd.read_csv/to_csv. По умолчанию он считается запятой у этих функций, так же как и у англоязычного Excel. Но в российской версии Excel по умолчанию используется точка с запятой - ;
    Поэтому видимо изначально этот файл был с разделителем - запятой, потому правильно читались колонки через read_csv, а затем Вы пересохранили (хотя не указали, как именно "на макбуке экспортировал его как .csv") видимо в русской локали, поэтому разделителями стала точка с запятой - отсюда перестал читаться через read_csv.
    Так что указывайте тот разделитель, который реально в вашем файле, чтобы читалось правильно:
    data = pd.read_csv(sys.argv[1], sep=';')
    Ответ написан
    Комментировать
  • Как убрать всплывающее окно ссылки telegram?

    @o5a
    В send_message указать параметр
    disable_web_page_preview=True
    Ответ написан
    Комментировать
  • Почему не выдается баланс в телеграм боте?

    @o5a
    Уже много раз обсуждалось. НЕ добавляйте кавычки к названиям идентификаторов (таблиц, полей). Иначе это воспринимается как текстовая строка. Здесь например
    UPDATE 'users' SET 'balance' = ? WHERE 'chat_id' = ?
    Он будет пытаться обновить те записи, где СТРОКА 'chat_id' = какой-то там номер.
    Соответственно равны они не могут быть, и ничего не обновится.
    Не надо в запросах добавлять эти кавычки.
    Измените запрос так (и другие тоже заодно):
    self.cursor.execute("UPDATE users SET balance = ? WHERE chat_id = ?", (balance, chat_id,))
    Ответ написан
    3 комментария
  • Как сделать так, чтобы бот отвечал на определенную команду в определенном меню?

    @o5a
    Например учитывать только callback, а не прямой текст:
    import telebot
    from telebot import types
    
    bot = telebot.TeleBot(TOKEN)
    
    @bot.message_handler(commands=['start'])
    def start(message):
        keyboard = types.InlineKeyboardMarkup()
        key_buy = types.InlineKeyboardButton(text='Покупка', callback_data='/buy')
        key_info = types.InlineKeyboardButton(text='Инфо', callback_data='/info')
        keyboard.add(key_buy, key_info)
        bot.send_message(message.chat.id, 'Команды:', reply_markup=keyboard)
    
    @bot.message_handler(content_types=["text"])
    def handle_text(message):
        if message.text.startswith('/'):
            bot.send_message(message.chat.id, 'Неправильная команда')
    
    @bot.callback_query_handler(func = lambda call: True)
    def calls(call):
        if call.data == '/buy':
            bot.send_message(call.message.chat.id, 'Обрабатываем покупку')
        elif call.data == '/info':
            bot.send_message(call.message.chat.id, 'Вот инфо')
    
    bot.polling(none_stop=True)
    Ответ написан
  • Local variable 'font'?

    @o5a
    Вы берете font из pygame и заменяете его своей переменной в подобных строках:
    font = font.Font("freesansbold.ttf", 15)
    В результате для последующих вызовов перестает существовать pygame.font, который пытаетесь вызвать.
    Используйте для своего font другое название переменной.
    Ответ написан
    Комментировать
  • Raise TypeError(f'the JSON object must be str, bytes or bytearray, ' TypeError: the JSON object must be str, bytes or bytearray, not int как убрать?

    @o5a
    Так определитесь, что это поле должно обозначать. В описании таблицы поле заявлено как
    trophy_road INT
    А в загрузке данных грузятся вообще противоречивые 2 строки:
    self.player.trophy_road = user_data[10]
    self.player.trophy_road = json.loads(user_data[36])

    И обе "некорректные"
    user_data[10] - это вообще другое поле в таблице, leagueReward
    json.loads(user_data[36]) - тоже не загрузится, т.к. поле не json, а INT

    Так что без подробных разбирательств для trophy_road видимо предполагалось
    self.player.trophy_road = user_data[36]
    А другое возможно в поле league_reward соответственно, но это уже лучше автору скрипта знать
    self.player.league_reward = user_data[10]
    Ответ написан
    Комментировать
  • Почему не работает код?

    @o5a
    "Работает". Только
    def log_into_steam(self):
            pass

    Функция запускается, просто ничего не делает - все, как запрограммировали.

    Учитывайте правильно отступы. Методы класса должны находиться внутри класса (по отступам), а не абы как.

    Плюс ко всему, метод инициализации пишется с двойным подчеркиванием - __init__
    Ответ написан
    Комментировать
  • Почему не копируется список внутри класса?

    @o5a
    Этим действием
    item.open_items = ['item 1', 'item 2']
    Вы не добавляете элементы к изначальному списку open_items, а перезаписываете его другим списком (объектом), поэтому ссылающиеся на изначальный список self.sorted_items_2 и т.п. так и остаются ссылаться на изначальный пустой список.
    Если бы делали так например
    item.open_items.append('item 1')
    То и ссылки бы сохранялись.
    Ответ написан
    4 комментария
  • Как декодировать строку?

    @o5a
    Похоже на двойное кодирование.
    from urllib.parse import unquote
    
    url = "%25EC%259B%2590%25EC%2597%2591%25EC%258A%25A4%25EB%25B2%25B3-%25EB%25A8%25B9%25ED%258A%2580"
    print(unquote(unquote(url)))
    Ответ написан
  • Почему код в Sublime text не работает?

    @o5a
    Sublime Text не поддерживает ввод в консоли, только вывод. Как вариант можно использовать REPL. Тема обсуждалась и на этом форуме тоже, тут например https://qna.habr.com/q/731295
    Ответ написан
    Комментировать