• Как найти простые числа в диапазоне?

    Vindicar
    @Vindicar
    RTFM!
    Решето Эратосфена предполагает удаление элементов, кратных очередному простому числу.
    Т.е. обработали 2 - вычеркиваем каждый 2й элемент. Обработали 3 - каждый третий, и так далее.
    Отсюда получаем следующее.
    У нас есть исходный список элементов.
    numbers = list(range(2, n+1))
    На каждом шаге, когда мы проверяем число k, мы выкидываем все числа, кратные k, кроме самого k.
    numbers = [ x for x in numbers if x % k != 0 or x == k]

    А как мы выбираем k? Просто идём по списку чисел от начала. Все элементы в начале списка всегда будут простыми, так как 2 - простое, а все последующие составные элементы будут выкинуты на одной из итераций
    i = 0
    while i < len(numbers):
      k = numbers[i]
      numbers = [ x for x in numbers if x % k != 0 or x == k ]
      i += 1
    Ответ написан
    Комментировать
  • Как реализовать валидацию?

    Vindicar
    @Vindicar
    RTFM!
    Ну можно и через лямбды, но - имеет ли это смысл? В чем будет выигрыш по сравнению с простым try except?
    Будет менее читаемо, по-моему.

    К сожалению, суп не поддерживает из коробки XPath - эта штука позволяла бы задать селектор как в примере одной строкой вида
    //li[contains-token(@class, 'CardInfoRow_year')]//span[contains-token(@class, 'CardInfoRow__cell')][1]/a[contains-token(@class, 'link')]


    Можно наколхозить грубое подобие:
    class BSItem: # одиночный элемент
        def __init__(self, item):
            self._item = start
        
        def __bool__(self):
            return bool(self._item)
        
        def __str__(self):
            return self._item.contents[0] if self else ''
        
        @property
        def tag(self):
            return self._item
        
        def __truediv__(self, other): # оператор / ищет один элемент
            if not self: # пустой элемент так и останется пустым
                return self
            if isinstance(other, str): # item / 'tag.classname'
                tag, _, cls = other.partition('.')
                if cls:
                    return BSItem(self._item.find(tag, class_=cls))
                else:
                    return BSItem(self._item.find(tag))
            if isinstance(other, int) and other == 0: # item / 0 == item
                return self
            if callable(other): # item / lambda tag: tag.has_attr('id')
                return BSItem(self._item.find(other))
            raise ValueError() # передали ерунду
        
        def __floordiv__(self, other): # оператор // ищет все элементы
            if not self:
                return BSItems([])
            if isinstance(other, str): # item // 'tag.classname'
                tag, _, cls = other.partition('.')
                if cls:
                    return BSItems(self._item.find_all(tag, class_=cls))
                else:
                    return BSItems(self._item.find_all(tag))
            if callable(other): # item // lambda tag: tag.has_attr('id')
                return BSItems(self._item.find_all(other))
            raise ValueError()
    
    
    class BSItems: # коллекция элементов
        def __init__(self, items):
            self._items = items
        
        def __bool__(self):
            return bool(self._items)
        
        def __iter__(self): #позволяет делать for tag in BSItems:
            return iter(self._items)
        
        def __len__(self):
            return len(self._items)
        
        def __truediv__(self, other): # оператор / ищет один элемент в каждом элементе
            if not self: # пустой элемент так и останется пустым
                return self
            if isinstance(other, str): # item / 'tag.classname'
                tag, _, cls = other.partition('.')
                if cls:
                    return BSItems([item.find(tag, class_=cls) for item in self._items])
                else:
                    return BSItem([item.find(tag) for item in self._items])
            if isinstance(other, int): # items / 2 найдет третий элемент в коллекции
                return BSItem(self._items[other]) if len(self._items) > other else BSItem(None)
            if callable(other): # items / lambda tag: tag.has_attr('id')
                return BSItems([item.find(other) for item in self._items])
            raise ValueError() # передали ерунду
        
        def __floordiv__(self, other): # оператор // ищет все элементы
            if not self:
                return self
            if isinstance(other, str): # item // 'tag.classname'
                tag, _, cls = other.partition('.')
                result = []
                for item in self._items:
                    result.extend(item.find_all(tag, class_=cls) if cls else item.find_all(tag))
                return BSItems(result)
            if callable(other): # item // lambda tag: tag.has_attr('id')
                result = []
                for item in self._items:
                    result.extend(item.find_all(other))
                return BSItems(result)
            raise ValueError()


    За точность кода не ручаюсь, но идею должен передать.
    Пример использования будет примерно такой:
    year_tag = BSItem(soup) / 'li.CardInfoRow_year' // 'span.CardInfoRow__cell' / 1 / 'a.Link'
        year = str(year_tag) or '-'
    Ответ написан
  • Как изменить вывод длинного не целочисленного числа на питоне?

    Vindicar
    @Vindicar
    RTFM!
    Если знаешь, сколько знаков после запятой тебе надо - то print(f'{a:.12f}') где 12 - сколько знаков после запятой выводить.
    Ответ написан
    2 комментария
  • Почему моя функция всё время возвращает "False"?

    Vindicar
    @Vindicar
    RTFM!
    Метод .sort() списка сортирует список на месте, и возвращает None.
    Если нужна отсортированная копия списка без изменения оригинала, функция sorted() в помощь.
    А вообще, можно же ещё проще. Список сортируем по возрастанию? Тогда нужно убедиться что каждый следующий элемент больше предыдущего.
    def is_sorted(lst) -> bool:
      for i in range(0, len(lst)-1)
        if lst[i] > lst[i+1]: #нашли элементы в неправильном порядке
          return False #значит не отсортирован
      # если сюда дошли, то отсортирован
      return True

    Или то же самое но короче
    def is_sorted(lst) -> bool:
      return all( lst[i] <= lst[i+1] for i in range(0, len(lst)-1) )
    Ответ написан
    Комментировать
  • Как задать время мута, бана в команде?

    Vindicar
    @Vindicar
    RTFM!
    get_args() → Optional[str]
    Судя по документации, get_args() возвращает строку, идущую после команды, или None. Разбор этой строки - уже твоя забота. Например, так:
    1. присвоить результат .get_args() переменной и убедиться, что это не None.
    2. ободрать пробелы с помощью .strip()
    3. превратить в int()/ float() и поймать исключение, если в строке не число
    4. использовать полученное значение.
    Ответ написан
    2 комментария
  • Как лучше осуществить запись в файл python при асинхронной работе?

    Vindicar
    @Vindicar
    RTFM!
    Очень много факторов влияет.
    Если нужно записать несколько килобайт на жесткий диск, то можно и так.
    А если потом внезапно выяснится, что требуется записать несколько десятков мегабат на удалённое хранилище, то могут возникнуть проблемы.
    Так что зависит от решаемой задачи.
    Ответ написан
  • Как в каждом проекте автоматически работать в PyCharm с тем версиями библиотек, которые прописаны в requirements.txt?

    Vindicar
    @Vindicar
    RTFM!
    Вообще PyCharm вроде умеет создавать виртуальные окружения (читай - локальные копии питона) для своих проектов? Тогда просто в каждом проекте создай свой venv, установи локально в него нужные пакеты и работай так.
    Но точнее сказать затрудняюсь, с PyCharm сам не работал.
    Ответ написан
    2 комментария
  • Как сделать вывод статуса бота discord?

    Vindicar
    @Vindicar
    RTFM!
    Обычно боты предоставляют событие для включения, типа on_ready.
    Для выключения это реально сделать только если ты выключаешь бота командой. Если просто завершить процесс бота, то бот скорее всего не успеет ничего сделать.

    Детали зависят от используемой библиотеки, которую ты не указал.
    Ответ написан
    2 комментария
  • Отмена цикла командой?

    Vindicar
    @Vindicar
    RTFM!
    Простого способа нет, так как каждое обращение к команде создаст новый выполняющийся экземпляр xpfarmm().
    Один способ - создать хранилище вида "id пользователя - логический признак". Например, словарь (dict). Каждому пользователю сопоставишь логическое значение. Если значения для id пользователя нет в словаре - пользователь не запустил команду. Если значение есть, и это True - команда выполняется. Если значение есть, и это False - команда должна быть остановлена.
    Тогда при запуске команды xpfarm:
    1. Убеждаешься, что id пользователя нет в словаре. Иначе отказ. (Пользователь ведь не может запустит ькоманду второй раз пока она работает?)
    2. Вносишь True в словарь для id пользователя.
    3. Входишь в цикл. На каждой итерации цикла проверяешь, не изменилось ли значение в словаре на False. Если изменилось, делаешь break.
    4. По выходу из цикла удаляешь значение из словаря.

    Убедись, что задержку в цикле делаешь через await asyncio.sleep(), иначе бот уснёт пока цикл не закончится, и не будет ни на что реагировать!

    А чтобы отменить, делаешь отдельную команду, которая ищет id пользователя в словаре. Если оно есть - заменяет его на False.
    Ответ написан
    Комментировать
  • Как сделать телеграм бота многоязычным?

    Vindicar
    @Vindicar
    RTFM!
    1. Храни таблицу языков вида "ID пользователя - ID языка". Если записи для пользователя в таблице нет, то предлагаешь выбрать, или задаёшь какое-то значение по умолчанию.
    2. Храни все постоянные строки, которые отправляет бот, в некотором хранилище. Хранилище должно иметь вид "ID строки - ID языка - содержимое строки". Соответственно при отправке сообщения узнаёшь ID языка пользователя, с которым идёт обмен, и выбираешь нужную строку по ID строки.
    Ответ написан
    2 комментария
  • Как выполнить действие но только 1 раз?

    Vindicar
    @Vindicar
    RTFM!
    > b1=Button(root, text="22211", command=random.choice(A))
    Вот в этот момент у тебя случано выбирается одна из трёх функций, и назначается на обработку нажатия кнопки.
    Только в этот момент! Потом она так и остаётся.
    Так что если хочешь, чтобы случайный выбор делался при каждом нажатии на кнопку - делай его при каждом нажатии на кнопку, т.е. в обработчике нажатия. А не снаружи. Внезапно, да?

    A=['1', '2', '3']
    
    def clickity():
      index = random.randint(0, len(A)-1)
      item = A.pop(index) #выталкиваем элемент из списка и вставляем его в переменную
      print(item)
    
    b1=Button(root, text="22211", command=clickity)
    b1.pack()
    root.mainloop()
    Ответ написан
  • Как сделать так, чтобы если в списке стоят 3 одинаковых числа под ряд то они удалялись?

    Vindicar
    @Vindicar
    RTFM!
    Циклом. Вот только вопрос, а если после удаления снова будут 3 подряд, тоже удалять?
    Например,
    a = [1, 1, 2, 2, 2, 1]
    Должно дать на выходе a = [1, 1, 1] или a = []?

    Если первое, то что-то такое...
    our_list = [1, 2, 3, 3, 3]
    #идём от конца списка к началу - так удаление повлияет только на уже обработанные элементы списка.
    for i in range(len(our_list) - 3, 0, -1): 
      if our_list[i:i+3] ==  [ our_list[i] ] * 3: #сравниваем фрагмент списка с повтором элемента трижды
        del our_list[i:i+3]
    
    print(our_list)
    Ответ написан
    5 комментариев
  • Как по-человечески найти нужный элемент в списке?

    Vindicar
    @Vindicar
    RTFM!
    Ты хочешь указывать ячейку как в морском бое, а1-в3?
    Тогда работай отдельно по строкам и столбцам, так будет проще.
    field = [
      [' ', ' ', ' '],
      [' ', ' ', ' '],
      [' ', ' ', ' '],
    ]
    #обращение к ячейке будет таким: field[1][1] 
    
    columns = ['1', '2', '3'] #обозначения столбцов
    rows = ['a', 'b', 'c'] #обозначения строк
    
    def cell2index(cell):
      # превращаем строку вида b1 в индексы в списке
      row = rows.index(cell[0].lower()) #если номера строки нет, вылетит исключение ValueError
      col = columns.index(cell[1]) #если номера столбца нет, вылетит исключение ValueError
      return row, col #возвращаем кортеж - пару значений
    
    # пример работы - ход крестиков
    while True: #повторяем, пока пользователь не введет правильный номер
      cell = input('Введите ячейку для хода: ')
      try:
        r, c = cell2index(cell) #если номер неверный, тут вылетит исключение ValueError
        if field[r][c] != ' ': #ячейка уже занята?
          print('Ячейка уже занята!')
        else:
          break #если исключения не было, выходим из цикла
      except ValueError:
        print('Номер ячейки неправильный')
    #сюда попадём только если номер ячейки правильный и она свободна
    field[r][c] = 'x'
    Ответ написан
    2 комментария
  • Найдите все пифагоровы тройки, в которых все числа находятся в диапазоне [1; 5000]?

    Vindicar
    @Vindicar
    RTFM!
    Не пойму почему делаете так. Можно куда проще.
    Можно сгенерировать список квадратов чисел:
    squares = [i*i for i in range(1, 5001)]
    При этом индекс элемента в списке i всегда будет на один меньше, чем число, чей квадрат находится по индексу i.
    Теперь задача переформулируется таким образом: найти все пары чисел из этого списка, сумма которых тоже в этом списке.
    for a,a2 in enumerate(squares, 1):
      for b,b2 in enumerate(squares[a:], a+1):
        if (a2+b2) in squares:
          c = squares.index(a2+b2) + 1
          print(a,b,c)

    Работает не очень быстро, но работает.

    EDIT: можно резко ускорить код, если учесть следующее: нам не обязательно искать сумму во всем списке. Мы знаем, что сумма будет больше чем b^2, т.е. будет иметь индекс больше чем b. Также мы знаем, что a^2 + b^2 < (a+b)^2, т.е. сумма будет иметь индекс меньше чем a+b. Отсюда:

    for a,a2 in enumerate(squares, 1):
      for b,b2 in enumerate(squares[a:], a+1):
        if (a2+b2) in squares[b+1:a+b]:
          c = squares.index(a2+b2) + 1
          print(a,b,c)
    Ответ написан
    Комментировать
  • Как решить проблему?

    Vindicar
    @Vindicar
    RTFM!
    async def on_report_button(inter):
    member = inter.author
    self.collticku.update_one({'_id': guild.id}, {'$inc': {'tnum': +1}})
    num = self.collticku.find_one({'_id': guild.id})['tnum']

    Поздравляю, ты попался на замыкании. on_report_button() будет всегда ссылаться на ТЕКУЩЕЕ значение guild - а к моменту вызова on_report_button() это текущее значение уже прошло через весь цикл for guild in self.bot.guilds и остановилось на последней гильдии из списка. От того, что ты создал on_report_button() несколько раз, это не изменится.
    Побороть можно через атрибуты функции. Внутри on_report_button() используй не guild, а on_report_button.guild. А после объявления on_report_button() (т.е. ВНЕ самой функции) присвой on_report_button.guild = guild. Тогда каждая версия on_report_button() будет иметь свою гильдию.
    Это касается ВСЕХ переменных, которые on_report_button() захватывает из вышележащей области видимости. Если они изменяются, то все копии этой функции будут видеть только последнее текущее значение.
    Ответ написан
    Комментировать
  • Discord.NET как предоставить пользователю роль?

    Vindicar
    @Vindicar
    RTFM!
    Получить объект нужного пользователя, затем вызвать на нём AddRoleAsync()?
    Без кода подробного ответа не будет.
    Ответ написан
    2 комментария
  • Как Удалить надпись, Бот заблокировал в чате?

    Vindicar
    @Vindicar
    RTFM!
    Смотришь метод Bot.send_message(), которым ты пользуешься.
    Там и впрямь есть параметр disable_notification, который можно передать.
    Так что просто передаёшь этот параметр по имени, как disable_notification=True.
    Ответ написан
    Комментировать
  • Как сделать добавление эмодзи к Ембеду?

    Vindicar
    @Vindicar
    RTFM!
    await channel.add_reaction('')
    реакцию можно добавлять только к сообщениям, а не к каналам.
    Ответ написан
    Комментировать
  • Random.uniform что делаю не так?

    Vindicar
    @Vindicar
    RTFM!
    random.uniform() принимает два параметра - целых числа.
    Ты передаёшь один параметр - кортеж из двух элементов.
    Это разные вещи.
    Неясно, зачем вообще тебе farm_timer и почему нельзя было написать просто random.uniform(61,65), но если хочется иметь именно кортеж, то можно сделать так:
    random.uniform(farm_timer[0], farm_timer[1])
    или так, если порядок и чсило элементов в кортеже точно соответствуют параметрам:
    random.uniform(*farm_timer)
    Ответ написан
    Комментировать
  • Почему при использовании первого элемента списка выдает ошибку выхода за грани списка?

    Vindicar
    @Vindicar
    RTFM!
    Потому что user_name содержит пустую строку. А вот почему так, это уже второй вопрос.
    Хотя _clean_all_tag_from_str() это тот еще код... вообще разве в title могут быть вложенные теги?
    Ответ написан
    1 комментарий