Задать вопрос
  • Как искать по ключам в словаре?

    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 минут, чтобы не долбить сайт запросами


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

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

    Vindicar
    @Vindicar
    RTFM!
    slovar[username] = {"Name":name}
    slovar[username] = {"Familia":familia}
    slovar[username] = {"Data":ddmmyy}
    slovar[username] = {"Nomer":nomer}

    Ты перезаписываешь slovar[username] каждый раз.
    slovar[username] = {
        "Name":name,  # инглиш
        "Familia":familia, # рунглиш
        "Data":ddmmyy, # рунглиш
        "Nomer":nomer,  # рунглиш
    }
    Ответ написан
    1 комментарий
  • Как из txt файла вытащить строки с одинаковым началом?

    Vindicar
    @Vindicar
    RTFM!
    Очень просто.
    dialogue = dict()  # обычный питоновский словарь
    
    # datasource - коллекция строк. Но данные можно читать и построчно из файла 
    # with open('text.txt', 'rt') as datasource:
    datasource = """mom - Hello, do you need anything in the shop?
    brother - Yes, bring some fruits
    dad - And beer
    mom - okey
    dad - thx
    brother - thx
    """.split()  
    
    for line in datasource:
        actor, _, text = line.split(' - ')  # разбиваем строку на две части
        if _ is not None:  # нашли разделитель, действуем
            # если нужного ключа не было, создать его с указанным значением,
            # (в нашем случае с новым пустым списком) и вернуть это значение
            # а если ключ был, то просто вернуть его значение
            actor_lines = dialogue.setdefault(actor.lower(), [])
            actor_lines.append(text)
    print(dialogue)


    Можно и с defaultdict, так несколько удобнее:

    from collections import defaultdict 
    # если у словаря спрашивают неизвестный ключ, он по-тихому 
    # поместит по этому ключу пустой список, и отдаст этот список
    # этот словарь будет хранить результат
    dialogue = defaultdict(list)  # list - фабрика новых значений
    
    # datasource - коллекция строк. Но данные можно читать и построчно из файла 
    # with open('text.txt', 'rt') as datasource:
    datasource = """mom - Hello, do you need anything in the shop?
    brother - Yes, bring some fruits
    dad - And beer
    mom - okey
    dad - thx
    brother - thx
    """.split()  
    
    for line in datasource:
        actor, _, text = line.split(' - ')  # разбиваем строку на две части
        if _ is not None:  # нашли разделитель, действуем
            # если нужного значения ключа не было, defaultdict сам создаст запрошенный ключ
            # так что мы гарантированно получим список
            dialogue[actor.lower()].append(text)
    
    print(dialogue)
    Ответ написан
    Комментировать
  • Как из конфига получить словарь по значению переменной?

    Vindicar
    @Vindicar
    RTFM!
    s17={}
    s18={}
    s19={}

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

    Vindicar
    @Vindicar
    RTFM!
    paxa-1331, ну для начала вытащи текст из списка. Это всё равно, что пытаться пользоваться набором инструментов, который лежит на чердаке, не доставая его оттуда. Можно, но неудобно.
    txt = List_1[0]
    А потом уже разбирайся с txt, делай срез.
    txt = # тут твой код
    Разберёшься - положишь обратно.
    List_1[0] = txt
    Вообще, читай про списки, читай! Их надо понимать, иначе далеко не уедешь.
    Ответ написан
    Комментировать