• Как составить из букв слово?

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

    Vindicar
    @Vindicar
    RTFM!
    С чего ты взял, что возвращаемое значение второй раз будет не None? Ты проверял, что данные заносятся?
    Собственно, в том и ошибка - у тебя уже есть запись с таким userid, второй раз вставить нельзя.

    А твоя GetInfo() не работает. Почему? Внезапно, в SQL сравнение - это =, а не ==. А ошибку тебе не пишет, потому что ты сделал except: pass. За такую практику вообще надо бить по пальцам линейкой, надеюсь, ты теперь понял почему.
    Ну и до кучи, если хочешь проверить существование, то лучше сделать запрос вида SELECT COUNT(*) FROM main WHERE user_id = ? или
    SELECT EXISTS(SELECT * FROM main WHERE user_id = ?)
    . Эти запросы гарантированно вернут одну строку с одним значением, 0 или 1. 0 - строка не существует, 1 - строка существует.
    Ответ написан
    1 комментарий
  • Как или с помощью чего сделать Telegram бота, который выполняет скрипт по заданному времени?

    Vindicar
    @Vindicar
    RTFM!
    aioschedule посмотри.
    Ответ написан
    Комментировать
  • Как отменить, отображение текста, при пересылке?

    Vindicar
    @Vindicar
    RTFM!
    Очевидно, сначала проверять на форвард, потом уже писать текст. Поменяй блоки местами
    А вообще какой потаённый смысл в первом if, если у тебя все ветки одинаковые? Почему не написать составное условие?
    Ответ написан
    Комментировать
  • Как расчитать кол-во вариантов при рандомизации текста?

    Vindicar
    @Vindicar
    RTFM!
    Обозначим одну подстановку как "терм", и допустим, что все варианты в терме уникальны (т.е. нет повторений внутри одного терма).
    Для терма {} количество комбинаций равно количеству вариантов в терме.
    Для терма [] количество комбинаций равно количеству перестановок вариантов в терме, т.е. факториал от количества комбинаций.
    Для всего выражения количество комбинаций должно быть равно произведению количеств комбинаций для каждого терма.

    С вложенными вариантами чуть сложнее.
    Для {} количество вариантов это по сути сумма их весов.
    Для [] количество вариантов считается так: количество перестановок вариантов, умноженное на произведение весов вариантов.
    У простой строки вес 1, у вложенного терма вес равен количеству его комбинаций.
    Таким образом, можно посчитать число комбинаций рекурсивно.

    import math
    
    class RandomChoice(list):
        pass
    
    class RandomOrder(list):
        pass
    
    def random_choice(options) -> int:
        total = 0
        for option in options:
            if isinstance(option, RandomChoice):  # вложенный выбор варианта
                total += random_choice(option)
            elif isinstance(option, RandomOrder):  # вложенное переупорядочивание
                total += random_order(option)
            else:
                total += 1
        return total
    
    def random_order(options) -> int:
        total = math.factorial(len(options))
        for option in options:
            if isinstance(option, RandomChoice):  # вложенный выбор варианта
                total *= random_choice(option)
            elif isinstance(option, RandomOrder):  # вложенное переупорядочивание
                total *= random_order(option)
            # а для просто варианта ничего делать не надо
        return total
    
    def total_count(items) -> int:
        total = 1
        for item in items:
            if isinstance(item, RandomChoice):  # вложенный выбор варианта
                total *= random_choice(item)
            elif isinstance(item, RandomOrder):  # вложенное переупорядочивание
                total *= random_order(item)
        return total
    
    sample = [
        'я', 
        RandomChoice(['купил', 'приобрел']), # 2
        RandomChoice(['на ярмарке','на рынке','в магазе']), # 3
        RandomChoice(['сыр', #8
            RandomOrder(['соль, ','хлеб, ','муку, ']), # 6
            'сахар']),
    ]
    
    
    combos = total_count(sample)
    print(combos)
    Ответ написан
    3 комментария
  • Как искать по ключам в словаре?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, словари на то и словари, чтобы находить значение по ключу.
    some_dict = {
    0: 'foo',
    1: 'bar',
    2: 'baz',
    }
    
    key = 1
    print(some_dict[key])


    Во-вторых, а что за значение ты используешь в качестве ключа (lvl)? Ты уверен, что оно корректное?
    Ответ написан
  • Какой самый легкий путь для создания модели с помощью машинного обучения?

    Vindicar
    @Vindicar
    RTFM!
    Не использовать машинное обучение, а сначала попробовать другие методы.
    Если искомый объект подвергается только параллельному переносу, пробуй поиск по шаблону (opencv template matching).
    Если он контрастен и также подвергается повороту и масштабированию, можешь искать по локальным особенностям (opencv feature matching).
    Если известно максимальное смещение за кадр, можешь ускорить код, ведя поиск объекта только в окрестности предыдущего расположения.

    И только если у тебя целая категория разнообразных, но похожих объектов, и ты готов предоставить неколько десятков тысяч изображений как с наличием, так и с отсутствием искомого объекта, только тогда стоит задумываться о машинном обучении.
    Ответ написан
  • Как автоматизировать отправку сообщения в Телеграм на Python?

    Vindicar
    @Vindicar
    RTFM!
    aiogram для написания телеграм-бота.
    aioschedule, чтобы не велосипедить планировщик.
    Ответ написан
    Комментировать
  • APScheduler что делать с этим варнингом?

    Vindicar
    @Vindicar
    RTFM!
    Модуль warnings в помощь.
    Ответ написан
    Комментировать
  • Кто знает в чем проблема с модулями?

    Vindicar
    @Vindicar
    RTFM!
    У тебя циклический импорт, так делать нельзя.
    Оформи код, использующий name или list, как функцию, и пусть она это значение принимает как параметр.
    Импортируй файл с функцией в другой модуль, и вызывай её оттуда.
    Ответ написан
    Комментировать
  • Почему не работает перенаправление вывода в файл (subprocess Python)?

    Vindicar
    @Vindicar
    RTFM!
    (перехватывать вывод в subprocess.PIPE, а после записывать это в файл)

    Просто укажи в качестве stdout и stderr открытые на запись файловые объекты, Popen() сделает всё остальное.
    Кода буквально две строчки, а бонусом нормальные исключения при ошибке доступа, плюс можно использовать tempfile.NamedTemporaryFile(), если файлы должны быть временными, а не постоянными.
    Ответ написан
    3 комментария
  • Бот не отправляет переменные?

    Vindicar
    @Vindicar
    RTFM!
    'Карта: " + str(a) + " " + str(b) + " " + str(c) + " " + str(d) +"\nCVV: " + str(e))'

    У тебя внешние кавычки одни, а внутренние другие. Так что весь этот фрагмент - одна строковая константа, а двойные кавычки внутри - просто символы.
    К слову, научись использовать f-строки.
    f"Карта: {a} {b} {c} {d}\nCVV: {e}"
    Ответ написан
    Комментировать
  • Как сократить данную строчку?

    Vindicar
    @Vindicar
    RTFM!
    Еще один товарищ, который считает, что a == 2 or 3 означает "(а равно 2) или (а равно 3)".
    Тогда как на самом деле это "(а равно 2) или (3 != 0)", что всегда равно "истина", независимо от значения a.

    Вот честно, откуда вы все берёте эту идею? Ни на каком другом Q&A сайте я такого не видел.

    Правильно будет или a == 2 or a == 3, или a in (2, 3)
    Ответ написан
    2 комментария
  • Как сделать чтобы он рисовал один прямоугольник до отпускания, а не рисовал кучу?

    Vindicar
    @Vindicar
    RTFM!
    Еще один шикарный пример вопроса не по теме. В заголвоке вопроса лаги, а по делу
    Как сделать чтобы он рисовал один прямоугольник до отпускания, а не рисовал кучу?


    Потому что ты рисуешь множество прямоугольников, не стирая их.
    Когда ты рисуешь прямоугольник - ты изменяешь изображение. И следующий рисуешь уже на изменённом изображении. Вот и получается множество прямоугольников.

    Тебе нужно делать копию оригинального изображения, рисовать на ней, и показывать эту изменённую копию.
    import cv2
    import sys
    import matplotlib.pyplot as plt
    original = cv2.imread(sys.argv[1])
    ix = -1
    iy = -1
    drawing = False
    
    def draw_reactangle_with_drag(event, x, y, flags, param):
        global ix, iy, drawing, original
        if event == cv2.EVENT_LBUTTONDOWN:
            drawing = True
            ix = x
            iy = y
        elif event == cv2.EVENT_MOUSEMOVE:
            if drawing == True:
                img = original.copy()
                cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
                cv2.imshow("Title of Popup Window", img)
        elif event == cv2.EVENT_LBUTTONUP:
            drawing = False
            img = original.copy()
            cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
            print(ix, iy, x, y)
            cv2.imshow("Title of Popup Window", img)
    
    cv2.namedWindow(winname= "Title of Popup Window")
    cv2.setMouseCallback("Title of Popup Window", draw_reactangle_with_drag)
    cv2.imshow("Title of Popup Window", original)
    while True:
        if cv2.waitKey(10) == 27:
            break
    cv2.destroyAllWindows()


    А вообще, если ты хочешь сделать выделение области рамкой, cv2.selectROI() в помощь.
    Ответ написан
    3 комментария
  • Стакаются ли sqlite и тг бот?

    Vindicar
    @Vindicar
    RTFM!
    1. Что значит "одновременного вноса"? sqlite не потокобезопасна, но если ты используешь асинхронную библиотеку для телеги с дефолтной реализацией event loop, то у тебя никогда не будут выполняться 2 обработчика одновременно. Дефолтная реализация строго однопоточна, и проблем с sqlite не будет.
    2. 500 человек - это не мера нагрузки. Самая примитивная мера нагрузки - обращений к базе в единицу времени.
    А вообще более точно было бы проводить измерение времени выполнения разных частей обработчика события. Если бот потребляет значительную долю ресурсов своего хостинга и при этом проводит много времени обращаясь к БД - вот тогда стоит задуматься о смене БД. И даже тогда можно сначала посмотреть в сторону aiosqlite, чтобы не тормозить всего бота, пока запрос к БД выполняется.
    Ответ написан
    Комментировать
  • Каким образом посчитать большое кол-во чисел после запятой?

    Vindicar
    @Vindicar
    RTFM!
    Плавающая точка тут не поможет, её точность ограничена, и это не свойство языка.
    Ты можешь попытаться схитрить, определив число знаков после запятой у исходного числа и умножив его на соответствующую степень 10 (т.е. убрав точку). Тогда ты возведёшь в квадрат целое, а Питон умеет работать с длинными целыми. Но имей ввиду, когда ты потом разделишь результат на удвоенную степень 10, ты снова потеряешь точность. Так что при выводе придётся считать цифры и писать десятичный разделитель вручную.
    Ответ написан
  • Как научить телеграмм бота присылать рандомные изображения из облака?

    Vindicar
    @Vindicar
    RTFM!
    1. Научить бота получать список доступных URL изображений (в виде БД или списка)
    2. Научить бота выбирать случайное изображение из списка
    3. Научить бота отдавать URL

    Ну или если не хочется светить URL пользователю
    3. Научить бота скачивать изображение по URL
    4. Научить бота пересылать скачанное изображение как вложение

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

    Vindicar
    @Vindicar
    RTFM!
    Ну простейший вариант:
    # типы данных. Они могут быть классами, или описаниями вида typing.Tuple[int, str]
    # так как ты не описал типы данных, я пишу тут заглушки typing.Any (т.е. что угодно)
    # эти типы лучше описать в отдельном файле, который будет импортироваться остальными
    Snaphot = typing.Any
    PreparedSnapshot = typing.Any
    SnapshotResult = typing.Any
    
    # функции обработки. они могу быть раскиданы по отдельным файлам, 
    # но они должны импортить нужные модули, в т.ч. описание типов данных
    # ни одна функция не должна выбрасывать исключения
    def get_snapshot(site: str, name: str) -> typing.Optional[Snapshot]:
        "Качает один снапшот с сайта и возвращает его, или None если была ошибка."
        ...
    
    def prepare_snapshot(snapshot: Snapshot) -> typing.Optional[PreparedSnapshot]:
        "Подготавливает один снапшот к обработке. Возвращает None при ошибке."
        ...
    
    def process_prepared_snapshot(snapshot: PreparedSnapshot) -> typing.Optional[SnapshotResult]:
        "Извлекает нужные сведения из одного снапшота и возвращает их как структуру данных, или None при неудаче."
        ...
    
    # эта функция будет в главном запускаемом файле
    # главный файл должен импортировать остальные
    targets = zip(...)  # ну или как ты там делаешь список
    # и вот тут уже главный цикл
    # вариант А - классический цикл
    results: typing.List[SnapshotResult] = []
    for site, name in targets:
        snap = get_snapshot(site, name)
        if snap is not None:
            prepared = prepare_snapshot(snap)
            if prepared is not None:
                result = process_prepared_snapshot(prepared)
                if result is not None:
                    results.append(result)
    # вариант Б - более функциональный подход
    # фильтрует коллекцию, отбрасывает None
    def skipNone(items):
        return filter(lambda item: item is not None, items)
    
    results: typing.List[SnapshotResult] = list(skipNone(
        map(process_prepared_snapshot, skipNone(
            map(prepare_snapshot, skipNone(
                get_snapshot(site, name) for site, name in targets
            ))
        ))
    ))
    # в любом случае, у тебя есть список результатов results, делай с ним что хочешь.


    К слову, у тебя очень кривой zip() в примере кода.
    aList = "http://сайт-со-снепшотами.com"
    bList = ['список',  'имен',  'для',  'снепшотов', 'и', 'так', 'далее'] 
        for a, b in zip(aList, bList):

    У тебя zip() даст
    ('h', 'список'), ('t', 'имен'), ('t', 'для'), ('p', 'снепшотов'), (':', 'и'), ('/', 'так'), ('/', 'далее'), ...
    Ответ написан
    4 комментария
  • Как правильно рекурсивно обойти словарь?

    Vindicar
    @Vindicar
    RTFM!
    Если вложенность словаря неизвестна, то проще всего рекурсией.
    def process_dict(d: dict):
        pass  # тут работаешь с этим словарём
        # рекурсивный вызов для вложенных словарей
        subresults = [process_dict(subdict) for subdict in d['subCategories']]
        pass # тут объединяешь результаты от вложенных словарей с основным результатом
        return ... # обязательно возвращаешь результат
    Ответ написан
    Комментировать
  • Как фиксировать изменение значения переменной в Python?

    Vindicar
    @Vindicar
    RTFM!
    Не так, переменная меняется не присвоением ей значения, а за счет парсинга с сайта

    Вот что я люблю в вопросах от нубов - никогда не знаешь, про что вопрос на самом деле.
    Твой вопрос звучит так, словно тебя интересует любое присвоение значения переменной, даже если новое значение равно старому. И советы тебе дают в этом направлении. А тебе ведь нужно обнаружить изменение значения, так? Если так, читай дальше.

    Тебе нужно сохранять предыдущее значение переменной. Если программа работает постоянно - можно сохранить в другой переменной. Если нужно, чтобы сведения пережили перезапуск - сохраняй в файл или ещё куда.
    Так или иначе, по завершению парсинга, когда у тебя есть новое значение, ты сравниваешь его со старым. И если они не равны, реагируешь на это. Ну и сразу переносишь новое значение в переменную для старого, чтобы при следующем сравнении уже сравнивать с более новым. Что-то типа:
    old_value = None
    while True:
        new_value = parse_site()  # parse_site() - написанная тобой функция, которая возвращает искомое значение
        if old_value is not None and new_value != old_value:  # если это не первый раз, и значение изменилось
            print('Значение изменилось!')
        old_value = new_value  # чтобы в следующий раз сравнивать с последним увиденным значением
        time.sleep(600)  # спим 10 минут, чтобы не долбить сайт запросами


    Ну и да, неважно откуда ты берёшь значение. Ты всё равно присваиваешь его переменной. Всё равно.
    Если ты этого не понимаешь - отложи свой парсер, и почитай хороший учебник по Питону, того же Марка Лутца, "Изучаем Питон".
    Ответ написан
    Комментировать