Ответы пользователя по тегу Python
  • Как вывести все возможные комбинации бросков двух кубиков?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Я люблю всех однострочниками наказывать:
    py -c "n,m=int(input('n=')),int(input('m='))" "((a, b) for a in range(1,n+1) for b in range(1,m+1))"

    У вас в задании сказано, что кубики "разные". Понимаю это так, что мы их можем различить даже если число граней на них одинаково, например по цвету.
    Следовательно даже в этом случае мы сможем различить комбинации, например (3, 5) и (5, 3). Кубики-то разные.
    Ответ написан
    2 комментария
  • Не могу найти ошибку в моей простой программе на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы итерируетесь по символам введённого логина и каждый символ сравниваете с именем пользователя:
    for i in (user_avLog):
    if i == (userName):
    print('Здравствуйте!,' , (user_avLog

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Предыдущий оратор имеет в виду, что есть такая утилита ffmpeg.
    Она, кстати, может сделать то, что вам требуется просто из командной строки без всякого питона. Но из питона же можно командную строку запускать, так что формально да, с помощью него тоже.
    Вот из официальной документации мануал:
    https://trac.ffmpeg.org/wiki/Slideshow#Addingaudio
    Более того, можно еще и сделать эффект панорамирования и плавного масштабирования, чтобы видео получилось не таким статичным
    Ответ написан
    2 комментария
  • Как обработать вывод ошибок в скрипте на Python в Debian?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Например так:
    ERR = 'Warning: Unable to locate configuration directory, default config not loaded.'
    try:
        output = subprocess.check_output(args)
    except subprocess.CalledProcessError as e:
        sys.stderr.write(
        'ERROR: call to mosquitto_pub failed with error code {}\n'.format(e.returncode))
    else:
        for line in output.decode('utf-8').split('\n'):
            if err not in line:
                print(line, file=sys.stderr)

    Но учтите, в случае ошибки в этом варианте вы не получите вообще никакого выхлопа от вашего насекомого.
    Если выхлоп нужен в реальном времени, то вы его тоже можете профильтровать. Чуть сложнее будет.
    Придётся сделать фильтрующую прокси-обёртку для stderr, который подать сабпроцессу.
    Также нужно с осторожностью отнестись к конвертации кодировки. вдруг там не utf-8 было. По-хорошему нужно сплитить бинарный выхлоп по абзацам и детектить строки в нём... или взять у пайпа кодировку попробовать.

    НО! Я, вот, только что подумал, что это проще и лучше сделать со стороны баша. В командной строке где вы запускаете своего москита можно пайпом добавить тупой фильтр строк (хоть даже грепом).
    Ответ написан
  • Как сделать replace в файле?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Да можно и питончиком из командной строки сделать:
    py -x "x.replace('WHAT', 'TOWHAT')" < inputfile.txt > outputfile.txt

    Это если файл текстовый. Если бинарный, то по-другому чуть-чуть, но в бинарном надо осторожно такое менять, может формат поплыть.
    Если нужно исключить замену тех же символов в составе других слов, то вот так:
    py -x "re.sub('(\W)What(\W)', '\\\1ToWhat\\\2', x)"" < inputfile.txt > outputfile.txt
    Ответ написан
  • Ошибка в коде python, в чём проблема?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Присвоение забыли:
    weather_parametres{
        '0': '',
        'T': ''
    }

    Вот так:
    weather_parametres = {
        '0': '',
        'T': ''
    }
    Ответ написан
  • Насколько плохая идея использовать Python для создания браузерных игр?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В качестве бэкенда - норм.
    На фронте питона нет. Разве что рассматривать какие-нибудь кустарные транспиллеры вроде такого: https://github.com/replit-archive/empythoned
    Но с ними вы намучаетесь так намучаетесь. Вернее, судя по тому какой и где вы задаёте вопрос, ничерта у вас не получится.
    Ответ написан
    Комментировать
  • Как это закодить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    reg_expr - это не словарь, а грамматика, описывающая некое выражение.
    По русски читается примерно как:
    Регексп - ЭТО:
    ЛИБО Атом
    ЛИБО ОператорИли(с двумя аргументами: первый - Регексп; второй - тоже Регексп)
    ЛИБО ОператорТочка(с двумя аргументами: первый - Регексп; второй - тоже Регексп)
    ЛИБО ОператорЗвёздочка(с одним аргументом, который Регексп).

    Ниже важное дополнение:
    Priority of the key is following ‘*’ > ‘.’ > ‘|’
    ‘*’ is postfix
    ‘.’ and ‘|’ are left associative

    Это значит, что у ОператораЗвёздочка самый высокий приоритет, потом идёт ОператорТочка, потом ОператорИли.
    ОператорЗвёздочка постфиксный, то есть применяется после своего единственного аргумента.
    ОператорТочка и ОператорИли - лево-ассоциативные.

    Похоже автору вопроса нужно написать регулярное выражение, которое будет матчиться со строкой, соответствующей описанной грамматике.
    Дальше может быть только решение задачи, а автор о нём не спрашивал, а лишь спросил с чего начать.
    Не буду ломать ему удовольствие и спойлерить результат=)
    Ответ написан
    Комментировать
  • Число пар одинаковых элементов в списке?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот как выглядит код у автора вопроса:

    b = list()
    a = None
    
    while a != '':
        a = str(input())
        b.append(a)
        b = list(set(b))
            array_d = {}.fromkeys(b, 0)
            for c in b:
                array_d[c] += 1
          print(array_d)

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы закодировали бинарное несжатое изображение (где каждый байт или группа байтов в зависимости от того сколько каналов - это отдельный пиксель) jpeg-кодеком в сжатый формат с потерей качества. У этого формата есть шапка и там пиксели нее представлены в виде массива байт, там всё более сложно.
    Но сам формат -- это байтовая строка, которую вы теперь зачем-то превращаете в массив...
    Конвертируйте JHPEG обратно в битмап и будет вам такой же массив как исходный. Возмодно почти такой же, поскольку у вас есть потеря качества и некоторые пиксели могут оказаться немного перекрашенными.
    Ответ написан
    Комментировать
  • Как сохранить введенные данные в программе?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    pickle - стандартная библиотека для маршалинга данных
    import pickle
    
    DATA_FILE_NAME = 'persistent_data.pickle'  # имя файла, где будут храниться персистентные данные
    try:  # открываем блок обработки ошибок:
        with open(DATA_FILE_NAME, 'rb') as f:  # открываем файл на бинарное чтение
            my_persistent_data = pickle.load(f)  # производим демаршалинг содержимого файла в переменную my_persistent_data
    except Exception:  # если при этом произошла какая-то ошибка (файл не открылся, данные не распарсились)
        my_persistent_data = {}  # то в эту переменную кладём пустой словарь
    
    print('Old data:', my_persistent_data)  # печатаем всё, сохранившееся с прошлого раза
    key = input('Введите имя параметра: ')  # запрашиваем у пользователя имя парамтра
    value = input(f'Значение параметра: {key} = ')  # запрашиваем у пользователя значение параметра
    my_persistent_data[key] = value  # присваиваем в словарь значение по указанному ключу
    
    with open(DATA_FILE_NAME, 'wb') as f:  # открываем файл на бинарную перезапись
        pickle.dump(my_persistent_data, f)  # сохраняем в файл данные из словаря (маршалинг)
    Ответ написан
  • Можете оценить код?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    К тому, что перечислил @fox_1 добавлю:
    1. используйте pathlib;
    2. выносите магические константы ("%Y-%m-%d-%H.%M.%S") в начало модуля, именуйте их внятно;
    3. используйте argparse;
    4. принимайте пути ('C:\\Users\\MinuteX\\Downloads\\This is a server of MC\\fantasy_city') в параметрах, можно использовать безопасные умолчания и относительные пути;
    5. не конкатенируйте строки (а особенно пути) плюсиком, используйте f-строки или .format(...);
    6. соберите код в функции, сделайте точку входа, анализируйте аргументы командной строки - даже в простых скриптах эта привычка даст вам много очков к опыту и привьёт правильный аккуратный подход к разработке инструментов;
    7. в простых скриптах print - это нормально, но лучше использовать logging, чтобы ваш код можно было использовать как модуль и переопределить логированаие;
    8. делайте выхлоп ошибок в stderr, а всякий полезный выхлоп в stdout, это позволит в командной строке на уровне пайпов направить логи работы вышего скрипта в разные файлы или потоки;
    9. не рассчитывайте, что ваш код будет работать вечно и стабильно. Сейчас у вас период бэкапа нестабильный, зависит от продолжительности самого бэкапа - это, как минимум, странно и неожиданно. Я бы такую штуку сделал простой и одношговой, то есть при запуске утилита делает один единственный бэкап и завершается с ошибкой, если что-то пошло не так. Это позволит занести её в crontab или в планировщик задач, а результаты работы и успешность запуска оценивать внешними механизмами;
    10. старайтесь всегда делать кросс-платформенный код, даже если он вряд ли будет запускаться на других ОС, даже если у вас нет времени протестировать его на разных ОС -- это сформирует у вас хорошую привычку и расширит кругозор, а также позволит не делать лишних специфических костылей.
    Ответ написан
  • Как передать logging из импортированных модулей в основную программу?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Чтобы правильно использовать модуль logging, нужно во всех своих модулях содавать логгеры следующим образом:
    import logging
    log = logging.getLogger(__name__)

    В модулях, которые не запускаются сами по себе, никакого другого кода инициализации и настройки логирования не требуется.
    Если вы в своём модуле желаете различать два или более вида логов, то можно сделать как-то так:
    log = logging.getLogger(__name__)
    class MyModel:
        log = logging.getLogger(__name__ + '.MyModel')
        # ...

    В этом случае для этого класса будет свой логгер со своим именем.
    Также логгер можно создавать в метаклассе давать ему имя класса автиоматически, тогда каждый потомок будет иметь свой логгер со своим именем.
    Однако все эти логгеры ничего не знают о файлах и потоках, куда будут попадать их логи. Все фильтрации и перенаправления будут делаться в единой конфигурации логгирования в основной программе.

    В главном запускаемом файле кроме обычного создания логгера как во всех модулях будет ещё и инициализация и настройка системы логирования.
    В самом простом виде это что-то вроде такого:
    if __name__ == '__main__':
        logging.basicConfig(stream=sys.stderr, level='INFO', format='%(asctime)s %(levelname)-7s %(message)s')

    Тут говорится, что все логи уровня >= INFO будут в указанном формате направлены в stderr.

    В более сложном случае вы можете загрузить настройку логирования из конфигурационного файла или описать кодом:
    if __name__ == '__main__':
        # У вас может быть несколько разных способов форматировать код для разных мест:
        formatter_simple = Formatter(u'%(relativeCreated)08d %(levelname)-7s %(message)s')
        formatter_complex = Formatter(u'%(asctime)s %(levelname)-7s [%(filename)21s:%(lineno)-4d] %(message)s')
        # Несколько разных хендлеров для перехвата нужного вида сообщений и отправки в правильное место:
        handler_null      = logging.NullHandler()
        handler_screen    = handler(fmt=formatter_simple, stream=sys.stderr)
        handler_main_file = handler(
            fmt=formatter_complex,
            cls=logging.handlers.TimedRotatingFileHandler,
            when='midnight',
            backupCount=5,
            encoding='utf-8',
            filename=local_path('log/server.log'),
        )
        handler_errors_file = handler(
            fmt=formatter_complex,
            cls=logging.handlers.TimedRotatingFileHandler,
            when='midnight',
            backupCount=5,
            encoding='utf-8',
            filename=local_path('log/errors.log'),
            level='ERROR',
        )
        # А потом описываем сами логгеры:
        #   это корневой логер, пропускает все сообщения через себя насквозь и в то же отдаёт их своим хендлерам
        log_root       = logger(None, level='DEBUG', propagate=1, handlers=[handler_errors_file, handler_main_file, handler_screen])
        #   этот логер перехватывает логи торнадо-приложения, пропускает через себя и отдаёт хендлерам:
        log_app        = logger('tornado.application', level='DEBUG', propagate=1, handlers=[handler_errors_file, handler_main_file, handler_screen])
        #   этот собирает логи событий модели уровня выше или равного INFO (не отладочные) 
        #     и отдаёт соответствующим хендлерам, дальше для обработки свои сообщения не пускает
        log_events     = logger('app.model.events',     level='INFO',  propagate=0, handlers=[handler_errors_file, handler_events_file])
        #   этот логер съедает и отдаёт спец-хендлеру (он не показан выше, но должен быть) все логи http доступа
        log_websrv     = logger('tornado.access',                    level='DEBUG', propagate=0, handlers=[handler_websrv_file])
        #    этот логер глотает и гасит за ненадобностью все логи, которые генерит библиотека PIL при работе с PNG-файлами
        log_pil        = logger('PIL.PngImagePlugin',                level='INFO',  propagate=0, handlers=[handler_null])

    Если сообщение не перехвачено и не остановлено специфичным логером, оно улетает корневому логеру.
    Ну примерно как-то так.
    Само собой всю эту настройку лучше вынести в отдельный модуль и запускать при старте главного файла.
    Логеры вроде log_pil, log_websrv и прочих сохранены в отдельные переменные, но по факту в коде эти переменные нигде не используются. Их можно и не присваивать вовсе. В модуле логирования все логгеры регистрируются глобально в списке и поэтому в каждом модуле не требуется ничего импортировать, достаточно создать логгер по имени. По этому имени логер ищется среди созданных или автоматом создаётся новый. Имена логгеров используют точечную нотацию, и по ступеням имени их удобно фильтровать.

    Такой подход имеет свои недостатки (синглтон, неявное описание, толерантность к ошибкам), достоинства его весомы: отсутствие ада зависимостей (когда непросто или невозможно определить ациклический порядок создания логеров), гибкость настройки, изоляция (возможность перекрытия и фильтрации не влезая в код логирования).

    P.S.
    Старайтесь не использовать CamelCase в именовании файлов проекта. Не смотря на то, что негласное это правило часто нарушается даже популярными библиотеками, всё же это часто создаёт лишнюю неразбериху и проблемы.
    В частности много геморроя можно поиметь переименовав файл сменив лишь регистр символа под контролем версий при работе с репозиторием на разных файловых системах. В винде, к примеру, регистр в именах сохраняется, но системой не различается, а в линукс различается. Таким образом винда не увидит переименования, а линукс увидит. Это может породить адский треш.
    Ответ написан
    Комментировать
  • Как изменить порядок в объекте?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    d['statistics'].insert(2, d['statistics'].pop(0))
    2 - потому что индексируются элементы с нуля, то есть у третьего по счету будет индекс 2.
    При вставке элемента по индексу, тот элемент, что там уже был и все последующие сдвинутся вправо.
    Сначала вычисляются аргументы, а потом выполняется функция, куда они продаются. Это значит что справа первый элемент будет извлечён из списка, а потом вставлен на третье место.
    Ответ написан
  • Как сформировать вложенный json из структуры?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Если событий у вас действительно много, то рекомендую вам не пихать их в один JSON, а воспользоваться вот таким форматом: jsonlines.org
    Это разделённые абзацами строки с JSON'ами.
    Этот формат не требуют огромного количества памяти (на весь датасет разом), его можно обрабатывать потоково.
    Но в задаче не сказано, что отдельные треки одного событий идут подряд и отдельные координаты одного трека тоже идут подряд. Поэтому рассчитывать на это не приходится.
    Уточните задачу и можно будет оптимизировать решение по памяти перейдя к потоковой выдаче.
    import struct
    import json
    
    filepath = 'hits.dat'
    events = {}
    with open(filepath, 'rb') as fp:
        buffer = fp.read(28)
        while len(buffer) == 28:
            event_id, track_id, x, y, z = struct.unpack(">HHddd", buffer)
            buffer = fp.read(28)
    
            event = events.setdefault(event_id, dict(event_id=event_id, tracks={}))        
            track = event['tracks'].setdefault(track_id, dict(coordinates=[]))
            track['coordinates'].append(dict(x=x, y=y, z=z))
    
    with open('hits.json', 'w') as fp:
        json.dump(events, fp, indent=2)

    Файла у меня вашего нет, поэтому писал на ощупь. Проверяйте.
    У вас, кстати, ошибка в примере JSON'а.
    Нужно так:
    events = {
        1: {
            'event_id': 1,
            'tracks': {
                1: {        
                    'track_id': 1,
                    'coordinates': [
                        {'x': 1, 'y': 2, 'z': 3},
                        {'x': 4, 'y': 5, 'z': 6}
                    ]
                },
                2: {
                    'track_id': 2,
                    'coordinates': [
                        {'x': 12, 'y': 22, 'z': 33},
                        {'x': 44, 'y': 55, 'z': 66}
                    ]
                }
    
            }
        }
    }
    Ответ написан
  • Как сравнить две строки DataFrame без учета последовательности?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    def h(s):
        return tuple(sorted(s.split())
    
    > h('4 3 1 2')
    ('1', '2', '3', '4')
    
    > h('1 2 4 3')
    ('1', '2', '3', '4')
    Ответ написан
    Комментировать
  • Проект Эйлера. Задача №2. Как решить правильно?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    ВНИМАНИЕ! Это неправильное решение!
    Это сумма четных по счету элементов ряда фиббоначчи.
    a = 1
    b = 2
    s = b
    while b < 4*10**6:
        a = a + b
        b = a + b
        s += b
    
    print(s)

    А если четные (по значению) элементы складывать, то нужно так:
    s, a, b = 0, 1, 2
    while b < 4*10**6:
        if b % 2 == 0:
            s += b
        a, b = b, a + b   
    
    print(s)

    А ваше решение из вопроса неэффективно. Оно сначала строит список из всех элементов ряда, не превышающих заданного. Потом фильтрует их по четности, благо лениво и не требуется лишней памяти. Ну и суммирует фильтрат. Итого у этого алгоритма O(2*N) сложность по памяти и по столько же по операциям.
    Предложенный выше алгоритм -- O(1) по памяти и O(N) по операциям.

    И на старуху бывает проруха. Ага. невнимательность.
    Ответ написан
    Комментировать
  • Как очистить переменую от букв чтобы потом привратить в число?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    v = int(val_2.split('_')[-1])
    Ответ написан
    Комментировать
  • Как сделать распознавание цифр на изображении?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас несложная капча. Этапы распознавания следующие:
    1. Находим зоны связности по цвету.
    2. Пересекающиеся AABB ограничивающими прямоугольниками зоны объединяем в одну.
    3. Вырезаем зоны, масштабируем к единому размеру.
    4. Пастеризуем до монохромного.
    5. Цифры у нас семисегментные. Нужно 7 линейных детекторов: это линейные риски (черточки), которые гарантированно перечеркнут сегмент. Метрикой детектора будем считать количество закрашенных пикселей под риской. Детекторы с метрикой меньше пороговой считаем не обнаружили сегмента.
    6. По отдельному словарю декодируем набор включенных сегментов в цифру.
    Ответ написан
    4 комментария
  • Как исправить ошибку dictionary changed size during iteration?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Проблема связана с тем, что вы пытаетесь модифицировать словарь, по элементам которого итерируетесь.
    В условиях вашего кода это не проблема. Но вы должны сначала прежде чем начнётся цикл с удалениями) взять список пар элементов из вашего словаря.
    products.items() возвращает не список, а итератор по элементам словаря. Само собой этот итератор ломается как только вы удаляете из словаря первый элемент.
    Но если этот итератор до первого удаления полностью превратить в список, то удалять потом можно что хотите.
    for product_id, value in list(products.items()):
        if value['g_1'] == 0:
            del products[product_id]

    Или так:
    new_products_dict = {k: v for k, v in products.items() if v['g_1'] != 0}

    Здесь создаётся новый словарь из элементов, которые удовлетворяют вашим условиям.
    Ответ написан
    1 комментарий