• Как реализовать fifo из списков в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Не используйте такой некорректный способ удаления:
    bue.remove(bue[0])
    Метод remove удаляет элемент по значению, а не по индексу.
    Используйте bue.pop(0) для извлечения первого элемента и, если надо bue.pop(-1) для извлечения последнего. Метод возвращает извлеченный элемент.
    FIFO - означает First In First Out - это классическая очередь. Первый вошедший элемент выйдет первым. Своеобразная модель ЖКТ здорового человека. ЖКТ алкоголика - это так называемый Дек, извлекать элементы из которого допустимо с двух сторон. Почему вы тут используете слово FIFO я не понимаю.

    Ок. Если по существу.
    Вам, очевидно, нужен цикл, который будет повторяться пока у вас не опустошится один из ваших списков. Читайте про оператор while.
    На каждой итерации этого цикла вы будете проверять перечисленные вами условия и выполнять указанные действия.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Нужно примерно следующее:
    • Что такое умножение.
    • Что такое таблица.
    • Что такое таблица умножения, зачем она бывает нужна и как устроена.
    • Надо понимать основы алгоритмизации: что такое алгоритм, какие есть базовые алгоритмические структуры (последовательное выполнение, ветвление, цикл) и для чего они нужны.
    • Нужно понимать синтаксис питона хотя бы на базовом начальном уровне. Можно почерпнуть из практически любой книги Марка Лутца про питон. Можно поискать вообще любую книга а-ля питон для чайников - этого будет достаточно для решения вашей задачи.
    • Нужно понимать концепцию цикла, вложенных циклов.
    • Нужно понимать базовую арифметику.


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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Добавьте в структуру ответа поле с флагом ошибки и текстовым пояснением.
    Обычно это на клиенте показывают как-то так: "Ой, что-то пошло не так, наша группа поддержки уже в курсе и мы делаем всё возможное, чтобы такое не повторялось. Попробуйте повторить эти действия позднее или обратитесь в нашу службу поддержки с вопросом через вот эту форму <ссылка на форму обратной связи>".
    Чтобы написанное не было ложью, нужно детально и тщательно залоггировать все обстоятельства, при которых возникла ошибка, вывести уведомление о проблеме на дэш-борд и в почту администрации сайта. По факту исправления проблемы можно написать клиенту в личный кабинет или на почту сообщение с извинениями, благодарностью за найденную проблему и уведомлением, что все исправлено и можно дальше пользоваться сервисом.
    Лишних стыдных подробностей о ваших внутренних косяках пользователю знать не нужно, никаких кодов или фраз тоже не требуется составлять для устного обращения пользователя в поддержку. Идеально, если поддержка сразу проасоциирует обращение и проблему через куки и будет в курсе случившегося при первом же обращении. Это выгладит для пользователя как забота и внимание к его проблеме с вашим сервисом.
    Ответ написан
    Комментировать
  • Ошибка "SyntaxError: multiple statements found while compiling a single statement", в чем проблема?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    number == 79
    Вы сравниваете несуществующую переменную с константой 79. Используйте присвоение: "="
    И заодно расскажите, как это у вас работает в голове? Буквально следующей строчкой есть присвоение, написанное верно. Вам оказалось проще прийти на этот сайт и задать дурацкий вопрос, вместо того, чтобы секунду подумать и внимательно посмотреть код в том месте, куда вам заботливо указал интерпретатор. Как это так? Вы серьёзно?!
    Ответ написан
    7 комментариев
  • Как сделать, чтобы бот на telethon приветствовал в личку заходящих на канал?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вроде бы в телеграме боты не могут писать людям по собственной инициативе. Нужно, чтобы человек сам затеял разговор с ботом. Иначе можно погрязнуть в спаме.
    Ответ написан
    Комментировать
  • Как решить задачу на языке python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    from functools import reduce
    x = input('Число:')
    a = input('Цифра:')
    assert a.isdigit() and len(a) == 1, f'Неправильная цифра {a!r}'
    assert x.isdigit(), f'Неправильное число {x!r}'
    print(reduce(int.__mul__, map(int, x)))  # long claps for @longclaps
    print(f"{a} {'есть' if a in x else 'нет'} в {x}")
    Ответ написан
  • Как сравнить несколько последовательностей цифр между собой?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А какие конкретно у вас пожелания на счет скорости? У вас сложность квадратичная, 25 миллионов сравнений. Ну можно бинарные операции подключить, можно последовательности как-то обрабатывать, например сортировать. Однако в этой формулировке не ясно что не так и какие у вас получились скорости. От чего-то ж надо отталкиваться. Покажите код и вам его здесь пооптимизируют.
    А сейчас задача выглядит как "пойди туда - не знаю куда".
    Так-то можно упороться и на шейдерах это решать за счет видеокарты. Вопрос только в том, для чего все эти извращения. Если простая учебная задача - то на то она и задача, чтобы самому решать, а не на Q&A, а если практическая, то попахивает проблемами в архитектуре на более ранних этапах. Не ясна причина почему нужно быстрее, это часто повторяющаяся задача? Если так, то, быть может, имеет смысл изначально оптимизировать? Эта задача инициируется пользователем? Так может имеет смысл прибегнуть к ленивым вычислениям или посчитать заранее,чтобы не фризить интерфейсы?
    Короче, нужно больше подробностей.
    Ответ написан
    Комментировать
  • Как можно массово изменить exif данные фотографий, использую .json файл с исходными данными?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Я так понял вам нужо для всех файлов перечисленных в json поправить некоторые параметры exif, значения, которые нужно прописать лежат в том же json.
    Итерироваться по элементам json удобно с помощью jq.
    Каждую запись вам нужно превратить в текст - командную строку для изменения параметров EXIF.
    Это удобно делать с помощью py,
    Результат - это текстовый файл с командой в каждой строке.

    Что именно из этой последовательности вам не понятно? Спрашивайте - объясню конкретнее.
    Нужно поискать улиту командной строки для записи параметра в exif.
    Ответ написан
  • Что это за программа (см. скрин)?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ответ написан
    Комментировать
  • Как узнать, что дополнительно устанавливалось к программе на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    pip freeze > requirements.txt
    Но папку питона на всякий случай тоже сохраните. И в пользовательском каталоге домашнем артефакты питона посмотрите. Не знаю где там в Винде питон либы хранит.
    Однако из вашего описания все же не ясно достаточно ли будет этих мер. Понятнее будет если покажете программу.
    Ну и фрилансер ваш схалтурил, похоже. Ни деплой не автоматизировал ни документацию не написал?
    Ответ написан
    Комментировать
  • Выбрать строки с отсутствующим полем (значением NULL)?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Пишу на "ощупь", поскольку бд под рукой нет, но будет как-то так:
    SELECT
        keys.name, t.meta_value
    FROM
        (
            SELECT DISTINCT meta_key AS name
            FROM wp_postmeta
        ) AS keys
        LEFT JOIN wp_postmeta AS t ON t.meta_key = keys.name AND t.post_id = :id
    Ответ написан
    Комментировать
  • Как сгруппировать списки по двум элементам?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    UPD: Поправил чуть способ со счетчиком:
    In [1]: list_in = [['Игрушки', 'Мяч надувной', '300', '1'], ['Игрушки', 'Бионикл', '8000', '1'], ['Ткань', 'Вельвет', '1000', '2'], ['Ткань', 'Джинса', '500', '2'], ['Игрушки', 'Бионикл', '1000', '2']]
    
    In [2]: from collections import Counter
    
    In [3]: c = Counter(); list(map(c.update, ({(cat, stor): int(price)} for cat, name, price, stor in list_in)))
    Out[3]: [None, None, None, None, None]
    
    In [4]: c
    Out[4]: Counter({('Игрушки', '1'): 8300, ('Игрушки', '2'): 1000, ('Ткань', '2'): 1500})
    
    In [5]: [[*k, v] for k, v in c.items()]
    Out[5]: [['Игрушки', '1', 8300], ['Ткань', '2', 1500], ['Игрушки', '2', 1000]]


    Но иногда нужно не просто считать, а что-то еще более сложное делать после группировки, тогда больше подойдёт вот такой вариант:
    In [11]: from itertools import groupby                                                              
    
    In [12]: [[*k, sum(int(rr[2]) for rr in v)] for k, v in groupby(list_in, lambda r: (r[0], r[-1]))]
    Out[12]: [['Игрушки', '1', 8300], ['Ткань', '2', 1500], ['Игрушки', '2', 1000]]

    Тут синтаксис третьего питона. Для второго придётся чуть поменять со звёздочкой.
    Ответ написан
    Комментировать
  • Как исправить эту ошибку?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Это не ошибка, это предупреждение.
    Если оно вам мешает, например, засоряет stderr, то вы можете подавить предупреждения все или конкретные.
    Вот есть об этом вопрос.
    Ответ написан
    Комментировать
  • Как получить оба элемента?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Уберите "{'name': 'PHPSESSID'}"
    find_all у вас выдаст список, обойдите его циклом и достаньте value у каждого
    Ответ написан
    2 комментария
  • Почему logging.log.warning не отдает управление вниз по стеку вызовов?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы к экстрасенсам обратились или к кому?
    Почему logging.log.warning не отдает управление вниз по стеку вызовов?

    Что такое у вас тут logging? Это стандартная питоновская библиотека? Так в ней log - это функция и у неё нет атрибута warning. Тот факт, что вы не привели трейс-бэка и ничего не сказали, по поводу падения на упоминании необъявленного condition наверно, вы лишь процитировали кусочек кода и где-то выше импортируется или создаётся logging, объявляется глобально condition... и вот это вот всё.
    ОК, я всегда допускаю и предполагаю, что автор вопроса РАЗУМНЫЙ ЧЕЛОВЕК И ПОСТУПАЕТ РАЗУМНО.
    Что я могу из этого понять?
    Наверно logging.log у автора никакого отношения к стандартном логгингу не имеет (или автор упрощая пример наговнякал херни).
    Наверно автор умышленно поставил return (как он мог его не заметить?) или автор просто в первый раз видит питон и... блин... не знаю.

    ЧТО ТУТ ПРОИСХОДИТ?

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

    Автор, просто приведите код, который работает не так, как вы ожидаете. ПОЛНОСТЬЮ. В том виде в котором он у вас работает не так как вы ожидаете. Тогда я подскажу где вы неправильно ожидаете.
    Ответ написан
    Комментировать
  • Какие технологии использовать для пересылки данных клиент - сервер - клиент?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Если вы хотите замутить что-то вроде многопользовательского редактора, как в docs.google.com, то пересылать вам надо не куски кода, а события вида:
    • перемещение курсора
    • вставка текста в позицию
    • выделение блока
    • удаление блока

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

    Как вам уже предложили, имеет смысл использовать WebSocket для этой задачи, но технически вам ничто не мешает использовать и WebRTC. Второй вариант сильно сложнее, зато потенциально быстрее, работает в пиринговом режиме, не загружает сервер.
    Сам факт вашего вопроса подсказывает мне, что правильно реализовать все это у вас не хватит опыта.
    Попробуйте упростить требования и начните с того, что умеете. Аякс умеете -- делайте с ним. всё равно десять раз перепишете в процессе получения опыта и пересмотра архитектуры. Зато у вас уже будет MVP и понимание хотите ли вы вообще этим заниматься и потянете ли.
    Ответ написан
    Комментировать
  • Какой алгоритм использовать для поиск одной из 200к+ подстроки в строке?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    BadThings, вот что могу вам предложить:
    • Разбивайте ваши строки на отдельные "слова"-претенденты для поиска. Слова ищите по отдельности в таблице.
    • Номера в таблице "нормализуйте" (не в реляционном смысле, а в смысле uppercase, удаление неоднозначных разделителей).
    • Таблицу проиндексируйте.
    • Сформулируйте стоп-критерии для слов, например по длине, наличию каких-то нехарактерных для номера символов. Для этого можно посчитать статистику по БД (min, max, set of char и т.д.).
    • Морфируйте искомые слова, например, в слове "123-0X" не ясно цифра "ноль" или буква "O" какого-то алфавита, "Икс" или кириллическая буква "Хер". Придётся строить сочетания неоднозначностей и искать их все. Но это не проблема.
    • Заведите в памяти кэш, ограниченный размером. В кэше нужно держать только слова с максимальными частотами поиска по базе. Этот кэш можно сделать персистентным и загружать в память перед поиском. Основной расчет на то, что кэшироваться будут часто встречающиеся слова, которых нет в БД.

    Таким образом из строки
    Накопитель SSD Samsung SATA III 500Gb MZ-76E500BW 860 EVO 2.5"

    "SSD", "SATA", "III", "500GB", "860", "EVO", "2.5" - не пройдут в поиск по ограничению минимальной длинны;
    "Накопитель", "Samsung" - попадут в кэш с информацией о том, что их нет в БД.
    Остальные слова, которых уже будет не так много, будут морфироваться и с логарифмической сложностью искаться в БД.
    Думаю всё будет работать просто мгновенно. В любом случае локальным персистентным кэшем несуществующих в БД слов можно закидать любые тормоза в контексте вашей задачи.
    Ответ написан
    Комментировать
  • Поможете найти ошибку в создании бота телеграм?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы не тот telebot поставили. Там в pypi какой-то адище творится с одноимёнными модулями.
    Убедитесь, что ставится нужная библиотека:
    > pip show telebot                                                        
    Name: telebot
    Version: 0.0.3
    Summary: A Telegram bot library, with simple route decorators.
    Home-page: https://github.com/KyleJamesWalker/telebot
    Author: Kyle James Walker
    Author-email: KyleJamesWalker@gmail.com
    License: MIT
    Location: /home/svp/.local/lib/python3.6/site-packages
    Requires: requests
    Required-by: 
    Note: you may need to restart the kernel to use updated packages.

    Попробуйте ставить так:
    pip install git+https://github.com/KyleJamesWalker/telebot

    Или где-то лежит такой файл telebot.py и импортируется локально.
    Ответ написан
    Комментировать
  • Есть ли смысл делать свой движок?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вопрос неоднозначный.
    Судя по этому вопросу и вашему прогрессу, никакой коммерческой выгоды из этой работы вы не получите, поскольку формулировка выглядит наивной даже в свете столь скудных сведений, что вы предоставили.
    Однако все мы в начале пути писали свои движки. Если вы нашли в этом свой интерес и этот интерес побуждает вас программировать, самосовершенствоваться, учиться новому, то любая такая деятельность только на пользу.
    Не питайте, однако, особых иллюзий по этому поводу.
    Ответ написан
    Комментировать
  • Как отвечать в чатах от имени telegram бота?

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

    Вы обмолвились, что хотите, чтобы все менеджеры имели доступ к диалогам других менеджеров с пользователями.
    Это проблема, у которой нет 100% элегантного решения. Тут вам бы следовало подетальнее расписать ТЗ, но пока его нет я опишу лишь несколько возможностей.

    Бот может цитировать все диалоги в общий канал или группу, чтобы там была возможность их просмотра всеми менеджерами. Отвечать также можно прямо в группу с цитированием того, кому предназначается ответ. Бот увидев такое сообщение перешлёт его в своём личном диалоге с пользователем. Процитированные реплики пользователя можно тегировать для фильтрации диалога с конкретным пользователем.

    Можно хранить все переговоры бота с юзерами в БД и показывать их менеджерам в их личных диалогах с ботом по специальной команде. Можно сделать команду, переключающую бота в режим прямого проксирования реплик менеджера в личную беседу бота с конкретным пользователем.

    Тут много вариантов. Детализируйте ТЗ.

    Чтобы вы понимали, в общем простом случае бот - это виртуальный пользователь, на события вокруг которого реагирует программа. Бот может быть добавлен в группу или личный чат с человеком.

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

    Программа, управляющая ботом, имеет возможность хранить своё состояние в БД или памяти. Так она может "знать" о всех диалогах.

    Программа, получая информацию о событиях вокруг бота, "видит" идентификаторы чатов и пользователей, с которыми связаны эти события. Может по-разному реагировать на сообщения в разных чатах и от разных людей.

    В сложном случае можно сделать, чтобы не одна а несколько инстансов прорграммы работало от имени одного бота. Тогда придётся подключать их к общей БД, чтобы они (инстансы) могли синхронизировать своё состояние при необходимости.

    Одна программа может управлять сразу несколькими ботами. Это значит, что боты как бы могут "знать" информацию и состояния друг-друга. Тут можно как угодно запрограммировать.
    Ответ написан
    Комментировать