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

    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 и понимание хотите ли вы вообще этим заниматься и потянете ли.
    Ответ написан
    Комментировать
  • Поможете найти ошибку в создании бота телеграм?

    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
    Программист, энтузиаст
    Вопрос неоднозначный.
    Судя по этому вопросу и вашему прогрессу, никакой коммерческой выгоды из этой работы вы не получите, поскольку формулировка выглядит наивной даже в свете столь скудных сведений, что вы предоставили.
    Однако все мы в начале пути писали свои движки. Если вы нашли в этом свой интерес и этот интерес побуждает вас программировать, самосовершенствоваться, учиться новому, то любая такая деятельность только на пользу.
    Не питайте, однако, особых иллюзий по этому поводу.
    Ответ написан
    Комментировать
  • Локальная клиент-серверная программа на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Прочитайте что такое REST API и прекратите использовать дендрофекальный метод проектирования. Нужно правильно выбирать технологии под задачу.
    Вы бы ещё свою шину данных под вашу ERP разработать попробовали. А что, подключаешься к GPIO на материнке и голыми битами по проводам, с контрольными суммами... Вам еще не кажется TCP избыточным? Может UDP? Вон кто-то выше Web RTC для ERP посоветовал. Давайте ещё как следует поелозим вдоль OSI.
    Ответ написан
  • Как выбрать рандомного пользователя из беседы ВКонтакте?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А что у вас не получается-то? Ни разу не трогал VK API, но вот же у них в документации всё про этот метод ваш: https://vk.com/dev/messages.getConversationMembers
    И в результате он пользователей вам вернёт. Выбирайте случайного и пользуйтесь.
    random.choice(users.items)
    Вот и будет вам случайный из них.

    Такое ощущение, что народ просто натыкается в какой-нибудь мурзилке для хацкеров на тривиальный пример кода VK-бота, у этих хацкеров мгновенно загорается над головой лампочка и начинает жечь. Так жжот, что ни документацию читать ни гуглить не хочется, а хочется сразу запрограммировать идею. После двухнедельных мытарств в поисках ответа на ютубе, в инстаграмме и твиттере методом скролла хакерских тредов с котиками кто-то подсказывает юному гению про этот чудесный ресурс, где всем бесплатно всё делают.
    Вот и рождаются такие вопросы "Я ХЗ что-то я вот тут вот написал" (списал) "но не работает, что делатькакбытьпамагите!, чтотасламалося". И ни ошибки, ни сути проблемы, ничего не ясно. Ясно только что автор вопроса скорее всего не вдупляет совершенно НИЧЕГО, и ему придётся рассказывать про арифметику, про то как сложение делать, что такое цифры и какие бывают буквы, чтобы он что-то понял. Ну или чудом угадать что ему, всё таки, надо и написать работающий код, чтоб отстал и ушел.
    Ответ написан
    3 комментария
  • Как сделать dict из list?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    key = ['a', 'b', 'c']
    # есть три list данных:
    data = [
        [1],
        [4,5],
        [2, 6, 8],
    ]
    print(dict(zip(key, data)))
    #{'a': [1], 'b': [4,5], 'c': [2,6,8]}
    Ответ написан
    1 комментарий
  • Как привязать прогресс бар к проверки файлов на диске os.walk()?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ну вот объясните, или это тут надо отдельным вопросом задавать?
    Почему я нашел готовое разжеванное решение прямо по формулировке вашего вопроса в гугле в виде ссылки на отличную подробную статью?
    https://habr.com/ru/post/81532/
    Почему я нашел, а вы нет?
    Ответ написан
    Комментировать
  • Как решить задачу?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В питоне строки - это объекты и у этих объектов есть встроенные функции (называются они "методы").
    Так вот, у строки есть такие методы:
    > '1234567'.isdigit()
    True
    > '123.45.67'.isdigit()
    False
    > '1234567'.isalpha()
    False
    > 'Smith'.isalpha()
    True

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

    Вообще сейчас выскажу довольно "капитанскую" мысль, но такие задания обычно не дают без предварительной информации как их делать. Вы видимо пренебрегли теоретической частью. То, как вы пытаетесь решить эту задачу, даже если вам удастся это, будет неправильным решением. Слышали выражение "ректальная тонзилитомия"? Могу ошибаться, но кажется это когда гланды удаляют через задницу. Вот даже если это бы удалось, делать так неправильно, а вы в своём коде именно этим, фигурально выражаясь, и занимаетесь.
    Я понимаю, что вы хотели здесь получить готовое решение с пояснениями, но это не добавит вам знания и не заменит тот теоретический курс, на который вы, видимо, забили.
    Ответ написан
    7 комментариев
  • Как вывести спираль из звездочек с разделителем на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    n = 16
    
    c = {True: '*', False: ' '}
    r = list(range(n//2))
    for sy in (1, -1):
        for y in r[::sy]:
            s = []
            for sx in (1, -1):
                for x in r[::sx]:
                    d = -2 if (sx, sy) == (-1, 1) else 0
                    s.append(c[x >= y+d and not y % 2 or x < y+d and not x % 2])
    
    
            print(''.join(s))

    Вот пример для четного N.
    Ответ написан
    Комментировать
  • Что посоветуете для изучения Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Странно, что имея опыт разработки на других языках вы задаёте такой вопрос.
    Если вам обязательно нужна книга, то, вот, прочитайте Луца по диагонали.
    Структуры приложений разные для разных применений, но в целом структуру пакета определяет setuptools. Это встроенный инструментарий работы с пакетами.
    Оптимальные структуры имеет смысл искать на гитхабе по ключевым словам "project template" и "cookiecutter".
    "Тиражирование" модулей через https://pypi.org/.
    Для тестирования есть несколько встроенных альтернатив и миллион сторонних. Выбирайте любую. Для начала не важно.
    Как вы знаете для Java есть много всего типа maven, а для python есть что-то подобное? Или, так как язык не компилируемый, для него такого не нужно?

    Все ваши потребности на первых порах слихвой покроют setuptools, pip, и github пайплайны.
    На вашем уровне, наверно, рано лезть глубже. Придёт со временем.

    Из IDE: Pycharm (вполне достаточно бесплатной Community Edition) и Visual Studio Code.
    Ответ написан
    Комментировать
  • Как указать путь к каталогам за пределами каталога в котором нахожусь?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Путь может быть абсолютным или относительным. Различать их просто: абсолютный путь начинается с '/', а относительный нет.
    Есть специальный виртуальные каталоги везде в файловой системе: ".." - он означает каталог верхнего уровня относительно текущего; '.' - текущий каталог.
    './media/user/Server/data/users/'+DirName+'/posts' - это у вас относительный путь. Он указан относительно текущего.
    Если у вас media лежит в '/root/subroot/media...', то
    Абсолютный путь у вас будет: /root/subroot/media/user/Server/data/users/
    Ответ написан
    6 комментариев
  • В чем суть декораторов?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В питоне функции и классы - это тоже объекты. У них есть особый синтаксис объявления, после объявления эти объекты доступны по имени как и любой другой объект с именем (переменная).

    Лирическое отступление. В питоне переменные работают не так же как в Си. В Си переменная - это ящичек, а значение в нём как бы лежит. В питоне объект - это как чайный пакетик, а имя как ярлычок на ниточке. Можно к одному пакетику несколько ярлычков привязать, то есть несколько имён. В Си это достигается указателями. В питоне, получается, всё "как бы указатели" и разыменовываются они неявно, под капотом. Но сейчас не о том...

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

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

    Итак:
    my_object_instance = MyClass()
    my_object_instance = my_decorator1(my_object_instance)
    my_object_instance2 = my_decorator2(my_object_instance)

    В этом примере дважды задекорирован объект. Здесь при первом декорировании оригинал нам, судя по коду, не нужен (или декоратор его не менял, смотря что за декоратор, может просто зарегал где-то в списке...), а при втором декорировании нам остаётся доступным и оригинал и задекорированная версия.

    Пока всё просто и не ясно причем тут собаки и чем эти декораторы отличаются от обычных функций. На второй вопрос ответ прост -- ничем особенным. Просто мы такой смысл вкладываем в эти функции. Такая абстрактная концепция.

    В Питоне есть синтаксический сахар, чтобы декорировать объявления функций и классов.

    Иногда хочется наглядно модифицировать или зарегистрировать в каком-то глобальном реестре класс или функцию, но объявление при этом сильно менять не хочется.
    Можно так:
    my_pretty_functions = {}
    
    def my_deco(decorated_function):
        '''Это декоратор, который не меняет декорируемый объект, 
        лишь регистрирует его в словаре'''
        my_pretty_functions[decorated_function.__name__] = decorated_function
        return decorated_function
    
    def my_function(x):
        return x ** 2
    
    # вот декорирование вручную, без сахара
    my_function = my_deco(my_function)
    
    # Но в питоне же есть сахар для этого, и вот альтернативный вариант декорирования:
    @my_deco
    def my_other_function(x):
        return x ** 3

    Эти два способа декорирования работают одинаково, просто "собака" - это синтаксический сахар.

    Не все декораторы такие безобидные. Декоратор может вернуть совершенно другую функцию или вообще что угодно. Тогда это что угодно окажется под оригинальным именем функции, а оригинальная функция вовсе может быть потеряна (выброшена) или засунута в новую с помощью так называемого "замыкания".

    Но замыкания - это отдельная большая история, а узнать об этом вы сможете, к примеру, на занятиях по питону на otus.ru, где я скоро, надеюсь, стану преподавать=).

    Спрашивайте сто не понятно. Я тут не рассмотрел даже малой доли от разных способов применения декораторов в народном хозяйстве. Надо будет состряпать специальный курс про это.
    Ответ написан
    Комментировать
  • Как редактировать изображение без скачивания на пк?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    в коде, который запущен не на пк, а на хостинге

    Нет существенной разницы. У вас, разве что, может не быть прав записи в файловую систему, или отдельные её части.
    Но ничто не мешает загрузить изображение миниатюры по ссылке прямо в память не сохраняя его в файл. Тут же в памяти вы можете создать картинку черного квадрата, вставить туда миниатюру, вписать текст и не сохраняя отправить в http-запросе.
    Если у вас есть изображение в виде байтов, которые не загружены из файла, а загружены из интернета, то нет никакой разницы.
    Вы эти байты можете отдать конструктору картинки и получите объект-картинку со всеми вытекающими. Если ваша библиотека работы с картинками умеет загружать только из файла, то, ок, создайте на основе вашей строки байт объект: io.BytesIO:
    f = io.BytesIO(b"some initial binary data: \x00\x01")
    ff = open('file_contained_same_bytes', 'rb')

    f и ff по интерефейсу не будут различаться, вы можете загрузить картинку как из первого, так и из второго.
    Ответ написан
    Комментировать
  • Что использовать для получения TCP-пакетов в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот простой пример.
    Для описанных вами задач скорее всего не потребуется asyncio.
    Конечно, может быть ваше устройство шлёт данные с огромной скоростью и не каждая БД успеет их принимать, или данным в потоке нужна нетривиальная и трудоёмкая обработка, а может быть их требуется обогащать доп-запросами к другим API, тогда вам, может быть и пригодится асинхронная работа. Но, чтобы сделать окончательный вывод, нужно больше подробностей.
    Ответ написан
  • Как получить данные из GET запроса?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    r = requests.get('https://api.cas.chat/check?user_id=' + str(message.from_user.id))
    print(r.text)


    Если обратиться к тексту через квадратные скобки, то подразумевается в скобках индекс символа: 'qwerty'[3]=='r'
    TypeError: string indices must be integers
    Это означает что индекс должен быть целым числом, а не строкой 'ok'
    Ответ написан
    3 комментария
  • Как подключить скрипт PYTHON в Windows?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сэкономлю вам время.
    Судя по вашему вопросу (наивности и "полноты" его постановки, формулировкам), у вас ничего не получится как бы полно вам ни рассказали здесь о методах, которыми можно было бы достичь желаемого. Для вас это будет слишком сложно. Очень многому, слишком многому придется научиться, прежде чем задавать такой вопрос с надеждой что-то полезное сделать на базе ответов.
    Ответ написан
    Комментировать