• Как правильно отсортировать список экземпляров класса через sorted по атрибуту?

    @o5a
    В стандартной sorted можно напрямую указывать функцию, которая будет использоваться в качестве критерия сортировки (параметр key). Выдаваемое этой функцией значение для каждого элемента как раз и будет использовано как значения для сортировки элементов. Также мы можем использовать lambda-функции для упрощения нашей задачи. Таким образом, мы можем напрямую указать, как сортировать наших студентов.
    Например, подобное выдаст список студентов, отсортированный по сумме оценок:
    sorted(self.students, key=lambda x: sum(x.grades))
    Аналогичным образом можете получить сортировку по средней оценке путем небольшой доработки.
    Ответ написан
    Комментировать
  • Можно ли упростить эту конструкцию try-except?

    @o5a
    while True:
      try:
        n = int(input('N = '))
        break
      except ValueError:
        pass
    print(n)
    Ответ написан
    1 комментарий
  • Как рисуются "пироги" с помощью pillow?

    @o5a
    PIL.ImageDraw.Draw.pieslice(xy, start, end, fill=None, outline=None)
    start - начальный угол в градусах (начало - на 3 часа)
    пример
    from PIL import Image, ImageDraw
    
    img = Image.new("RGB", (800, 800))
    idraw = ImageDraw.Draw(img)
    
    idraw.pieslice([10,10,200,200], start=0, end=270, fill=None, outline="yellow")
    img.show()
    Ответ написан
    Комментировать
  • Классификация вопросов?

    @o5a
    Если не нужна какая-то продвинутая система, которая анализирует разные формы слов и т.п., то самое простое - забить нужные ключевые слова или части слов, и проверять их на вхождение в строку вопроса. Например, так через regexp (проще комбинировать варианты)
    import re
    
    categories = {
        r"(время|времени|час)": "время",
        r"(зовут|имя)": "имя",
    }
    
    # тестовые вопросы
    questions = ["Сколько времени?", "Какой час?", "Время", "Как тебя зовут?", "Как твоё имя?"]
    
    for question in questions:
        for pattern, category in categories.items():
            if re.search(pattern, question, re.I):
                print(f"{question} = {category}")

    Это для примера, структуру для шаблонов можно потом уже выбрать с учетом специфики задачи.
    Ответ написан
    Комментировать
  • Почему не видно фото в окне ткинтер питон?

    @o5a
    Если ошибки не выдает, возможно по тому пути не те картинки, о которых думаете, или же они просто выходят за пределы окна (увеличьте видимое окно, чтобы увидеть). Можно сразу задать размер окна так:
    root=Tk()
    root.geometry('1000x1000')

    К тому же, насколько я вижу, предполагалось делать так, что это одна картинка (Label), которая рандомно "прыгает" по экрану? В таком случае нужно было не создавать новый Label (который будет перекрывать предыдущий), а только менять картинку на нем
    Т.е. в цикле вместо
    img=Label(image=phot)
    делать
    img.image=phot
    Ответ написан
    1 комментарий
  • Вложенный цикл_при решении, почему ошибка?

    @o5a
    Т.к. насколько понимаю цель - перебрать оба списка последовательно, подойдет zip.
    for y, a in zip(years, acres):
         # y, a соответственно будут парами год и акры, их и использовать для сравнения и записи в список acres_one_year
    Ответ написан
    Комментировать
  • При написании калькулятора на модуле kivy, вылетает ошибка, которую я напишу ниже в отдельном комментарии, ошибка вылетает при нажатии кнопки равно?

    @o5a
    Потому что указание этой функции как параметра
    gl.add_widget(Button(text='=',on_press = self.calc_result))

    подразумевает, что в нее будет передаваться объект, в котором она вызывалась (так же, как было в сложении/вычитании), поэтому она и пытается вызвать ее как self.calc_result(instance)

    Можно просто добавить его в саму функцию, даже если и не используется:
    def calc_result(self, instance):
    Ответ написан
    Комментировать
  • Как сделать умный запрос в sqllite на Python?

    @o5a
    Чтобы оно не заменяло текущее значение при передаче None, можно использовать COALESCE. В таком случае оно просто возьмет следующее значение (которое мы указываем самим полем, т.е. старым значением.
    "UPDATE users SET user_name = COALESCE(?, user_name), user_surname = COALESCE(?, user_surname), username = COALESCE(?, username), phone_number = COALESCE(?, phone_number) WHERE id = ?"

    Если же нужно учитывать таким образом передачу не только None, но и пустой строки - '', то в конструкцию надо будет добавить:
    SET user_name = COALESCE(NULLIF(?, ''), user_name),

    и аналогично для каждого поля
    Ответ написан
  • Не работает pygame.key,как исправить?

    @o5a
    Поправьте код (оберните тэгом для Python).

    Пока вижу такие ошибки:
    1. pygame.QUIT написан нижним регистром, поэтому программа не будет закрываться

    2. 2 отдельных цикла по эвентам, поэтому 2-й не отрабатывает (все в 1-м прокручивается)
    Нужно все проверки эвентов внести в один цикл, например так
    ...
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x -= velocity
    
                if event.key == pygame.K_RIGHT:
                    x += velocity
    
                if event.key == pygame.K_UP:
                    y -= velocity
    
                if event.key == pygame.K_DOWN:
                    y += velocity
            # здесь же и проверка на выход из программы
            elif event.type==pygame.QUIT:
                run = False
                pygame.quit()
                quit()


    3. Загрузку картинок (фона и игрока) лучше вынести за пределы цикла, неэффективно каждый раз их загружать. В цикле оставить только сам 'blit'.

    4. На отрисовку картинки заданы фиксированные координаты вместо x,y
    Т.е. должно быть
    screen.blit(player_img,(x,y))
    Ответ написан
    Комментировать
  • Конвертирование координат при помощи python?

    @o5a
    Вам же прямым текстом показали ссылку https://pyproj4.github.io/pyproj/stable/gotchas.ht...

    Используемый вами синтаксис устарел и в текущей версии модуля лучше использовать предложенный там Transformer.
    Насколько понимаю, такой синтаксис
    from pyproj import Transformer
    
    transformer = Transformer.from_crs("epsg:3857", "epsg:4326", always_xy=True)
    x1,y1 = ('4702932.98067679','6656376.87212693')
    x2,y2 = transformer.transform(x1, y1)
    print (x2,y2)
    Ответ написан
    Комментировать
  • Как правильно сохранить скриншот на диск (C:\)?

    @o5a
    Потому что там русская "С" вместо латинской.
    Ответ написан
    4 комментария
  • Как перевести dict в dataframe и наоборот?

    @o5a
    import pandas as pd
    
    data = {
    "слово": 1,
    "не": 2,
    "воробей": 30
    }
    
    df = pd.DataFrame(data.items(), columns = ['word', 'value'])
    print(df)

    Но как уже заметили, не понятно, зачем тут нужен словарь, если это просто подряд идущие значения. По факту это просто список.
    Ответ написан
    1 комментарий
  • Не получается решить задачу яндекс.практикум, python?

    @o5a
    Я так понимаю это практикум по pandas? Тогда и расчеты видимо предполагаются через функционал пакета, а не циклами. В pandas можно писать условия выборки например так:
    df[df['interval'] == 'До внедрения роботов']
    Это вернет DataFrame, у которого в колонке 'interval' указанное значение. Т.е. так получим выборку всех данных "до внедрения роботов".
    Останется применить к ним подсчет количества строк.
    Можно через метод shape
    Так мы сразу получим нужное количество записей с такими данными. Аналогично "после внедрения".
    Ответ написан
    Комментировать
  • Как передать значение в команду sqlite3?

    @o5a
    Подстановка значений в таком виде НЕ работает для идентификаторов, которыми являются названия таблиц и полей. В данном случае подставить можно через обычное форматирование строки:
    cur.execute("SELECT COUNT(*) FROM users WHERE {} == 1".format(mmml))
    или
    cur.execute(f"SELECT COUNT(*) FROM users WHERE {mmml} == 1")

    Возможно правильнее будет изменить сами таблицы, ведь эти нумерованные n1...6 похожи на какие-то костыли.
    Ответ написан
    2 комментария
  • Ошибка записи данных из бота в файл?

    @o5a
    Потому что это так не делается. От того, что хэндлеры записали как вложенные функции, они не будут работать только внутри тех функций. Первый записанный хэндлер одинакового типа (в данном случае content_types=['text']) и будет использоваться для всех вводов.
    В данном случае подойдет использование register_next_step_handler, когда указывается функция, обрабатывающая последующий шаг операции. Про нее много где написано подробно, в т.ч. на этом сайте.
    Для данного бота будет примерно так:
    вместо
    @bot.message_handler(commands=["api_id"])
    def api_id(m, res=False):
        bot.send_message(m.chat.id, 'Введите Api ID, полученное на сайте my.telegram.org')
        @bot.message_handler(func=lambda message: True, content_types=['text'])
        def msg(message):
            print(message.text)
            f = open('C:/Users/асер/Desktop/python/bot/api_id.txt', 'a')
            f.write(message.text + '\n')
            f.close()
            bot.send_message(m.chat.id, 'Прекрасно!')

    сделать так (указать запрос api_id следующим шагом):
    @bot.message_handler(commands=["api_id"])
    def api_id(m, res=False):
        bot.send_message(m.chat.id, 'Введите Api ID, полученное на сайте my.telegram.org')
        # указываем запуск следующего шага обработки - свою функцию
        bot.register_next_step_handler(message, get_api_id)
    
    def get_api_id(message):
        print(message.text)
        with open('C:/Users/асер/Desktop/python/bot/api_id.txt', 'a') as f:
            f.write(message.text + '\n')
        bot.send_message(m.chat.id, 'Прекрасно!')


    Аналогично для обработчиков других команд.
    Ответ написан
    1 комментарий
  • Как получить аватар пользователя в телеграме?

    @o5a
    Нужно обращаться к элементам, как к аттрибутам объекта, а не ключам словаря
    result.photos
    x.width
    photo.file_id
    Ответ написан
    Комментировать
  • Как решить данную проблему с SQLite?

    @o5a
    Как уже объяснили, если пользователя нет, то и данных не возвратит, в результате цикла не будет. Простым изменением можно просто возврат результата внести внутрь цикла:
    ...
                for row in result:
                    singup = str(row[0])
                    return singup

    или же напрямую
    ...
                for row in result:
                    return str(row[0])

    В таком случае если пользователь есть, то вернет его данные. Если нет, то None. И если специальные параметры соединения не указывали, то row итак возвращает текстом, так что можно просто:
    return row[0]
    Ответ написан
    Комментировать
  • Как сложить все массивы класса?

    @o5a
    Я так понял что-то типа такого, для неизвестного количества элементов
    from dataclasses import fields
    
    def combine(elements):
        data = {field.name: sum([getattr(elem,field.name) for elem in elements],[]) for field in fields(elements[0])}
        return Element(**data)
    
    a = Element(...)
    b = Element(...)
    ...
    
    c = combine([a, b])
    Ответ написан
    Комментировать
  • Можно ли записать в файл дату, и потом загрузить из файла дату в таком же формате?

    @o5a
    Если хочется в строке видеть человекопонятную дату, можно использовать стандартный ISO
    import datetime
    
    my_date = datetime.datetime.now()
    my_string = my_date.isoformat()
    print(my_string)
    
    date_from_string = datetime.datetime.fromisoformat(my_string)
    print(date_from_string)
    Ответ написан
    Комментировать
  • Почему в файле .cvs иероглифы вместо букв после парсинга python?

    @o5a
    Для русского Excel кодировка по умолчанию при открытии CSV считается Windows-1251, вот в ней он и открывает. Так что если нужна возможность открывать сразу в Excel, то при сохранении указывайте windows-1251 именно. Но сам по себе CSV файл нормальный и в текущем виде, дело в самой особенности Excel.
    Ответ написан