• Как ввести лист в ячейку 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
    Вообще, читай про списки, читай! Их надо понимать, иначе далеко не уедешь.
    Ответ написан
    Комментировать
  • Как в модуле из класса импортировать метод PYTHON?

    Vindicar
    @Vindicar
    RTFM!
    В твоей формулировке - никак.
    По-хорошему, методы класса должны работать с данными класса, и в таком случае нужно импортировать весь класс целиком.
    В твоём случае этот класс не имеет смысла, его "метод" должен быть свободно стоящей функцией.

    # файл a.py
    def putin():
        c = 'punctuati'
        c = c * 2
        print(c)
    
    # файл b.py
    from a import putin
    putin()
    Ответ написан
    Комментировать
  • Как декодировать строку из переменной?

    Vindicar
    @Vindicar
    RTFM!
    encoding=eng лишнее. У тебя код закодировал строку в utf-8 при создании объекта bytes(), так что она оказалась уже дважды закодирована.

    Но так как этот параметр обязателен, то можно схитрить.
    strange_string = '"message":"\xd0\x9f\xd0\xbb\xd0\xb0\xd1\x82\xd0\xb5\xd0\xb6 \xd0\xbd\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb7\xd0\xbc\xd0\xbe\xd0\xb6\xd0\xb5\xd0\xbd"'
    bstring = bytes(ord(c) for c in strange_string)  # конструируем строку байт побайтово, из кодов символов в строке
    result = bstring.decode('utf-8')
    print(result)
    Ответ написан
    2 комментария
  • Прозрачный цвет цветовых пикселей. как сделать?

    Vindicar
    @Vindicar
    RTFM!
    cv2_inwrite(/content/2 (1).jpeg, im)
    Во-первых, куда кавычки подевал?
    Во-вторых, jpeg не поддерживает прозрачность.
    В-третьих, обычное изображение - это массив вида (H, W, 3), где W и H - ширина и высота в пикселях, а 3 - каналы RGB.
    Тебе нужно создать изображение вида (H, W, 4), скопировать в него твоё изображение в первые три канала, затем заполнить последний канал значениями прозрачности (255 для совсем непрозрачных, 0 для совсем прозрачных).
    Так как cv2 хранит писксели в массиве numpy, читай туториалы по работе с массивами numpy, чтобы понять, как это сделать.
    Затем сохрани изображение в формате, поддерживающем прозрачность, например в PNG.
    Ответ написан
    4 комментария
  • ООП сработало не правильно?

    Vindicar
    @Vindicar
    RTFM!
    Ты в питон из какого языка пришёл? =)
    class Test:
      a: list = []

    Ты объявил атрибут класса, а не экземпляра класса.
    Так как у экземпляра класса нет атрибута a, питон ищет этот атрибут в самом классе - и находит.
    У тебя в примере и Test.a тоже даст [3].

    Атрибут экземпляра класса в питоне объявляется вот так:
    class Test:
        def __init__(self):  # конструктор
            self.a: list = []

    Тут у каждого экземпляра будет своя копия списка.
    Ответ написан
    9 комментариев
  • Как мне отфильтровать csv файл по датам?

    Vindicar
    @Vindicar
    RTFM!
    Xion, ну дай угадаю, перебирал с начала списка?
    Пусть у нас есть список букв:a b b a b a a ....
    Мы хотим убрать из него буквы b, и перебираем его с начала.
    Текущая буква A: A b b a b a a ....
    Ничего не делаем.
    Переходим к следующей.
    Текущая буква B: a B b a b a a ....
    Удаляем, следующие элементы смещаются на позицию: a B a b a a ....
    Переходим к следующей: a b A b a a ....
    Как видишь, следующую букву b мы из-за этого пропустили.

    Отсюда настоятельная рекомендация: избегай модифицировать коллекцию в процессе перебора! Лучше (реально лучше в случае с файлами) - генерируй по ходу перебора новую коллекцию, куда попадают только "хорошие" элементы. Вместо того, чтобы пытаться удалять "плохие" из уже существующей.

    Если создавать копию данных очень нежелательно, перебирай от конца к началу - тогда сместятся только те элементы, которые мы УЖЕ обработали, и потому это не помешает. Но с файлами это делать очень неудобно.
    Ответ написан
  • Как изменить клавиатуру на другую?

    Vindicar
    @Vindicar
    RTFM!
    Клавиатура обычно прикреплена к сообщению. Для её смены проще всего отправить поясняющее сообщение с новой клавиатурой.
    Ответ написан
    Комментировать
  • Как проверить количество цифер после точки во float в Python?

    Vindicar
    @Vindicar
    RTFM!
    Число цифр - штука коварная. Вот беру я Питон и вбиваю:
    >>> 0.1 + 0.2
    0.30000000000000004

    Сколько цифр должен вывести код?
    Ответ написан
    Комментировать
  • Насколько такой метод проверки является корректным и как его можно сократить?

    Vindicar
    @Vindicar
    RTFM!
    1. Не надо проверять в рантайме type(m) == int. Достаточно указать в заголовке функции
    def add_time(self, h: int = 0, m: int = 0, d: int = 0, dw: int = 0, mh: int = 0, y: int = 0):

    Этого будет достаточно, чтобы IDE/статический анализатор сказал программисту "эй, ты фигню передаёшь в этот метод". Да, это не будет контролироваться во время выполнения, но тут уже другой вопрос: если клиент-программист сделал класс, неотличимый от int, стоит ему позволить этот класс передать вместо int. Ответственность будет на нём.

    2. Ну для конкретно твоей проверки по значению можно просто:
    if any(v < 0 for v in [h,m,d,dw,mh,y]):
        raise ValueError()

    Если хочешь красиво, можно и выпендриться:
    args = {'h':h, 'm':m, 'd':d, 'dw':dw, 'mh':mh, 'y':y}
    bad = list(filter(lambda k: args[k] < 0, args.keys()))
    if bad:
        raise ValueError('Invalid values for: ' + ','.join(bad))


    Ну а при большом желании можно и целый велосипед для декларативной проверки параметров замутить.
    Но смысл?
    import functools
    import inspect
    
    # пусть чек-функция имеет вид (value) -> bool, и возвращает True для "хороших" значений. Пример:
    def not_whitespace(s: str) -> bool:
        'String must not contain only whitespace'  # док строка будет использоваться в сообщении об ошибке
        return bool(s.strip())  # проверяем что строка не состоит из одних пробелов.
    # чек-функции можно генерировать и на ходу:
    def in_range(low, high):
        def check(value):
            return (low is None or low <= value) and (high is None or value <= high)
        check.__doc__ = f'Value must be between {low} and {high}.'
        return check
    # теперь сделаем декоратор, который умеет принимать чек-функции и применять их перед вызовом цели
    def check(**checks):
        def wrapper(func):
            sign = inspect.signature(func)
            names = list(sign.parameters.keys())  # имена параметров по порядку
            not_found = set(checks.keys()) - set(names)  # все ли чеки ссылаются на известные параметры?
            if not_found:
                # у нас есть чек на неизвестный параметр!
                raise NameError(', '.join(not_found))
            # всё ок, делаем обёртку над функцией
            
            @functools.wraps(func)
            def wrapped(*args, **kwargs):
                bad = []
                for param_name, check_func in checks.items():
                    idx = names.index(param_name)
                    if idx < len(args):
                        # параметр был передан через args
                        value = args[idx]
                        if not check_func(value):  # вызываем чек-функцию
                            err = getattr(check_func, '__doc__', '')
                            if err:
                                bad.append(f'{param_name} ({err})')
                            else:
                                bad.append(param_name)
                    else:
                        pass  # могут быть хитрости с kwargs-only параметрами. Тут уж извини, мне влом писать.
                if bad:  # нашли ошибки?
                    raise ValueError('Bad value for parameters: '+', '.join(bad))
                    # тут ещё можно помудрить над скрытием последнего фрейма в traceback, но мне опять влом
                else:  # не нашли, вызываем функцию
                    return func(*args, **kwargs)
            
            return wrapped
        return wrapper
    
    # пример использования
    # строка должна быть не из одних пробелов
    # число должно быть в пределах от 1 до 10 включительно
    @check(s=not_whitespace, n=in_range(1, 10))
    def repeat(s: str, n: int) -> str:
        return s * n
    
    print(repeat('test ', 3))
    
    try:
        print(repeat('test ', 20))
    except ValueError as err:
        print('yep! it failed!', err)
    
    try:
        print(repeat('test ', -1))
    except ValueError as err:
        print('yep! it failed!', err)
    
    try:
        print(repeat('    ', 5))
    except ValueError as err:
        print('yep! it failed!', err)
    
    try:
        print(repeat('    ', 15))
    except ValueError as err:
        print('yep! it failed!', err)
    Ответ написан
    3 комментария
  • Как получить все 3 канала изображения?

    Vindicar
    @Vindicar
    RTFM!
    По умолчанию каналы изображения в opencv идут в порядке blue, green, red.
    Так что 0 - это blue, ну и так далее.
    Ответ написан
  • Бот перестаёт отвечать после возврата в главное меню, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    button1 = types.KeyboardButton(" Поздороваться")
    button2 = types.KeyboardButton("❓ Задать вопрос")

    Сравни это с реализацией команды /start. У тебя тут посторонние пробелы, а сравнение строк требует ТОЧНОГО совпадения. В твоём коде - вплоть до регистра букв.
    Ответ написан
    Комментировать
  • Как корректно выводить таблицу в телеграм?

    Vindicar
    @Vindicar
    RTFM!
    tabulate рассчитана на использование моноширинного шрифта, как в терминале. С таким шрифтом можно подравнивать строки пробелами из расчёт 1 пробел на символ.
    Клиенты телеги, как и 99% приложений, используют по умолчанию пропорциональный шрифт. Там такой фокус не проходит.
    1920px-Propvsmono.svg.png
    Попробуй завернуть выводимую таблицу в ```три бэктика```, это markdown для использования моноширинного шрифта.
    Ответ написан
    Комментировать
  • Как понять работу следующего кода по перегрузке операторов?

    Vindicar
    @Vindicar
    RTFM!
    Потому что питон пытается "извернуться", если описаны не все операторы.
    Если выполняется a < b, но не описан оператор a.__lt__(), питон попробует вызвать b.__gt__().
    Аналогично, если не описан __ne__() а только __eq__(), и выполняется a != b, питон сделает not (a == b)
    Кое что есть тут
    Также советую глянуть в сторону functools.total_ordering.
    Ответ написан
    3 комментария
  • В чем ошибка у discord.py и socket?

    Vindicar
    @Vindicar
    RTFM!
    Лови исключения. И привыкай к мысли что любая сетевая операция (да что там, любой ввод-вывод) может завершиться с ошибкой.

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

    Vindicar
    @Vindicar
    RTFM!
    Для обучения основам составления алгоритмов сойдёт. Больше, считай, ни для чего.
    Ответ написан
    Комментировать
  • Как сделать что б while работал пока может?

    Vindicar
    @Vindicar
    RTFM!
    Выяснить, почему он зацикливается, и исправить.
    Обходные варианты существуют, но они привносят куда больше проблем, чем решают.
    Ответ написан
    Комментировать