Количество рабочих дней между двумя датами
У меня есть код:

start_day: datetime.datetime = datetime.datetime.strptime(
  "06.10.2023 16:10", "%d.%m.%Y %H:%M"
)
current_day: datetime.datetime = datetime.datetime.strptime(
  "09.10.2023 16:10", "%d.%m.%Y %H:%M"
)
days_without_defects: datetime.timedelta = current_day - start_day

Он выведет мне

3 days, 0:00:00

Хотя мы расчитывали разницу между пятницой и понедельником.
Я понимаю что можно прибегнуть к библиотеке numpy, а конкретно к методу np.busday_count но он не учитывает часы. Как мне решить данную проблему не используя никаких данных json касаемо праздничных дней и тд?

Считаю вашу концепцию подсчета рабочих дней не правильной, но задача интересная, предлагаю не оптимальное решение, проверять каждое приращение времени является ли этот момент субботой или воскресеньем, можно использовать приращение равное секунде, минуте или любому промежутку времени. Естественно государственные праздники какой-либо страны не могут быть учтены.
<code>
import datetime

def r_weekday(t_start, t_finish):
    if isinstance(t_start, datetime.datetime) and isinstance(t_finish, datetime.datetime):
        dt = t_finish - t_start           # общее время от начала до конца
        pp = datetime.timedelta(seconds=0)# Начальное значение приращения
        total_time = 0
        while pp < dt:                    # Пока сумма приращений меньше общего времени
            wd = (t_start + pp).weekday() # День недели в момент времени
            if wd <= 4:
                total_time += 1
            pp += datetime.timedelta(seconds=1) # Приращение в одну секунду
        return total_time
    else:
        return -1

def seconds_to_dhms(seconds): # перевод секунд в день час мин сек
    days = seconds // (3600 * 24)
    hours = (seconds // 3600) % 24
    minutes = (seconds // 60) % 60
    seconds = seconds % 60
    return days, hours, minutes, seconds

start_day: datetime.datetime = datetime.datetime.strptime(
    "06.10.2023 16:10", "%d.%m.%Y %H:%M"
)

current_day: datetime.datetime = datetime.datetime.strptime(
  "09.10.2023 16:10", "%d.%m.%Y %H:%M"
)
print(seconds_to_dhms(r_weekday(start_day, current_day)))
</code>


Как вернуть список без удаленного элемента?
Предположим, я получаю некий список и должен удалить из него заданный элемент:

lst = ['cat', 'dog', 'pig', 'bird', 'bear']

def func(lst, what_to_remove):
    pass

Я хочу, чтобы функция состояла из одной строки и пытаюсь сделать так:

lst = ['cat', 'dog', 'pig', 'bird', 'bear']

def func(lst, what_to_remove):
    return lst.remove(what_to_remove)

print(func(lst, 'bird'))

И, естественно, ничего не получается (потому что
remove() ничего не возвращает):
Возможно ли удалить элемент из списка и вернуть этот список одной строкой?

Если вы так хотите обернуть
remove в функцию, задавая в качестве параметров список и параметр который вы хотите удалять, исполняйте в функции сначала
remove и потом уже возвращайте список

lst = ['cat', 'dog', 'pig', 'bird', 'bear']

def func(lst, what_to_remove):
    lst.remove(what_to_remove)
    return lst

print(func(lst,'bird'))

Вывод:

['cat', 'dog', 'pig', 'bear']

UPD
А если хотите одной строчкой в функции, то лучше пересоздайте лист без этого элемента

lst = ['cat', 'dog', 'pig', 'bird', 'bear']

def func(lst, what_to_remove):
    return [item for item in lst if item != what_to_remove]

print(func(lst,'bird'))

UPD2
Можно вот так

import copy

lst = ['cat', 'dog', 'pig', 'bird', 'bear']

def func(lst, what_to_remove):
    return lst.remove(what_to_remove) or copy.copy(lst)

print(func(lst,'bird'))

UPD3
И вот так тоже можно

lst = ['cat', 'dog', 'pig', 'bird', 'bear']

def func(lst, what_to_remove):
    return (lst.remove(what_to_remove),lst)[1]

print(func(lst,'bird'))

Пояснение:
Последние два метода работают на основе того, что мы сначала используем
remove, а уже потом стараемся вернуть наш
lst

UPD4
По аналогии можно и так:

lst = ['cat', 'dog', 'pig', 'bird', 'bear']

def func(lst, what_to_remove):
    return lst.remove(what_to_remove) or lst

print(func(lst,'bird'))


Ошибка JSONDecodeError при добавлении значения в json файл
Есть json файл:

{
    "one": [
        "one one",
        "one two",
        "one three"
    ],
    "two": [
        "two one",
        "two two",
        "two three"
    ],
    "three": [
        "three one",
        "three two",
        "three three"
    ]
}

В который нужно добавить ключ с пустым списком, для этого был написан код:

# !/usr/bin/python
# -*- coding: utf-8 -*-

import json

with open("test.json", 'a+', encoding="UTF-8") as f:
    bd = json.load(f)

    bd_add = {"four": []}
    bd.update(bd_add)

Но мне выдает ошибку:

JSONDecodeError('Expecting value: line 1 column 1 (char 0)')

Насколько я понимаю, эта ошибка возникает при чтении файла json, возможно ему что-то не нравится в самом json, но я не понимаю что.
Как мне добавить ключ с пустым списком в файл json?

import json

with open("n.json", 'r', encoding="utf8") as f:
    bd = json.load(f)  # Чтение данных из, открытого на чтение, файла

bd_add = {"four": []}  # Формирование нового элемента
bd.update(bd_add)      # Добавление записи json

with open("n.json", 'w', encoding="utf8") as f:
    json.dump(bd, f)   # Запись данных в файл, открытый на запись


regex для имён файлов с пробелами
Всем привет.
Есть такие строки:

db extraversion.csv db index.html

Я хочу их сделать в список таким образом:

["db extraversion.csv", "db index.html"]

то есть количество пробелов не ограничено.
Я попробовал через regex так:

r"\\..+\s"

Но он находит неправильно:

.csv db

Каким regex необходимо пользоваться, чтобы получить имена списком, указанным выше (будет 2 имени файла в любом случае) или может есть ещё какой способ?
Строку не поменять, т.е. пробелы там будут в любом случае.

Думаю не совсем правильное решение, но возможно под вашу задачу сможете оптимизировать:

import re

str = "db extraversion.csv db index.html"
res = re.findall(r'(.*?\.[A-Za-z]{3,4})(?:\s|$)', str)
print(res)
>>> ['db extraversion.csv', 'db index.html']

Регулярное выражение:

( - начало захватываемой группы

.*? - ноль и более любых символов с ленивым квантификатором

\.[A-Za-z]{3,4} - точка после которой идет 3 или 4 символа латинского алфавита

) - конец захватываемой группы

(?:\s|$) - любой пробельный символ после расширения или конец строки

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


Как в Python сгенерировать многозначное число, чтобы цифры в нем не повторялись? [дубликат]

На этот вопрос уже даны ответы здесь:

Как сгенерировать четырехзначное число без повторов цифр?

                                (2 ответа)

Закрыт 1 месяц назад.

Нужно, чтобы программа генерировала четырехзначное число, в котором цифры не будут повторяться. Как это можно реализовать?

import itertools
print(*list(map(lambda x:''.join(map(str,x)),itertools.permutations([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 4))))

import itertools
print(*(list(filter(lambda y:y if y[0] != '0' else '', map (lambda x:''.join(map(str,x)),itertools.permutations([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 4))))))

Можно нули подфильтровать.


Типизация и неприсвоенное значение
Как обозначить тип переменной, которая может быть не присвоена?
Нужно выполнить ack последней cmd посланной в yield.

import asyncio

class Cmd1():
    value = 1

q = asyncio.Queue()
q.put_nowait(Cmd1())
q.put_nowait(Cmd1())

def ack(cmd):
    print(cmd)

async def gena():
    cmd = None
    try:
        while True:
           cmd = await q.get()
           print(cmd)
           yield cmd.value
    finally:
        if cmd :
            ack(cmd)

async def main():
    async for cmd in gena():
        break

asyncio.run(main())

Если сделать так
cmd: Cmd1|None = None то подчеркивает красным
cmd.value. Если
cmd: Cmd1 то не могу присвоить None.

"value" is not a known member of "None" Pylance report OptionalMemberAccess

Как обозначить тип cmd, чтоб тест проходило и не усложнять при этом рантайм?
Или как переписать эту конструкцию?
На данный момент так:

async def gena():
    cmd = None # type: ignore
    try:
        while True:
           cmd : Cmd1 = await q.get()
           print(cmd)
           yield cmd.value
    finally:
        if cmd :
            ack(cmd)

Чтобы не ругалось на переопределение cmd можно так
<code>
async def gena():
    result_cmd: Cmd1 | None = None
    try:
        while True:
           cmd: Cmd1 = await q.get()
           result_cmd = cmd
           print(result_cmd)
           yield result_cmd.value
    finally:
        if result_cmd :
            ack(result_cmd)
</code>


Как сложить два числа из строки?
У меня есть переменная, где хранится строка

number = "2+2"
Как сделать так, чтобы python сложил эти 2 числа?

Вероятно, так:

number = eval(number)

Функция eval() преобразует и вычисляет переданные ей в виде строки выражения.
Вообще, использование функций
eval() и
exec() чревато ошибками и проблемами безопасности. Подробнее здесь.


Как обновить все пакеты сразу с помощью pip?
Какой командой мне воспользоваться, чтобы с помощью
pip обновить все пакеты сразу? Есть ли такая команда вообще? Если есть, зависит ли она от используемой ОС?
P.S. Не надо молча давать мне ссылки на какие-то другие сайты. Я и сам умею пользоваться гуглом. Мне нужен четкий ответ на поставленный вопрос.

Команда
pip freeze выводит все установленные библиотеки в формате

lib1==0.1.0
lib2==3.2.1
...

А команде
pip install можно передавать файл как раз в таком формате, соответственно:

pip freeze > requirements.txt
pip install -r requirements.txt -U

(эти команды работает на любой системе)
Вот так можно сделать на Linux:

pip freeze > requirements.txt && pip install -r requirements.txt -U


Как убрать пробелы в списке
У меня есть список
<code>
word = ['    ', 'hello', '  ']
</code>
Как удалить пустые строки из списка?
Делаю на пайтоне

Используйте функцию
strip для каждого из элементов.

word = [' ', 'hello', ' ']
word = [w for w in word if w.strip()]
print(word)


Как вытащить подстроку из строки? [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 24 дня назад.

                        Улучшить вопрос

У меня есть строка:
<code>
text = "Пельмени 'шашлык' деньги"
</code>
Как из этой строки вытащить слово шашлык и поместить её в отдельную переменную?

Как вариант - можно разделить текст по словам

text = "Пельмени 'шашлык' деньги"
word = text.split()[1]  # Разделение строки на слова и обращение по индексу
print(word)

Вывод:

'шашлык'


Ошибка при проверке времени в базе данных
Ошибка:
`    if not last_command_use_time or (datetime.datetime.now() - last_command_use_time).hour > 1:
TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'str'`
Код:
<code>
import telebot
import sqlite3
import datetime

bot = telebot.TeleBot(token)

conn = sqlite3.connect('database.db', check_same_thread=False)
cur = conn.cursor()

@bot.message_handler(commands=["start"])
def start(message):
    last_command_use_time = \
    cur.execute('SELECT get_card_cd FROM users WHERE user_id={}'.format(message.chat.id)).fetchone()[0]

    user_id = message.chat.id

    if not last_command_use_time or (datetime.datetime.now() - last_command_use_time).hour > 1:
        # Если кнопка не нажималась или с прошлого запуска команды прошёл час
        cur.execute('UPDATE users SET get_card_cd =? WHERE user_id =?', (datetime.datetime.now(), user_id))
        conn.commit()
        bot.send_message(message.chat.id, 'Нужное сообщение...')
    else:
        # Если же час ещё не прошёл
        bot.send_message(message.chat.id, 'Подождите!')

bot.infinity_polling(none_stop=True)

</code>

Дата из базы данных выводится в формате 'str'. Это связано с тем что SQLite не поддерживает встроенное хранилище DateTime класса, но SQLite позволяет нам работать с типами временных меток. Мы можем хранить и извлекать информацию о date и datetime Python, хранящуюся в таблицах базы данных SQLite, преобразуя их в типы date и datetime Python, и наоборот.
Попробуйте дописать

conn = sqlite3.connect('database.db', detect_types=sqlite3.PARSE_DECLTYPES, sqlite3.PARSE_COLNAMES, check_same_thread=False)

sqlite3.PARSE_DECLTYPES

Эта константа используется как значение параметра detect_types метода connect().
Если использовать этот параметр в методе connect(), то модуль sqlite3 будет парсить тип каждой получаемой колонки.

sqlite3.PARSE_COLNAMES

После парсинга используется словарь конвертации типов для поиска выполнения конкретной функции конвертации.


Как сделать так, чтобы бот в телеграмме на Aiogram писал сообщение пользователю по буквам как ChatGPT?
У меня есть бот в телеграмме, он работает, но отправляет сообщение после того, как сервер OpenAI отдаст ответ в
response.
Я бы хотел, чтобы сообщение отправлялось как у ChatGPT, по буквам, постепенно генерировалось на глазах у пользователя.

@dp.message_handler()
async def handle_messages(message: types.Message):
    global user_message
    global voicer_text
    global text
    global photo_text
    global user_is_replying
    user_id = message.from_user.id
    await bot.send_message(chat_id=user_id, text="Карсон печатает . . .")
    await bot.send_chat_action(chat_id=user_id, action=types.ChatActions.TYPING)
    try:

        if user_id in user_is_replying and user_is_replying[user_id]:
            await message.answer("Подождите, Карсон немного перегружен.")
            return

        if photo_text == True:
            user_message = message.text + "\n" + text

        elif voicer_text == True:
            user_message = text

        else:
            user_message = message.text
        # Проверяем длину сообщения пользователя
        if len(user_message) > max_allowed_message_length:
            await message.reply("Извините, ваше сообщение слишком большое, и я не могу на него ответить.")
            photo_text = False
            return

        if photo_text == True:
            update(user_id, 'user', message.text + "\n" + text)

        elif voicer_text == True:
            update(user_id, 'user', text)

        else:
            update(user_id, 'user', message.text)

        user_is_replying[user_id] = True
        #user_messages[user_id].append({"role": "user", "content": f"Язык: ru"})

        response_content, response = await call_openai(message)
        #response_content = response['choices'][0]['message']['content']
        if len(response_content) + len(user_message) >= 15500:
                    await message.reply("Слишком большой запрос . . .\nОшибка на сервере :(")
                    photo_text = False
                    return
        if response['usage']['total_tokens'] >= 15000:
            await message.reply(
                f'В данный момент вы использовали максимум токенов в рамках контекста: {response["usage"]["total_tokens"]}, будет произведена очистка памяти'
            )
            reset_messages(user_id)

        await bot.send_chat_action(chat_id=user_id, action=types.ChatActions.TYPING)
        if voicer_text == True:
            await bot.delete_message(chat_id=message.chat.id, message_id=message.message_id + 2)
            await message.reply(response_content, parse_mode="markdown")

        else:
            await bot.delete_message(chat_id=message.chat.id, message_id=message.message_id + 1)
            await message.reply(response_content, parse_mode="markdown")

        photo_text = False
        voicer_text = False
        text = ""
    except aiogram.utils.exceptions.CantParseEntities as ex:
        await message.answer("Извините, произошла ошибка, пожалуйста, попробуйте повторить запрос.")
    except aiogram.utils.exceptions.MessageToDeleteNotFound as ex:
        await message.answer("Произошёл сбой, повторите запрос")
    except openai.error.InvalidRequestError as ex:
        await message.answer(error_2)
        photo_text = False
    except openai.error.RateLimitError as ex:
        await message.answer(error)
        photo_text = False
    finally:
        user_is_replying[user_id] = False
    return False

# Функция для асинхронного вызова OpenAI
async def call_openai(message) -> str:
    global user_message
    user_id = message.from_user.id
    # Или какой-то другой способ получения сообщения от пользователя
    user_messages[user_id].append({"role": "user", "content": user_message})
    openai.aiosession.set(ClientSession())
    response = await openai.ChatCompletion.acreate(
        model="gpt-3.5-turbo-16k",
        messages=user_messages[user_id],
        temperature=0.8,
        frequency_penalty=0,
        presence_penalty=0.3,
        max_tokens=max_token_count,
    )

    response_content = response['choices'][0]['message']['content']
    await openai.aiosession.get().close()
    return response_content, response

Вот ваш код:
<code>
message=await message.reply("Загрузка...")
str=''
for i in message.text:
    str_=str_+i
    await message.edit_text(str_)
    time.sleep(0.1)
</code>
Не уверен в правильности именно названий функций, написал скорее алгоритм


Как не выполнять команду в последний проход цикла?
Есть цикл, в нем есть действие.
Это действие бы не хотелось выполнять в последний проход, только между.
К примеру:

from time import sleep

my_list = [1, 5, 161, 742] # просто случайные числа
print('start')

for i in my_list:
    print(i)
    sleep(3)

print('finish')

При выполнении этого цикла, перед выводом
finish будет осуществлена задержка в 3 секунды.
Понятно, что можно добавить счетчик, и сравнивать его с количеством элементов:

from time import sleep

my_list = [1, 5, 161, 742]
my_len = len(my_list)
my_counter = 0

print('start')

for i in my_list:
    my_counter += 1
    print(i)
    if my_counter < my_len:
        sleep(3)

print('finish')

Но возможно существует какой то встроенный метод? Или просто более простое использование чего то?

Проще переделать цикл и пропускать первую итерацию. Флажок
first за это отвечает:

from time import sleep

my_array = [1, 5, 161, 742] # просто случайные числа
print('start')

first = True
for i in my_array:
    if first:
        first = False
    else:
        sleep(3)
    print(i)

print('finish')


Программа на Python не выполняет вторую часть [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 27 дней назад.

                        Улучшить вопрос

Есть программа на Python по учёту автомобилей и водителей.
Проблема в том, что выполняется только первая часть, а вторая часть выдаёт ошибку.
Не могу разобраться в чём дело. Если кто знает подскажите.
Мой код:
<code>
class Car:
    def __init__(self, license_plate, brand, model, color):
        self.license_plate = license_plate
        self.brand = brand
        self.model = model
        self.color = color

class Driver:
    def __init__(self, name, age, license_number):
        self.name = name
        self.age = age
        self.license_number = license_number

class ParkingLot:
    def __init__(self):
        self.cars = []
        self.drivers = []

    def add_car(self, car):
        self.cars.append(car)
        print(f"Машина {car.license_plate} добавлена в учет.")

    def add_driver(self, driver):
        self.drivers.append(driver)
        print(f"Водитель {driver.name} добавлен в учет.")

    def remove_car(self, car):
        self.cars.remove(car)
        print(f"Машина {car.license_plate} удалена из учета.")

    def remove_driver(self, driver):
        self.drivers.remove(driver)
        print(f"Водитель {driver.name} удален из учета.")

    def get_car_by_license_plate(self, license_plate):
        for car in self.cars:
            if car.license_plate == license_plate:
                return car
        return None

    def get_driver_by_license_number(self, license_number):
        for driver in self.drivers:
            if driver.license_number == license_number:
                return driver
        return None

while True:
    # Пример использования программы
    parking_lot = ParkingLot()
    print('enter number car')
    nu_car = input()
    print('enter color car')
    color = input()
    print('enter firm car')
    firm_car = input()
    print('enter model car')
    model = input()
    print('enter first last name')
    name = input()
    print('enter age driver')
    age = int(input())
    print('enter drivedoc')
    docc = int(input())
    car1 = Car(f"{nu_car}", f"{firm_car}", f"{model}", f"{color}")
    driver1 = Driver(f"{name}", f"{age}", f"{docc}")
    print('Выберите соответсвующую цифру: 1-добавить в учёт, 2-удалить из учёта')
    count = int(input())
    if count == 1:
        # Добавляем машину и водителя в учет
        parking_lot.add_car(car1)
        parking_lot.add_driver(driver1)
    elif count == 2:
        # Удаляем машину и водителя из учета
        parking_lot.remove_car(car1)
        parking_lot.remove_driver(driver1)
</code>

Я прокомментировал ваш код, проверьте. Но вам надо хорошо подумать над логикой вашей программы.
<code>
class Car:
    def __init__(self, license_plate, brand, model, color):
        self.license_plate = license_plate
        self.brand = brand
        self.model = model
        self.color = color

class Driver:
    def __init__(self, name, age, license_number):
        self.name = name
        self.age = age
        self.license_number = license_number

class ParkingLot:
    def __init__(self):
        super().__init__()
        self.cars = []
        self.drivers = []

    def add_car(self, car):
        self.cars.append(car)
        print(f"\nМашина {car.license_plate} добавлена в учет.")

    def add_driver(self, driver):
        self.drivers.append(driver)
        print(f"Водитель {driver.name} добавлен в учет.\n")

    def remove_car(self, car):
        self.cars.remove(car)
        print(f"\nМашина {car.license_plate} удалена из учета.")

    def remove_driver(self, driver):
        self.drivers.remove(driver)
        print(f"Водитель {driver.name} удален из учета.\n")

    ''' в данном вопросе это публиковать не надо.
        оно не используется и только отвлекает

    def get_car_by_license_plate(self, license_plate):
        for car in self.cars:
            if car.license_plate == license_plate:
                return car
        return None

    def get_driver_by_license_number(self, license_number):
        for driver in self.drivers:
            if driver.license_number == license_number:
                return driver
        return None
    '''

# !!! +++
parking_lot = ParkingLot()    # !!! +++ содавать надо ОДИН раз, а не в цикле каждый раз новый

while True:
    # Пример использования программы
#    parking_lot = ParkingLot()

#    print('\nenter number car')
    nu_car = input('\nenter number car:      ')
    color =    input('enter color car:       ')
    firm_car = input('enter firm car:        ')
    model =    input('enter model car:       ')
    name =     input('enter first last name: ')
    age =  int(input('enter age driver:      '))
    docc = int(input('enter drivedoc:        '))

# !!! +++ экземпляры этих классо надо создавать только
# !!! +++ если вы собираетесь добавлять запись
#    car1 = Car(f"{nu_car}", f"{firm_car}", f"{model}", f"{color}")
#    driver1 = Driver(f"{name}", f"{age}", f"{docc}")

    print('Выберите соответсвующую цифру: 1-добавить в учёт, 2-удалить из учёта')
    count = int(input())

    if count == 1:
# !!! +++
        car1 = Car(f"{nu_car}", f"{firm_car}", f"{model}", f"{color}")    # !!! +++
        driver1 = Driver(f"{name}", f"{age}", f"{docc}")                  # !!! +++

        # Добавляем машину и водителя в учет
        parking_lot.add_car(car1)
        parking_lot.add_driver(driver1)

    elif count == 2:
# !!! +++  vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        for car in parking_lot.cars:
            if  car.license_plate == nu_car and \
                car.brand == firm_car and \
                car.model == model and \
                car.color == color:

                # Удаляем машину и водителя из учета
#                parking_lot.remove_car(car1)
                parking_lot.remove_car(car)                               # +++

#                parking_lot.remove_driver(driver1)
# !!! для  этого удаления, сделайте что-то аналогичное                    # !!!
</code>


Не работает Inline кнопка aiogram

inline_btn_1 = InlineKeyboardButton('Первая кнопка!', callback_data='button1')
inline_kb1 = InlineKeyboardMarkup().add(inline_btn_1)

@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    await message.answer("1")
    await Form.number.set()

@dp.message_handler(state=Form.number)
async def process_name(message: types.Message, state: FSMContext):
    await message.answer(f"inline",reply_markup=inline_kb1)

@dp.callback_query_handler(lambda c: c.data == 'button1')
async def process_callback_button1(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    await bot.send_message(callback_query.from_user.id, 'Нажата первая кнопка!')

После нажатия на
Первая кнопка! ничего не происходит. Почему так?

Ответ от ChatGPT. Рабочий
<code>
# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    # Создаем inline клавиатуру с кнопкой "Нажмите на меня"
    keyboard = InlineKeyboardMarkup()
    button = InlineKeyboardButton("Нажмите на меня", callback_data='press_button')
    keyboard.add(button)

    # Отправляем пользователю сообщение с кнопкой
    await message.answer("Привет! Нажмите на кнопку:", reply_markup=keyboard)

# Обработчик нажатия на inline кнопку
@dp.callback_query_handler(lambda c: c.data == 'press_button')
async def process_button_click(callback_query: types.CallbackQuery):
    # Отправляем пользователю сообщение "1" без отображения на экране
    await bot.send_message(callback_query.message.chat.id, "1")
</code>


Как принять геолакацию от пользователя pytelegrambotapi [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 1 месяц назад.

                        Улучшить вопрос

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

import telebot

# Инициализация бота
bot = telebot.TeleBot('YOUR_BOT_TOKEN')

# Обработчик сообщений с геолокацией
@bot.message_handler(content_types=['location'])
def handle_location(message):
    user_id = message.from_user.id
    latitude = message.location.latitude
    longitude = message.location.longitude
    timestamp = message.date

    # Сохранение данных о геолокации в БД
    save_location_to_db(user_id, latitude, longitude, timestamp)

    # Отметка на карте
    add_marker_to_map(latitude, longitude)

    # Отправка пользователю сообщения с подтверждением
    bot.send_message(user_id, "Геолокация сохранена и отмечена на карте!")

# Запуск бота
bot.polling()


Кулдаун в телеграм боте через базу данных
Хочу сделать вывод сообщения при кулдауне по типу "Осталось подождать ЧАСОВ:МИНУТ", как сделать такой формат - не знаю.
<code>
import telebot
import sqlite3
import datetime
from imports import *

conn = sqlite3.connect('database.db', check_same_thread=False)
cur = conn.cursor()

@bot.message_handler(commands=["start"])
def start(message):
    last_command_use_time = cur.execute('SELECT get_card_cd FROM users WHERE user_id={}'.format(message.chat.id)).fetchone()[0]
    conn.commit()
    p = list(itertools.accumulate([0.01, 0.005, 0.015, 0.05, 0.07, 0.1, 0.15, 0.2, 0.4]))
    n = bisect.bisect(p, random.random())
    x = datetime.datetime.strptime(last_command_use_time, '%Y-%m-%d %H:%M:%S.%f')
    print(type(last_command_use_time), last_command_use_time)

    user_id = message.chat.id

    if not last_command_use_time or (datetime.datetime.now() - x).seconds/14400 > 1:
        cur.execute('UPDATE users SET get_card_cd =? WHERE user_id =?', (datetime.datetime.now(), user_id))
        conn.commit()
        if n == 0:
            print("1%")
            bot.send_message()
        elif n == 1:
            print("0,5%")
        elif n == 2:
            print("1,5%")
        elif n == 3:
            print("5%")
        elif n == 4:
            print("7%")
        elif n == 5:
            print("10%")
        elif n == 6:
            print("15%")
        elif n == 7:
            print("20%")
        elif n == 8:
            print("40%")
        else:
            print('Error')
    else:
        bot.send_message(message.chat.id, text='Осталось подождать времени')
</code>

В коде описана команда
/go
Команда реагирует на её активацию пользователем, и записывает в строку с пользователем дату и время нажатия.
Если не прошёл час после прошлого нажатия, то говорим, чтобы ждали.
В sqlite3 уже должна быть строка с пользователем.

import telebot
import sqlite3
import datetime

bot = telebot.TeleBot('TOKEN')

sql = sqlite3.connect('FILE')
conn = sql.cursor()

@bot.message_handler(commands=["go"])
def go(message):
    last_command_use_time = conn.execute('SELECT go FROM users WHERE id={}'.format(message.chat.id)).fetchone()[0]

    if not last_command_use_time or (datetime.datetime.now() - last_command_use_time).hour > 1:
        # Если кнопка не нажималась или с прошлого запуска команды прошёл час
            conn.execute('UPDATE users SET go={} WHERE id={}'.format(datetime.datetime.now(),message.chat.id))
            sql.commit()
            bot.send_message(message.chat.id,'Нужное сообщение...')
    else:
        # Если же час ещё не прошёл
        bot.send_message(message.chat.id,'Подождите!')

bot.polling(none_stop=True)


как собрать сообщение в телеграм
Всем привет не могу понять как решить такую задачу на Python
Есть два списка:

list1 = [('значение поля профиль',), ('значение поля фамилия',), ('значение поля город',)]

и

list2 = ['профиль', 'фамилия', 'город']

в двух списках значения только string, значения берутся из БД SQLite
задача отправить в одном сообщении в телеграмм текст вида:

профиль: значение поля профиль
фамилия: значение поля фамилия
город: значение поля город

А можно упаковать два листа как один через
zip и отформатировать их в один лист строк, далее уже его упаковать как одну строку с переносами.

list1 = [('значение поля профиль',),
         ('значение поля фамилия',),
         ('значение поля город',)]

list2 = ['профиль', 'фамилия', 'город']

# Создаем пустой список для хранения строк
result_list = []

# Итерируемся по элементам list2 и list1 одновременно
for field, values in zip(list2, list1):
    # Формируем строку для каждой пары значений
    values_str = ', '.join(values)
    result_str = f'{field}: {values_str}'
    result_list.append(result_str)

# Объединяем все строки в одну строку
result_message = '\n'.join(result_list)

# Выводим результат
print(result_message)

Вывод:

профиль: значение поля профиль
фамилия: значение поля фамилия
город: значение поля город


При отправке фото aiogram2 в определённое время(apscheduler) возникает ошибка

from datetime import datetime

from aiogram import Bot, Dispatcher
from aiogram import executor
from apscheduler.schedulers.asyncio import AsyncIOScheduler

BOT_TOKEN = 'тут токен бота'
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher(bot)

async def send_message_cron(bot: Bot):
    # текстовое сообщение отправляется нормально
    await bot.send_message(chat_id=`тут id чата`, text='тут текст')
    # при отправке фото происходит ошибка, выписанная ниже
    await bot.send_photo(chat_id=`тут id чата`, photo='downloads/orders.jpg')

scheduler = AsyncIOScheduler(timezone="Europe/Moscow")
scheduler.add_job(send_message_cron,
                  trigger='cron',
                  hour=datetime.now().hour,
                  minute=datetime.now().minute + 1,
                  start_date=datetime.now(),
                  kwargs={'bot': bot})
scheduler.start()

if name == 'main':
    executor.start_polling(dp, skip_updates=True)

C:\Python3.11.1\python.exe C:\Users\Админ\PycharmProjects\OrderDinnerBot\test2.py
Updates were skipped successfully.
Job "send_message_cron (trigger: cron[hour='23', minute='38'], next run at: 2023-10-05 23:38:00 MSK)" raised an exception
Traceback (most recent call last):
  File "C:\Python3.11.1\Lib\site-packages\apscheduler\executors\base_py3.py", line 30, in run_coroutine_job
    retval = await job.func(*job.args, **job.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Админ\PycharmProjects\OrderDinnerBot\test2.py", line 28, in send_message_cron
  File "C:\Python3.11.1\Lib\site-packages\aiogram\bot\bot.py", line 565, in send_photo
    result = await self.request(api.Methods.SEND_PHOTO, payload, files)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python3.11.1\Lib\site-packages\aiogram\bot\base.py", line 236, in request
    return await api.make_request(await self.get_session(), self.server, self.__token, method, data, files,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python3.11.1\Lib\site-packages\aiogram\bot\api.py", line 140, in make_request
    return check_result(method, response.content_type, response.status, await response.text())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python3.11.1\Lib\site-packages\aiogram\bot\api.py", line 115, in check_result
    exceptions.BadRequest.detect(description)
  File "C:\Python3.11.1\Lib\site-packages\aiogram\utils\exceptions.py", line 141, in detect
    raise cls(description)
aiogram.utils.exceptions.BadRequest: Wrong http url specified

Метод
send_photo в качестве параметра
photo принимает в себя не путь до этого изображения, а сам объект изображения. Данный объект можно получить из

from aiogram.types import InputFile

А затем задав отправку фотографии следующим образом

    image = InputFile('downloads/orders.png')
    await bot.send_photo(chat_id='ваш чат id', photo=image)

Можете так же воспользоваться
open

    with open('Путь к изображению', 'rb') as photo:
       await bot.send_photo(chat_id='ваш чат id', photo)


Отключение сортировки в django admin
На странице django admin мне нужно отключить сортировку вообще, чтобы пользователь не мог отсортировать по возрастанию или убыванию, я не совсем понимаю где я могу отключить подобное.
из всего что я нашел это сделать
ordering = [], отключить в Meta модели ordering и переопределить метод get_ordering такую конструкцию:

def get_ordering(self, request):
    return []

Ничего из этого не помогло, подскажите что еще можно сделать?

В файле
admin.py, в классе модели, для которой необходимо отключить сортировку, пропишите
sortable_by = ().

Если вы хотите отключить сортировку для некоторых столбцов, задайте sortable_by в виде коллекции подмножеств list_display, которые вы хотите сделать сортируемыми. Пустая коллекция отключает сортировку для всех столбцов.

Здесь вы найдёте больше информации.


Выборка из списка Python последовательно
Хочу получить из словаря списков

d = {
    'hi': [('qw', 86), ('er', 23)],
    'bye': [('hgd', 20), ('sa', 945), ('nd', 83)],
    'do': [('as', 27), ('ds', 46)],
}

for k, v in d.items():
    if k in ['hi', 'bye']:
        r = l[N] - нужен только один уникальный список из списка списков ниже. Или же может прям из d можно такое сгенерировать. Здесь должен быть [('qw', 86), ('hqd', 20)], в следующем цикле [('qw', 86), ('sa', 945)] и т.д.
    else:
        r = random.sample(v, 2)

Возможно надо сформировать сперва список из d для hi & bye, а потом последовательно брать по одной строке. Либо эту последовательность можно создавать и брать сразу в цикле, но как тогда узнать об уникальности данной строки.

l = [
    [('qw', 86), ('hqd', 20)],
    [('qw', 86), ('sa', 945)],
    [('qw', 86), ('nd', 83)],
    закончились варианты с первым список продолжается
    [('er', 23), ('hqd', 20)],
    [('er', 23), ('sa', 945)],
    [('er', 23), ('nd', 583)],
    закончились варианты с первым список продолжается
    [('hgd', 20), ('sa', 945)],
    [('hgd', 20), ('nd', 83)],
    и т.д.
]

Ну можно например вот так, только исходный словарь
d вам нужно обработать таким образом, чтобы в нём оставались только те элементы, которые вам нужны.

d = {
    'hi': [('qw', 86), ('er', 23)],
    'bye': [('hgd', 20), ('sa', 945), ('nd', 83)]
}

l = []

for key1, value1 in d.items():
    for key2, value2 in d.items():
        if key1 != key2:  # Убедимся, что мы не объединяем одинаковые ключи
            for item1 in value1:
                for item2 in value2:
                    l.append([item1, item2])

for sublist in l: # Просто для красивого вывода
    print(', '.join([f"('{x}', {y})" for x, y in sublist]))

Вывод:

('qw', 86), ('hgd', 20)
('qw', 86), ('sa', 945)
('qw', 86), ('nd', 83)
('er', 23), ('hgd', 20)
('er', 23), ('sa', 945)
('er', 23), ('nd', 83)
('hgd', 20), ('qw', 86)
('hgd', 20), ('er', 23)
('sa', 945), ('qw', 86)
('sa', 945), ('er', 23)
('nd', 83), ('qw', 86)
('nd', 83), ('er', 23)

UPD
Нашёл более привлекательное решение, используя
itertools, так как вам нужны именно КОМБИНАЦИИ а не все возможные перестановки:

d = {
    'hi': [('qw', 86), ('er', 23)],
    'bye': [('hgd', 20), ('sa', 945), ('nd', 83)]
}

combined_list = [item for sublist in d.values() for item in sublist]

# print(combined_list) # мы соединяем два ключа вместе образуя один массив

from itertools import combinations

result_list = list(combinations(combined_list, 2)) #смотрим комбинации через itertools

for i in result_list:
    print(i)

Вывод:

(('qw', 86), ('er', 23))
(('qw', 86), ('hgd', 20))
(('qw', 86), ('sa', 945))
(('qw', 86), ('nd', 83))
(('er', 23), ('hgd', 20))
(('er', 23), ('sa', 945))
(('er', 23), ('nd', 83))
(('hgd', 20), ('sa', 945))
(('hgd', 20), ('nd', 83))
(('sa', 945), ('nd', 83))


Соединить текст и число в одну строку питон
хочу сделать шифратор, и хочу сделать формат буква - двухзначное число, но я не могу соединить строки.
<code>
import random
import re
alfavit = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
num = '1234567890'
def numbers():
   for i in range(33):
      a = random.choice(num)
      b = random.choice(num)
      c = a,b
      print(*c, sep='')
def bukvi():
   res = list(alfavit)
   for i in res:
      i1 = re.sub(r'\s+', '\n', i)
      print(i1)

print (bukvi() + numbers())
</code>

Можно сделать попроще. Диапазон двухзначных чисел (с ведущим нулем) известен - 00..99 (при необходимости его можно настроить аргументами в range(), например
range(10,100)). Делаем из него список и перемешиваем. В цикле перебираем буквы и соотносим очередную букву с очередным числом. Их "склеиваем" с помощью f-строки. Список шифров возвращаем из функции, распаковываем и печатаем, разделяя переводом строки.
Подход обеспечивает:

равномерное распределение чисел на буквы;
уникальность чисел, сопоставленных буквам;
сохранение порядка следования букв

import random
def cipher():
    n = list(range(100))
    random.shuffle(n)
    return [f'{ch} = {n[i]:02d}' for i, ch in enumerate('абвгдеёжзийклмнопрстуфхцчшщъыьэюя')]

print(*cipher(), sep='\n')

а = 63
б = 43
в = 71
г = 02
д = 35
...
ь = 96
э = 67
ю = 33
я = 51


Хочу создать команду размьют (unmute time-out) [закрыт]

Закрыт. Данный вопрос необходимо конкретизировать. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 24 дня назад.

                        Улучшить вопрос

Хочу создать команду именно команду потому что постоянно вижу на ютубе только слеш команды размьют так же чтобы она работала так как показано снизу плюсом к этому тут должны быть:

проверка на наличие разрешения кика и должно выдавать ошибку по типу

❌ У вас недостаточно прав на размьют!

Если не указать участника и должно выдавать ошибку по типу

❌ Вы не указали кому нужно снять мьют.

если есть мьют размутить и должно выдавать сообщение

✅ участник <@username> был размьючен по причине: <причина>.
если без причины то так

✅ участник <@username> был размьючен.

если мьюта нету у участника должно выдавать ошибку

❌ <@username> не имеет мьют.

Помогите пожалуйста я уже замучался искать. Заранее большое спасибо

пример

>размьют <@username>

пример

>размьют <@username> <причина>

Чтобы "разтаймаутить" участника, используйте команду
await member.timeout(duration=None) в disnake и discord.py.


Как обойти ошибку ValueError при некорректном введенном значении после int(input()) и зациклить ввод? [дубликат]

На этот вопрос уже даны ответы здесь:

Как зациклить ввод данных?

                                (2 ответа)

Закрыт 1 месяц назад.

Допустим есть запрос:

num = int(input("Введите число"))
Если в консоль введен не числовой тип данных, возникает ошибка.
Можно через try except продолжить программу. Но не получается у меня зациклить ввод.
Чтобы после ввода некорретных данных, снова отрабатывал
int(input("Введите число")) до тех пор, пока не будет введено число.

Можно вот так (это самый понятный способ, но не самый изящный):

while True:
    try:
        num = int(input("Введите число: "))
    except ValueError:
        continue
    break

Здесь мы бесконечно просим пользователя ввести число. Если вылетает исключение, цикл повторяется через
continue. В противном случае мы выходим из цикла с помощью
break.
Есть еще один метод. Тут мы не ловим ошибки, а проверяем само число с помощью функции
is_decimal:

while True:
    if input("Введите число: ").is_decimal(): break
    else: continue


Не считываются аргументы в команде [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 18 дней назад.

                        Улучшить вопрос

Есть вот такая команда:

async def countrys(ctx, names: str):

Вылетает с кучей ошибок. Что делать, как починить, чтобы всё, что написано в этой строке после команды, считывалось?
Вот ошибки:

[2023-10-04 13:45:22] [ERROR   ] discord.ext.commands.bot: Ignoring exception in command countrys
Traceback (most recent call last):
  File "D:\Pyton\lib\site-packages\discord\ext\commands\core.py", line 235, in wrapped
    ret = await coro(*args, **kwargs)
  File "x-wingide-python-shell://168682432/2", line 20, in countrys
TypeError: list expected at most 1 argument, got 8

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "D:\Pyton\lib\site-packages\discord\ext\commands\bot.py", line 1350, in invoke
    await ctx.command.invoke(ctx)
  File "D:\Pyton\lib\site-packages\discord\ext\commands\core.py", line 1029, in invoke
    await injected(*ctx.args, **ctx.kwargs)  # type: ignore
  File "D:\Pyton\lib\site-packages\discord\ext\commands\core.py", line 244, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: list expected at most 1 argument, got 8

Если я правильно понимаю, то Вам должно подойти это:

@bot.command()
async def countrys(ctx, *args):
    print(args)

Если необходимо разделение через запятые/пробелы аргументов и запихнуть их в список, то такая конструкция может помочь:

@bot.command()
async def countrys(ctx, *args):
    print(args)

    arguments = ' '.join(args)
    print(arguments)

    wrote_args = [arguments][0].split(', ')
    print(wrote_args)

Пример:

!countrys Name1, Name2, Name3, Name Name

('Name1,', 'Name2,', 'Name3,', 'Name', 'Name')
Name1, Name2, Name3, Name Name
['Name1', 'Name2', 'Name3', 'Name Name']


Программа не видит строку "Ctrl+Break"
Код должен отлавливать строку 'ctrl+break', выводить 'bye-bye' и завершать программу, но почему то пропускает мимо и выводит 'ok'.
<code>
import sys

class PasswordError(Exception):
    pass

class LengthError(PasswordError):
    pass

class LetterError(PasswordError):
    pass

class DigitError(PasswordError):
    pass

class SequenceError(PasswordError):
    pass

def check_password():
    start = 0
    end = 3
    const_en = ['qwertyuiop', 'asdfghjkl', 'zxcvbnm']
    const_ru = ['йцукенгшщзхъ', 'фывапролджэё', 'ячсмитьбю']
    const_zn = ".,|\}]{[()!@#$%^&*№;:?~`+=_-" + '"'
    for line in sys.stdin:
        try:
            if line == 'Ctrl+Break':
                print('Bye-Bye')
                return
            if len(line) < 9:
                raise LengthError()
            for i in range(len(const_zn)):
                if const_zn[i] in line:
                    line = line.replace(const_zn[i], '')
            if line.isalpha():
                raise DigitError()
            if line.isupper() or line.islower() or line.isdigit():
                raise LetterError()
            for i in range(len(line) - 2):
                for j in range(3):
                    if line[start:end].lower() in const_en[j] or line[start:end].lower() in const_ru[j]:
                        raise SequenceError()
                start += 1
                end += 1
            print('ok')
            return
        except LengthError:
            print('LengthError')
        except DigitError:
            print('DigitError')
        except LetterError:
            print('LetterError')
        except SequenceError:
            print('SequenceError')
    print('Bye-Bye')

check_password()
</code>

Вы пытаетесь найти строку равную "Ctrl+break". В этом ошибка. В строке может быть куча другого текста, который совершенно не причем.
Вам надо проверять на то, чтобы в строке было стоп-значение "Ctrl+break".  И это будет ключом к задаче. Т.е. вместо проверки условия:

line == "Ctrl+break"

Надо поставить:

"Ctrl+break" in line

Соответственно, если у вфшеуказанной строчки значение True (если есть Ctrl+break), то система говорит "bye-bye", иначе идет дальше и пишет "ok"
Есть ещё вариант решения вашей задачи через метод поиска подстроки в строке:

if line.find("Ctrl+break") == -1:
    print('ok')

Где line - это строка, в которой вы совершаете поиск, а "Ctrl+break" - искомая величина. Метод find возвращает значение -1 если искомой подстроки нет в строке line.


Курс: МКА Python(Junior) Тема: Создание игры «камень, ножницы, бумага»
Задание
Реализуйте программу, цель которой определить, есть ли в тексте определённое слово.
Пользователь вставляет в консоль текст, а потом слово, которое хочет найти, программа
должна вывести номер позиции, в которой
начинается это слово и есть ли оно вообще.
Учтите регистр букв (маленькие и большие),
чтобы программа находила любой из вариантов.

Код:
<code>
import random
a = input("Введите строку: ")
s = input("Введите слово: ")
n = a.lower().find(s.lower())
if n < 0:
    print("Слово не содержится в строке")
while n >= 0:
    print("Слово содержится в строке в позиции", n)
</code>

Проверяем наличие подстроки методом
.find():

t=input('Введите строку --> ').lower()
s=input('Введите слово --> ').lower()
if (pos:=t.find(s)) == -1:
    print('Такой подстроки нет')
else:
    print(f'Подстрока есть, её позиция {pos}')

Для тех, кто любит коды, запиханные в строчку =):

print('Такой подстроки нет' if (pos:=input('Введите строку --> ').lower().find(input('Введите слово --> ').lower())) == -1 else f'Подстрока есть, её позиция {pos}')

Для тех, у кого питон ниже
3.8 и не поддерживает оператор
:=:

t=input('Введите строку --> ').lower()
s=input('Введите слово --> ').lower()
pos=t.find(s)
if pos == -1:
    print('Такой подстроки нет')
else:
    print(f'Подстрока есть, её позиция {pos}')

Ваша ошибка в том, что вы используете
while вместо
if, и у вас образуется бесконечный цикл.


Проблема с множественным наследованием в python
Пытаюсь создать свой класс, унаследованный от двух классов (python 3.11):

from PyQt6.QtCore import QSemaphore, QObject

class LimitPerMinuteSemaphore(QObject, QSemaphore):
    def __init__(self, limit_per_minute: int):
        super(QObject, self).__init__()
        super(QSemaphore, self).__init__(limit_per_minute)

semaphore = LimitPerMinuteSemaphore(200)

При создании переменной класса возникает ошибка (в строчке
super(QSemaphore, self).__init__(limit_per_minute)):

TypeError: QObject(parent: typing.Optional[QObject] = None): argument
1 has unexpected type 'int'

Почему возникает ошибка и как её исправить?

QObject не поддерживает виртуальное наследование.

Virtual inheritance with QObject is not supported.

Как исправить: пересмотрите архитектуру вашего проекта.


pandas и сохранение результата .str.contains в другой датафрейм
Необходимо произвести отбор отдельных значений из одного датафрейма по условию, и записать их в другой датафрейм.
Как я это вижу: мы открываем файл Excel; из него формируется первый датафрейм. Потом for проходит по нему с определенными условиями, и дальше мы результаты каждого цикла добавляем в второй датафрейм.
Я пытался это сделать так, но это не работает.
<code>
df = pd.read_excel(fname, index_col=0)
        df2 = pd.DataFrame()
        for teg in r'\bн/о', r'\bакту', r'\bно3', r'\bМОУ':
            df_selected = df[df['Последний комментарий'].str.contains(teg)]
            df2 = df2.append(df_selected)

        print(df2)
</code>

Одно из основных преимуществ библиотеки pandas - векторизация операций с табличными данными. Поэтому в общем виде решение вашей задачи, раз вы не предоставили исходных данных, можно привести к одной строке, без всяких циклов:
<code>
df = pd.read_excel(fname, index_col=0)
df2 = df[df['Последний комментарий'].str.contains('|'.join(tags))]
</code>
где tags - список с вашими тегами.


Ошибка при занесении данных в бд
При старте (
/start) в таблице
groups - должна создаваться строка с данными беседы в которой она прописана(должна вставлять только айди группы).
Если прописать её когда данных в базе с таким же айдишником группы нету, то все будет успешно - ошибок не будет, если же прописать её когда данные есть - будут ошибки и закроется соединение с базой данных. Попробовал написать проверку - не получись, как это можно решить и какую проверку лучше подскажете использовать?

@bot.message_handler(commands=['start'])
def start(message):
    grouptype = message.chat.id
    user_id = message.from_user.id
    if grouptype < 0 and developer_id == user_id:
        group_id_ndb = message.chat.id

        conn = sqlite3.connect('dba.db', check_same_thread=False)
        cur = conn.cursor()

        group_idd = message.chat.id

        cur.execute('SELECT groupid FROM groups WHERE groupid = ("%s")' % group_idd)
        groups = cur.fetchall()
        if cur.fetchone() is None:
            cur.execute('INSERT INTO groups (groupid) VALUES ("%s")' % group_id_ndb)
            conn.commit()
            bot.send_message(group_id_ndb, 'Запись создана')
        else:
            bot.send_message(group_id_ndb, 'Запись не создана')

        conn.commit()
        cur.close()
        conn.close()

cur.execute('INSERT INTO groups (groupid) VALUES ("%s")' % group_id_ndb) - что такое
(groupid)? Это не нужно... Если не помогло, напишите ошибку...


Отправка сообщения от телеграмм бота когда переменная достигнет определённого значения
Я пишу сигнально телеграмм бота который должен отправлять сообщение когда переменная достигает определённого значения но просто командой bot.send_message это не работает
Использую библиотек pyTelegrambotapi

Для точного ответа на ваш вопрос нужно видеть код, потому что это делатеся как раз функцией
bot.send_message().
Данный код отправит сообщение как только значение переменной
i станет равным 5:

import telebot

bot = telebot.TeleBot('ваш_токен')

for i in range(10):

    if i == 5:
        bot.send_message(chat_id, 'сообщение')

bot.infinity_polling()

Важно понимать, что для отправки сообщения нужно знать id чата для передачи в функцию. Его вы можете либо получить из хэндлера
@bot.message_handler(), либо указать напрямую для отправки в конкретный чат. Это зависит от ваших задач и без вашего кода ответить точно нельзя


ProgrammingError: Incorrect number of bindings supplied

data = (identic, username, profile, name, location, salary, work_mode, stack, experience, resume, coment, hashtag, date,)
cursor.execute('INSERT INTO Messages VALUES ("?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?");', (data,))

Выдаёт ошибку про отсутствие привязок:

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 1 supplied.

Изменение
data с кортежа на список не помогло.
Если не передавать
identic, то пишет, что не хватает одного значения (12 из 13).

identic в БД настроен на автоинкремент.

cursor.execute('INSERT INTO users (user_id, name, surname) VALUES (''?, ?, ?)', (user_id, name, surname))

Попробуйте сделать запрос в данном виде, где вместо последних данных будет ваша переменная
data без запятой в конце.
Вместо этого

INSERT INTO users (user_id, name, surname)

запишите свои переменные, чтобы данные были заполнены правильно.


Ускорение выполнения кода Python
Всем привет.
У меня есть код, выполнение которого надо ускорить
Программа в списке ищет пары, сумма которых равна
s. Если таких пар несколько, то в ответ выводится та пара, у которой второй элемент в начальном списке имеет наименьший индекс.
Например: [2,4,3,6,3,6], 6
В ответе будет [2,4]

def sum_pairs(ints: list, s: int):
    ints_set = list(set(ints))
    results = {}
    cashe = set()
    for i in range(len(ints_set) - 1):
        for j in range(i, len(ints_set)):
            if tuple([ints_set[i], ints_set[j]]) in cashe:
                continue
            if ints_set[i] + ints_set[j] == s:
                if ints.index(ints_set[i]) < ints.index(ints_set[j]):
                    results[ints_set[i], ints_set[j]] = ints.index(ints_set[j])
                    cashe.add(tuple([ints_set[i], ints_set[j]]))
                elif ints.index(ints_set[j]) < ints.index(ints_set[i]):
                    results[ints_set[j], ints_set[i]] = ints.index(ints_set[i])
                    cashe.add(tuple([ints_set[j], ints_set[i]]))

    for i in ints_set:
        if ints.count(i) > 1:
            sum_equal_nums = i * 2
            if sum_equal_nums == s:
                results[i, i] = ints.index(i, ints.index(i) + 1)

    if len(results) == 0:
        return None

    min_value = min(results.values())

    for k, v in results.items():
        if v == min_value:
            return list(k)

    return None

Если у кого есть варианты, напишите, пожалуйста
Заранее спасибо)

a = [2,4,3,6,3,6]
summ = 6
s = set()
for x in a:
    if summ - x in s:
        print(summ-x, x)
        break
    s.add(x)


sqlite3 python - постоянно выводит значение 1
Мне нужно вывести из базы данных (sqlite3) значение в столбце
welcome_msg_status, когда я его вывожу - мне постоянно пишет, что оно равно 1. Менял значения на другие и вообще удалял - значение все равно 1. В чем может быть проблема?

def dbtest(message):
    conn = sqlite3.connect('dba.db', check_same_thread=False)
    cur = conn.cursor()

    group_id = message.chat.id

    cur.execute('SELECT EXISTS(SELECT welcome_msg_status FROM groups WHERE groupid = ("%s"))' % group_id)
    status = cur.fetchall()

    for elem in status:
        print(elem[0])
        if elem[0] == 0:
            bot.reply_to(message, text="Приветствую тебя, это дефолтное сообщения приветствия! -- 0")
        elif elem[0] == 1:
            bot.reply_to(message, text="Приветствую тебя, это настроенное сообщение приветствия! -- 1")
        else:
            bot.reply_to(message, text="Ошибка")

Как я понимаю,
EXIST в вашем коде действительно проверяет, есть ли такая строчка, но возвращает булевые значения в числах:
1 (True) или
0 (False). Рекомендую вам такой метод проверки:

cur.execute('SELECT welcome_msg_status FROM groups WHERE groupid = ("%s"))' % group_id)
if cur.fetchone()==None:#Если не существует
    ...
else:#Если существует
    ...

P.S. Проверил на своей БД, действительно строчка
cur.execute('SELECT EXISTS(SELECT welcome_msg_status FROM groups WHERE groupid = ("%s"))' % group_id) выводит "булевые числовые" значения


Как соеденить две строки в одну и сделать так, чтобы функция выполнилась?
У меня есть словарь к которому надо приписать две последние буквы, чтобы потом вывелось значение.
<code>
val = days.today

value = val + datetime.date.today().strftime('%A')[:2]

print(datetime.date.today().strftime('%A'))
print(value)
</code>
Как это сделать правильно? Просто не хочется расписывать огромную конструкцию if elif.

Предположу, что для решения данной задачи помогут f-строки.

from datetime import datetime

val = datetime.today()

value = f"{val} {datetime.today().strftime('%A')[:2]}"

print(datetime.today().strftime('%A'))
print(value)

OUTPUT:

Tuesday
2023-10-03 11:57:14.397156 Tu


Как интегрировать ИИ и tg бота через python?
Всем привет! Есть задача, разработать tg бота, который будет делать определенный запрос по параметрам к ИИ и выдавать персональную тренировку.
Облазил почти весь интернет, но не могу найти способ связи бота и ИИ. Из-за того, что, openai заблокирован, приходится искать нестандартные способы (способ с vpn не подходит). Пытался через парсинг сайта, через meta.com, albato, dialogflow(он не подходит, из-за длительности обучения), но нигде не могу сделать нормального работоспособного бота. Нужно, чтобы запросами к ИИ, можно было писать через интерпретатор. То есть, грубо говоря, мне нужен аналог API, как у openai, доступный в СНГ странах.
Может кто-то знает еще способы связи бота и ИИ (желательно с бесплатным сервисом, или с пробным периодом)?

Попробуй использовать библиотеку transformers от Hugging Face.
И сегодня наткнулся на статью по запуску аналогов ChatGPT локально.


Python помогите пожалуйста найти ошибку в коде [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 1 месяц назад.

                        Улучшить вопрос

<code>
import random

# Создание игрового поля
board = []

for _ in range(5):
    row = ['O'] * 5
    board.append(row)

# Функция для отображения игрового поля
def display_board(board):
    for row in board:
        print(' '.join(row))

# Функция для создания случайной позиции корабля
def random_row(board):
    return random.randint(0, len(board) - 1)

def random_col(board):
    return random.randint(0, len(board[0]) - 1)

# Генерация позиций кораблей
ship_row = random_row(board)
ship_col = random_col(board)

# Игровой цикл
for turn in range(4):
    print(f'Ход {turn + 1}')

# Ввод координат выстрела
guess_row = int(input('Укажите номер строки: '))
guess_col = int(input('Укажите номер столбца: '))
board[guess_row][guess_col] = 'Y'

# Проверка на попадание
if guess_row not in range(5) or guess_col not in range(5):
        print('Упс! Это не в пределах игрового поля!')
    if board[guess_row][guess_col] == 'Y':
        print('Вы уже стреляли в эту клетку!')
    if guess_row != ship_row or guess_col != ship_col:
        print('Мимо!')
    if (turn + 1) == 4:
        print('Игра окончена!')
        display_board(board)
    if guess_row == ship_row and guess_col == ship_col:
        print('Поздравляю! Вы потопили корабль!')
break
</code>

Так, по порядку:
Код выполняет ввод и проверку только один раз, после чего сразу переходит к завершению игры. Необходимо переместить ввод и проверку внутрь цикла for turn in range(4):
В коде отсутствует правильное использование операторов условия. Вместо этого используйте операторы if, elif и else для правильной проверки условий и выполнения соответствующих действий.
Используется оператор break, но он находится вне цикла. break должен быть внутри цикла для корректного завершения игры после достижения лимита ходов.
Исправленный код:
<code>
import random

# Создание игрового поля
board = []

for _ in range(5):
    row = ['O'] * 5
    board.append(row)

# Функция для отображения игрового поля
def display_board(board):
    for row in board:
        print(' '.join(row))

# Функция для создания случайной позиции корабля
def random_row(board):
    return random.randint(0, len(board) - 1)

def random_col(board):
    return random.randint(0, len(board[0]) - 1)

# Генерация позиций кораблей
ship_row = random_row(board)
ship_col = random_col(board)

# Игровой цикл
for turn in range(4):
    print(f'Ход {turn + 1}')

    # Ввод координат выстрела
    guess_row = int(input('Укажите номер строки: '))
    guess_col = int(input('Укажите номер столбца: '))

    # Проверка на попадание
    if guess_row not in range(5) or guess_col not in range(5):
        print('Упс! Это не в пределах игрового поля!')
    elif board[guess_row][guess_col] == 'Y':
        print('Вы уже стреляли в эту клетку!')
    elif guess_row != ship_row or guess_col != ship_col:
        print('Мимо!')
    else:
        print('Поздравляю! Вы потопили корабль!')
        break

if turn + 1 == 4:
    print('Игра окончена!')
    display_board(board)
</code>


Telethon выводит другой id
Есть код:

@client.on(events.NewMessage())
async def my_event_handler(event):
    chat = await event.get_chat()
    print(chat)

Он выводит это:

Channel(id=1799752035, .................

Но на самом деле id канала другой:

-1001799752035

Почему так?

Это происходит потому что
-100 - префикс, а питон не использует префикс при выводе ID канала. Чтобы перевести из питоновского в "настоящий" ID, добавьте префикс
-100.

Важно знать, что "настоящие" идентификаторы каналов всегда отрицательные и длиной в 13 символов! В начале всегда находится префикс
-100


Поиск в файле excel в pandas
Есть необходимость подгружать файлы xlsx, фильтровать их по ключевым словам в одном столбце, и потом выводить содержимое ячейки в другом столбце на строке где было найдено значение.
Для доступа к данным excel я решил использовать pandas, выгрузил и с помощью  .str.contains(r'\bxx') я получил данные, но как потом отфильтровать эти новые данные по True и связать для вывода необходимых данных я ни как не дойду.
Пока дошел только до этого, я просматриваю столбец, и проставляю 1 или 0, в зависимости от Treu и False.Помечая те строки которые мне будут нужны.
<code>
df = pd.read_excel(r'D:/Ucheba/test.xlsx')
df["Завершена"] = np.where(df['Последний комментарий'].str.contains(r'\bтест'), 1, 0)
</code>
Возможно Вы подскажите более простой способ решения моей задачи.

df["Завершена"] = np.where(df['Последний комментарий'].str.contains(r'\bтест'), 1, 0)

Это делается проще и без привлечения
numpy:

df["Завершена"] = df['Последний комментарий'].str.contains(r'\bтест').astype(int)

Если вам нужно получить только те строки датафрейма, где условие истинно, то это делается так:

df_selected = df[df['Последний комментарий'].str.contains(r'\bтест')]


Ошибка с пробелами и с return [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

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

Закрыт 1 месяц назад.

                        Улучшить вопрос

def summa(message):
    global amount
    try:
        amount = int(message.text.strip())
    except ValueError:
        bot.send_message(message.chat.id, 'Непонял')
        bot.register_next_step_handler(message, summa)
        return *Ошибка: Unindent does not match any outer indentation level*

   if amount > 0:
       markup = types.InlineKeyboardMarkup(row_width=2)
       btn1 = types.InlineKeyboardButton('USD/EUR', callback_data='usd/eur')
       btn2 = types.InlineKeyboardButton('EUR/USD', callback_data='eur/usd')
       btn3 = types.InlineKeyboardButton('USD/GBP', callback_data='usd/gbp')
       btn4 = types.InlineKeyboardButton('Другое', callback_data='else')
       markup.add(btn1, btn2, btn3, btn4)
       bot.send_message(message.chat.id, 'Валюта', reply_markup=markup)> Здесь выводить тоже самую ошибку: Unindent does not match any outer indentation level
   else:
       bot.send_message(message.chat.id, 'Введи число больше нуля')
       bot.register_next_step_handler(message, summa)

В консоль выводит:

   if amount > 1:
                 ^
IndentationError: unindent does not match any outer indentation level

Ваши ошибки:

В питоне строки обособляются с помощью кавычек, поэтому сделайте так:

return 'Ошибка: Unindent does not match any outer indentation level'

Перед
if и
else у вас по 3 пробела, а надо 4. Соответственно и ко всем внутристоящим строкам тоже добавляем пробел, чтобы их было 4.

Вот ваш новый код, копируйте:

def summa(message):
    global amount
    try:
        amount = int(message.text.strip())
    except ValueError:
        bot.send_message(message.chat.id, 'Непонял')
        bot.register_next_step_handler(message, summa)
        return 'Ошибка: Unindent does not match any outer indentation level'

    if amount > 0:
        markup = types.InlineKeyboardMarkup(row_width=2)
        btn1 = types.InlineKeyboardButton('USD/EUR', callback_data='usd/eur')
        btn2 = types.InlineKeyboardButton('EUR/USD', callback_data='eur/usd')
        btn3 = types.InlineKeyboardButton('USD/GBP', callback_data='usd/gbp')
        btn4 = types.InlineKeyboardButton('Другое', callback_data='else')
        markup.add(btn1, btn2, btn3, btn4)
        bot.send_message(message.chat.id, 'Валюта', reply_markup=markup)
    else:
        bot.send_message(message.chat.id, 'Введи число больше нуля')
        bot.register_next_step_handler(message, summa)


Как создать переменную? [дубликат]

На этот вопрос уже даны ответы здесь:

Как динамически создать переменную

                                (2 ответа)

Закрыт 1 месяц назад.

Я знаю, как создать переменную самому, но мне стало интересно, возможно ли создать новую переменную, название которой мы передаём в
str?
Например, есть такой код:

def new(name,value):
    #создать переменную с названием name и присвоить ему значение value

Первый вариант - использование
exec. Эта команда преобразует строку в строку кода.

def new(name,value):
    exec(f'{name}={value}')

В этом случае
x - локальная переменная, то есть использоваться она может только в этой функции. Но, как верно сказал @andreymal,
exec принимает любой код, таким образом если мы впишем в функцию не очень хороший код, он выполнится, и будет ой
Этого можно избежать с помощью метода
locals:

def new(name,value):
    locals()[name] = value

Если мы вызовем созданную переменную вне функции
new(), питон выдаст ошибку.
Чтобы избежать её, используйте
globals().

def new(name,value):
    globals()[name] = value

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


Как удалить несколько элементов сразу из массива?
Я писал алгоритм для одной работы, и столкнулся с одной проблемой: А как удалить несколько элементов сразу с массива?
Например есть такой код:

a = [1,2,3,4,5]
b = [1,3,5]
a.remove(*b)

этот код не работает (выдает ошибку, что
.remove() должен получить только один элемент).
Есть и еще такой код:

a = [1,2,3,4,5]
b = [1,3,5]
for i in b:
    a.remove(i)

Но проблема этого кода в том, что он медленный (и
a, и
b имеют более 1000 элементов).
Есть ли алгоритмы (или команды), которые смогут решить такую проблему?

Встроенный тип
set (множество) поддерживает операцию вычитания (
-):

a = [1,2,3,4,5]
b = [1,3,5]

print(list(set(a) - set(b)))

Вывод:

[2, 4]


Почему при назаначении атрибута по умолчания 0 выходит такая ошибка: IndentationError: unindent does not match any outer indentation level [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

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

Закрыт 1 месяц назад.

                        Улучшить вопрос

<code>
class Restaurant():

    def __init__(self, restaurant_name, cuisine_type):
        self.restaurant_name=restaurant_name
        self.cuisine_type=cuisine_type
        self.served = 0 #в чем ошибка?

    def describe_restaurant(self):
        print(f"{self.restaurant_name} ({self.cuisine_type}) is wonderful place for visiting")

    def open_restaurant(self):
        print(f"{self.restaurant_name} is open today")

    def number_served(self):
        print(f"The number of people served: {self.served}")

    def update_served(self, update):
        self.served=update

restaurant=Restaurant('Огни Ташкента', 'национальная кухня')
restaurant2=Restaurant('Yapona mama', 'pan asian')
restaurant3=Restaurant('Miliy taomlar', 'National uzbek food')

restaurant.describe_restaurant()
restaurant.open_restaurant()
restaurant.update_served(45)
restaurant.number_served()
</code>

IndentationError: unindent does not match any outer indentation level говорит о проблеме с отступами в коде. Скопируйте код из этого вопроса, он должен сработать. У меня по крайней мере он работает.


помогите перейти к графическому интерфейсу [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 1 месяц назад.

                        Улучшить вопрос

всем привет, есть задача - создать алгоритм решения линейных неравенств с одной переменной на питоне и сделать его визуализацию с помощью посторонних библиотек, типо tkinter, никогда не делал ничего подобного, возможно, кто-то может помочь мне с этим?
на выводе желательно видеть ответ, чем может быть x, и координатную прямую, где как-то показано, например, другим цветом или штрихом доступную область значений x
нужно создать прямую и чтобы на ней отмечался отрезок со значениями, которые допускает неравенство. плюсом нужно ещё как-то подать это в виде как для -2x =< 5 вывести x есть [-2,5 ; +∞) и чтобы такие ответы были на каждый запрос, от пользователя должно приниматься значения k и b - некие числа, а программа должна всё посчитать и выдать результат, о котором говорилось выше, вот алгоритм для терминала:
<code>
def main():
print("Введите числа k и b: ", end="")
k, b = map(float, input().split())
print("Введите знак неравенства: ", end="")
zn = str(input())

if k == 0:
    if zn == '<=' or zn == '<':
        print('x - любое число')
    else:
        print('x - любое число')
else:
    prb = b/k

    if b < 0 or k < 0:
        if zn == '>':
            zn = '<'
        elif zn == '<':
            zn = '>'
        elif zn == '>=':
            zn = '<='
        elif zn == '<=':
            zn = '>='

    print('Ответ: ', end="")
    if zn == '>=':
        print(f'x есть [{prb} ; +inf)')
    elif zn == '>':
        print(f'x есть ({prb} ; +inf)')
    elif zn == '<=':
        print(f'x есть (-inf ; {prb}]')
    elif zn == '<':
        print(f'x есть (-inf ; {prb})')

main()
</code>

попробуй так:
<code>
import tkinter as tk
# Если появляется ошибка AttributeError: module 'backend_interagg' has no attribute 'FigureCanvas',
# можно попробовать использовать следующие строки:
# import matplotlib
# matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
import numpy as np

def main(k, b, zn):
    if k == 0:
        if zn in ('<=', '<'):
            return 'x есть (-∞ ; +∞)'
        else:
            return 'x - любое число'
    else:
        prb = b / k

        if b < 0 or k < 0:
            if zn == '>':
                zn = '<'
            elif zn == '<':
                zn = '>'
            elif zn == '>=':
                zn = '<='
            elif zn == '<=':
                zn = '>='

        if zn == '>=':
            return f'x есть [{prb} ; +∞)'
        elif zn == '>':
            return f'x есть ({prb} ; +∞)'
        elif zn == '<=':
            return f'x есть (-∞ ; {prb}]'
        elif zn == '<':
            return f'x есть (-∞ ; {prb})'

def calculate():
    # Функция для расчетов и построения графиков.
    k = float(k_entry.get())  # Получаем значение k из текстового поля и преобразуем его в число.
    b = float(b_entry.get())  # Получаем значение b из текстового поля и преобразуем его в число.
    zn = zn_entry.get()  # Получаем значение знака неравенства.

    result = main(k, b, zn)  # Вызываем функцию для решения неравенства.
    result_label.config(text=result)  # Обновляем текст результата.

    fig, ax = plt.subplots()  # Создаем новый график.
    x = np.linspace(-10, 10, 400)  # Генерируем 400 равномерно распределенных значений от -10 до 10.
    y = [k * xi + b if k * xi + b >= 0 else np.nan for xi in x]  # Создаем массив y в соответствии с условиями.
    ax.plot(x, y, label=f'y = {k}x + {b}')  # Строим график.
    ax.axhline(0, color='black', linewidth=0.5)  # Добавляем горизонтальную ось.
    ax.axvline(0, color='black', linewidth=0.5)  # Добавляем вертикальную ось.
    ax.legend()  # Добавляем легенду.

    canvas = FigureCanvasTkAgg(fig, master=window)  # Создаем объект "полотно" для Tkinter.
    canvas_widget = canvas.get_tk_widget()  # Получаем виджет для встраивания.
    canvas_widget.grid(row=4, columnspan=3)  # Размещаем виджет на форме.

window = tk.Tk()  # Создаем основное окно приложения.
window.title("Решение линейных неравенств")  # Устанавливаем заголовок окна.

k_label = tk.Label(window, text="k:")  # Создаем надпись "k:".
k_label.grid(row=0, column=0)  # Размещаем надпись на форме.
k_entry = tk.Entry(window)  # Создаем поле для ввода k.
k_entry.grid(row=0, column=1)  # Размещаем поле для ввода на форме.

b_label = tk.Label(window, text="b:")  # Создаем надпись "b:".
b_label.grid(row=1, column=0)  # Размещаем надпись на форме.
b_entry = tk.Entry(window)  # Создаем поле для ввода b.
b_entry.grid(row=1, column=1)  # Размещаем поле для ввода на форме.

zn_label = tk.Label(window, text="Знак неравенства:")  # Создаем надпись "Знак неравенства:".
zn_label.grid(row=2, column=0)  # Размещаем надпись на форме.
zn_entry = tk.Entry(window)  # Создаем поле для ввода знака неравенства.
zn_entry.grid(row=2, column=1)  # Размещаем поле для ввода на форме.

calculate_button = tk.Button(window, text="Рассчитать", command=calculate)  # Создаем кнопку "Рассчитать".
calculate_button.grid(row=3, columnspan=2)  # Размещаем кнопку на форме.

result_label = tk.Label(window, text="")  # Создаем метку для вывода результата.
result_label.grid(row=3, column=2)  # Размещаем метку на форме.

window.mainloop()  # Запускаем главный цикл обработки событий.
</code>


Как автоматически добавить в Json еще данных с помощью кода не залезая в Json
Мне нужно чтобы код мог сам добавить данные в Json
Я пытался но особо не вышло :(
структура Json:

{
  "a": {
    "name":"base",
    "num":"400"
  },
  "b": {
    "name":"home",
    "num":"10"
  }
}

код:

import json
import dpath.util
with open('base.json',encoding="utf-8") as f:
    templates=json.load(f)
while True:
    b=input()
    if b in templates:
        c=dpath.util.get(dpath.util.search(templates, b), "**/name")
        d=dpath.util.get(dpath.util.search(templates, b), "**/num")
        print(f"Название:{c},ID:{d}")
    else:
        print("Нет в базе , для добавления введите 'y'")
        f=input("")
        if f=="y":
            with open('base.json',"w",encoding="utf-8") as f:
                #запись
        else:
            pass

Вариант решения.
json.load() в данном случае возвращает вложенный словарь, поэтому импортировать
dpath не требуется. Встроил еще выход из бесконечного цикла. Поскольку много ручного ввода, целесообразно добавить проверки введенных значений.

import json

fname = r'c:\test\base.json'
with open(fname, encoding="utf-8") as f:
    templates = json.load(f)

while True:
    b = input("Введите ключ (для выхода введите пустую строку): ")
    if b in templates:
        print(f"Название:{templates[b]['name']},ID:{templates[b]['num']}")
    elif not b:
        break
    else:
        f = input("Нет в базе, для добавления введите 'y': ")
        if f.casefold() == "y":
            data = input(f"Введите 'name' и 'num' для ключа `{b}` через пробел: ").split()
            templates[b] = {'name': data[0], 'num': data[1]}
            with open(fname, "w", encoding="utf-8") as f:
                json.dump(templates, f, indent=2)

На входе base.json:

{
  "a": {
    "name":"base",
    "num":"400"
  },
  "b": {
    "name":"home",
    "num":"10"
  }
}

Вывод:

Введите ключ (для выхода введите пустую строку): a
Название:base,ID:400
Введите ключ (для выхода введите пустую строку): b
Название:home,ID:10
Введите ключ (для выхода введите пустую строку): c
Нет в базе, для добавления введите 'y': y
Введите 'name' и 'num' для ключа `c` через пробел: dacha 150
Введите ключ (для выхода введите пустую строку):

Process finished with exit code 0

На выходе base.json:

{
  "a": {
    "name": "base",
    "num": "400"
  },
  "b": {
    "name": "home",
    "num": "10"
  },
  "c": {
    "name": "dacha",
    "num": "150"
  }
}


Получить теги при помощи Python
прошу вашей помощи, каким образом я могу получить теги из такого текста (при помощи Regex)?:

str_ = '<lemma id=1 rev=1>;<l t=ёж>;<g v=NOUN/>;<g v=anim/>;<g v=masc/>;</l>;<f t=ёж>;<g v=sing/>;<g v=nomn/>;</f>;<f t=ежа>;<g v=sing/>;<g v=gent/>;</f>;<f t=ежу>;<g v=sing/>;<g v=datv/>;</f>;<f t=ежа>;<g v=sing/>;<g v=accs/>;</f>;<f t=ежом>;<g v=sing/>;<g v=ablt/>;</f>;<f t=еже>;<g v=sing/>;<g v=loct/>;</f>;<f t=ежи>;<g v=plur/>;<g v=nomn/>;</f>;<f t=ежей>;<g v=plur/>;<g v=gent/>;</f>;<f t=ежам>;<g v=plur/>;<g v=datv/>;</f>;<f t=ежей>;<g v=plur/>;<g v=accs/>;</f>;<f t=ежами>;<g v=plur/>;<g v=ablt/>;</f>;<f t=ежах>;<g v=plur/>;<g v=loct/>;</f>;</lemma>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\
    <lemma id=2 rev=2>;<l t=ёж>;<g v=NOUN/>;<g v=inan/>;<g v=masc/>;</l>;<f t=ёж>;<g v=sing/>;<g v=nomn/>;</f>;<f t=ежа>;<g v=sing/>;<g v=gent/>;</f>;<f t=ежу>;<g v=sing/>;<g v=datv/>;</f>;<f t=ёж>;<g v=sing/>;<g v=accs/>;</f>;<f t=ежом>;<g v=sing/>;<g v=ablt/>;</f>;<f t=еже>;<g v=sing/>;<g v=loct/>;</f>;<f t=ежи>;<g v=plur/>;<g v=nomn/>;</f>;<f t=ежей>;<g v=plur/>;<g v=gent/>;</f>;<f t=ежам>;<g v=plur/>;<g v=datv/>;</f>;<f t=ежи>;<g v=plur/>;<g v=accs/>;</f>;<f t=ежами>;<g v=plur/>;<g v=ablt/>;</f>;<f t=ежах>;<g v=plur/>;<g v=loct/>;</f>'

Необходимо извлечь в массив строк теги l и f полностью, вот так:

<l t=ёж>;<g v=NOUN/>;<g v=anim/>;<g v=masc/>;</l>
<f t=ёж>;<g v=sing/>;<g v=nomn/>;</f>

и т.д.

Можно так:

import re

m = re.findall(r'<[lf][^e].*?>.+?</[lf]>', str_)

for i in m:
    print(i)

Объяснение регулярки:

<[lf] - символ
<, а затем
l или
f;

[^e] - любой символ, кроме
e (чтобы исключить тег
lemma);

.*?> - любой символ сколько-то раз (в том числе и ноль).
? означает "ленивый" поиск, т. е. он заканчивается при вхождении символа
> (иначе этой части шаблона соответствовала бы вся строка до последнего символа
>);

.+? - какой-то текст между открывающимся и закрывающимся тегом. И опять "ленивый" поиск.

</[lf]> - закрывающийся тег
l или
f.

Вывод:

<l t=ёж>;<g v=NOUN/>;<g v=anim/>;<g v=masc/>;</l>
<f t=ёж>;<g v=sing/>;<g v=nomn/>;</f>
...


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

>>> 'abcdefabc'.count('abc')
2
>>> 'aaa'.count('a')
3
>>> 'abca'.count('a')
2

И тут вдруг:

>>> 'catcatcat'.count('catcat')
1

По идее,
count() должна возвращать количество вхождений подстроки в строку. Получается, что она возвращает количество непересекающихся вхождений.
Вопрос: как быть в случае, если нужно вернуть общее количество вхождений, вместе с пересечениями? То есть, чтобы последний пример возвращал
2?

Регулярное выражение:
<code>
len(re.findall('(?=catcat)', 'catcatcat'))
</code>
Ответ взят с английского SO: String count with overlapping occurrences.
Там предложено еще несколько решений.


Библиотека datetime не часы и минуты, а полностью все переменные
Нужно получить часы и минуты, но код выдает все значения (
гггг-мм-дд чч:мм:сс).
Вот код:

import datetime as dt
DATABASE = {
'Серёга': 'Омск',
'Соня': 'Москва',
'Дима': 'Челябинск',
'Алина': 'Красноярск',
'Егор': 'Пермь'
}
UTC_OFFSET = {
'Санкт-Петербург': 3,
'Москва': 3,
'Самара': 4,
'Новосибирск': 7,
'Екатеринбург': 5,
'Нижний Новгород': 3,
'Казань': 3,
'Челябинск': 5,
'Омск': 6,
'Ростов-на-Дону': 3,
'Уфа': 5,
'Красноярск': 7,
'Пермь': 5,
'Воронеж': 3,
'Волгоград': 4,
'Краснодар': 3,
'Калининград': 2
}
def what_time(friend):
    utc_time = dt.datetime.utcnow()
    city = DATABASE[friend]
    a=UTC_OFFSET[city]
    san=utc_time + dt.timedelta(hours=a)
    san.strftime('%H %M')
    return san
print(what_time('Соня'))

Вместо команды

san.strftime('%H %M')

которая, хотя и конвертирует значение переменой
san в строку часов и минут, но эту строку нигде не сохраняет (т.е. результат просто отбросит, не используя его),
примените

san = san.strftime('%H:%M')          # я добавил двоеточие между часами и минутами

чем полученную строку сохраните обратно в переменную
san.


Локальные переменные и списки

def fucn1(nums1: list[int], nums2: list[int]) -> list[list[int]]:
        answer = [nums1, nums2]

def func2(a, b):
        ans = [a, b]

Объясните пожалуйста, почему если изменить значение
answer[0], меняется значение
nums1, но при изменении
ans[0] значение
а не поменяется?

Допустим, есть у нас список:

a=['foo', 'bar']

Если вы просто напишите
b=a, то
b будет зависеть от
a (иначе говоря,
b станет ссылкой на
a), то есть когда мы изменяем элемент в списке
а, то этот же элемент изменится в списке
b. И наоборот. Пример:

a=['foo', 'bar']
b=a
b[0]='python'
print(b) #['python', 'bar']
print(a) #['python', 'bar']
a[0]=1
print(a) #[1, 'bar']
print(b) #[1, 'bar']

Это работает только со списками (массивами). Чтобы создать независимую копию списка, используйте стандартный метод
.copy(). Например:

a=['foo', 'bar']
b=a.copy()
b[0]='python'
print(b) #['python', 'bar']
print(a) #['foo', 'bar']
a[0]=1
print(a) #[1, 'bar']
print(b) #['python', 'bar']

P.S. Я разобрал это при условии, что
a и
b у автора вопроса в коде не являются списками


Цикл после первого элемента перестает работать
Проблема состоит в том, что в строках 12 и 13

for key in DATABASE:
    print(f"{key}")

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

DATABASE = {
'Серёга': 'Омск',
'Соня': 'Москва',
'Миша': 'Москва',
'Дима': 'Челябинск',
'Алина': 'Красноярск',
'Егор': 'Пермь',
'Коля': 'Красноярск'
}
def process_friend(name, query):
    for key in DATABASE:
        print(f"{key}")
        if key==name:
            if query == 'ты где?':
                return f"{name} в городе {DATABASE['name']}"
            else:
                return  '<неизвестный запрос>'
        else:
            return f'У тебя нет друга по имени {name}'
def process_query(query):
    n = query.split(', ')
    if n[0] == 'Анфиса':
        return process_anfisa(n[1])
    else:
        print(n[0])
        return process_friend(n[0], n[1])
print(process_query('Соня, ты где?'))

В вашем цикле

for key in DATABASE:

команды
if-
else, но всякая ветвь в них окончатся командой
return.
Команда
return возвращает в ней указанное значение, а затем немедленно окончит вызов функции
process_friend(), значит, другой переход циклом уже не совершится.

Когда вместо
return вы примените вызов функции
print(), ваш цикл будет продолжаться:

def process_friend(name, query):
    for key in DATABASE:
        print(f"{key = }")
        if key==name:
            if query == 'ты где?':
                print(f"{name} в городе {DATABASE[name]}")        # не DATABASE['name']
            else:
                print('<неизвестный запрос>')
        else:
            print(f'У тебя нет друга по имени {name}')

(Я в вашем коде исправил еще одну ошибку. :-))

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

        if query == 'ты где?':
            print(f"{name} в городе {DATABASE[name]}")
            return
        else:
            print('<неизвестный запрос>')
            return
    else:
        print(f'У тебя нет друга по имени {name}')
        return


Задача с CodeWars: Простой интерпретатор ассемблера
Не понимаю где я допустил ошибку. Вот условие задачи (через переводчик все прогнал, поэтому могут быть некоторые несущественные неточности):

Мы хотим создать простой интерпретатор ассемблера, который будет поддерживать следующие инструкции:

 - mov x y - копирует y(либо постоянное значение, либо содержимое регистра) в регистр x
 - inc x - увеличивает содержимое реестра x на единицу
 - dec x - уменьшает содержимое регистра x на единицу
 - jnz x y - переходит к инструкции y на шаг вперед (положительное значение означает вперед, отрицательное означает назад, y может быть регистром или константой), но только если x(константа или регистр) не равна нулю

Имена регистров указываются в алфавитном порядке (только буквы). Константы всегда являются
целыми числами (положительными или отрицательными).

Примечание: jnz инструкция перемещается относительно самой себя. Например, смещение -1 будет
продолжаться с предыдущей инструкции, а смещение 2 будет пропускать следующую инструкцию.

Функция примет входной список с последовательностью инструкций программы и выполнит их.
Программа завершается, когда больше нет инструкций для выполнения, и возвращает словарь
(таблицу в COBOL) с содержимым регистров.

Кроме того, каждому inc// в регистре всегда будет предшествовать a в регистре, поэтому вам
не нужно беспокоиться о неинициализированных регистрах dec jnz mov.

Пример:

["mov a 5"; "inc a"; "dec a"; "dec a"; "jnz a -1"; "inc a"]

visualized:

mov a 5
inc a
dec a
dec a
jnz a -1
inc a

Приведенный выше код в словах:

установите a для регистрации значение 5,
увеличить его стоимость на 1,
уменьшить его значение на 2,
затем уменьшайте его значение, пока оно не станет равным нулю ( jnz a -1 переход к предыдущей инструкции, если a оно не равно нулю)
а затем увеличить его значение на 1, оставив регистр a равным 1

функция должна вернуть:

{'a': 1}

мое решение:

class Interpreter:
    counter = 0
    program = None

    def __init__(self):
        self.regs = {}

    def mov(self, val_1: str, val_2: str):
        if val_2.isalpha():
            val_2 = self.regs[val_2]
        self.regs[val_1] = int(val_2)

    def inc(self, reg: str):
        self.regs[reg] += 1

    def dec(self, reg: str):
        self.regs[reg] -= 1

def simple_assembler(program):
    len_ = len(program)
    ex = Interpreter()
    Interpreter.program = program
    while Interpreter.counter < len_:
        spl = Interpreter.program[Interpreter.counter].split()
        try:
            controller(spl[0], spl[1], spl[2], ex=ex)
        except IndexError:
            controller(spl[0], spl[1], ex=ex)
    Interpreter.counter = 0
    Interpreter.program = None
    return ex.regs

def controller(instruction, val_1, val_2=None, ex=None):
    if not val_2:
        match instruction:
            case 'inc':
                ex.inc(val_1)
            case 'dec':
                ex.dec(val_1)
    else:
        match instruction:
            case 'mov':
                ex.mov(val_1, val_2)
            case 'jnz':
                if val_1.isalpha():
                    val = val_1
                    if ex.regs[val] <= 0:
                        Interpreter.counter += 1
                        return
                else:
                    val = int(val_1)
                    if val <= 0:
                        Interpreter.counter += 1
                        return

                if val_2.isalpha():
                    step = ex.regs[val_2]
                else:
                    step = int(val_2)

                next_instruction = Interpreter.program[Interpreter.counter + step].split()[0]
                controller(instruction=next_instruction, val_1=val, ex=ex)
                Interpreter.counter = Interpreter.counter + step
                return
    Interpreter.counter += 1

# первая тестовая строка, тут все ок, при ее передаче в simple_assembler() ответ должен быть: {'a': 1}
s1 = '''\
mov a 5
inc a
dec a
dec a
jnz a -1
inc a'''

# вторая и последняя тестовая строка из базовых тестов, у меня получается ответ:
# {'c': 12863, 'b': 12863, 'a': 12863}, а правильный: {'a': 409600, 'c': 409600, 'b': 409600}
s2 = '''\
mov c 12
mov b 0
mov a 200
dec a
inc b
jnz a -2
dec c
mov a b
jnz c -5
jnz 0 1
mov c a'''
# print(simple_assembler(s1.splitlines()))
print(simple_assembler(s2.splitlines()))

Мне бы понять, что я  делаю не так: неправильно понимаю логику работы некоторых инструкций? Например,
jnz x y, как я понимаю, должен перебрасывать "указатель" выполнения на
y шагов в зависимости от знака, и выбирать инструкцию, которая располагается на получившийся позиции с регистром
x, если конечно число
x != 0 или его содержимое, если
x - это регистр. А после этого инструкции идут также по порядку или управление возвращается сразу к
jnz?

В
jnz ошибка. Все проверки должны быть на (не)равенство нулю (Jump if Not Zero). После
jnz инструкции идут по порядку с нового места.
Проверка
if not val_2: сработает для нуля. Надо писать
if val_2 is not None:.

match умеет различать списки разных длин.

def simple_assembler(program):
    regs = {}
    ip = 0

    def get_value(x):
        return regs[x] if x.isalpha() else int(x)

    while 0 <= ip < len(program):
        match program[ip].split():
            case ['mov', x, y]:
                regs[x] = get_value(y)
                ip += 1
            case ['inc', x]:
                regs[x] += 1
                ip += 1
            case ['dec', x]:
                regs[x] -= 1
                ip += 1
            case ['jnz', x, y]:
                ip += get_value(y) if get_value(x) != 0 else 1

    return regs

P.S. Вместо интерпретатора можно написать оптимизирующий компилятор. Но он будет раза в три больше.


Python, "вычитаение" списков с сохранением последовательности
есть:
<code>
a = [5, 2]
b = [5, 2, 7, 8]
</code>
нужно "вычесть" a из b и получить [7, 8]

a = [5, 2]
b = [5, 2, 7, 8]

set_a = set(a)
c = [v for v in b if v not in set_a]

print(c)


Как использовать оператор in в lambda-функции? python
Уважаемые знатоки Python, помогите, пожалуйста, разобраться с языком начинающему аналитику!
Задача: есть огромный список городов (6к+), в который затесались  названия улиц, и совхозов и т.д. Хочу оставить только крупные города, а для остальных написать "другие".
Решила начать с малого, чтобы проверить работоспособность функции:

data['big_city'] = data['city'].apply(lambda x: 'другие' if 'имени' in x)

Выдает
InvalidSyntax. Никак не пойму, в чем проблема.
Пробовала через def, но тогда выдает

TypeError: argument of type float is not iterable.

Хотя у меня строковые значения, и цифр там вообще нет.

TypeError: argument of type float is not iterable.

Скорее всего у вас в данных есть
NaN, а
NaN в
Pandas/
Numpy имеет тип
float. Соответственно конструкция
'имени' in x, где
x имеет тип
float приводит к такой вот ошибке. Вам нужно что-то сделать с
NaN, например, поменять их на пустую строку перед
apply через
.fillna, ну и учесть комментарии и ответы насчёт того, что тернарный оператор обязательно должен иметь ещё часть
else. Но вообще такая задача как ваша может решаться и по-другому:

# сначала копируем все города
data['big_city'] = data['city']
# а потом заменяем те, где есть 'имени' на 'другие'
data.loc[data['city'].str.contains('имени'), 'big_city'] = 'другие'

Возможно, в этом варианте что-то тоже придётся делать с
NaN, для этого у
str.contains есть параметр
na=, где можно указать, какое значение считать за
NA.


Как найти элемент "a" с самым большим индексом?
У меня дан список, например
['a', 'b', 'c', 'd', 'a', 'b', 'n', 'a'] и мне надо найти элемент
"a" с самым большим индексом.
Этот код выведет
0:

list = ['a', 'b', 'c', 'd', 'a', 'b', 'n', 'a']
print(list.index('a')) #выведет 0

А мне надо, чтобы элемент
"a" с наибольшим индексом.

Универсальная версия, под разные символы.
<code>
def foo(need_symbol, simple_list):
    all_max_pos = {}
    for i, pos in zip(simple_list, range(0, len(simple_list))):
        all_max_pos[i] = pos
    print(f'Max index is = {all_max_pos[need_symbol]}')

def choose(simple_list):
    print(simple_list)
    print("pick symbol for show max index:")
    need_symbol = input("Put symbol here ==>    ")
    return need_symbol

def main():
    simple_list = ["a","b","c","d","a","b","n","a"]
    need_symbol = choose(simple_list)
    foo(need_symbol, simple_list)

main()
</code>


Как нарисовать 9-ти конечную звезду на turtle? [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Учебные задания допустимы в качестве вопросов только при условии, что вы пытались решить их самостоятельно перед тем, как задать вопрос. Пожалуйста, отредактируйте вопрос и укажите, что именно вызвало у вас трудности при решении задачи. Например, приведите код, который вы написали, пытаясь решить задачу

Закрыт 1 месяц назад.

                        Улучшить вопрос

Как нарисовать 9-ти конечную звезду на turtle?

Вот так
<code>
import turtle

screen = turtle.Screen()
star = turtle.Turtle()

star.penup()
star.goto(-100, 0)
star.pendown()
star.speed(2)

for _ in range(9):
    star.forward(100)
    star.right(160)

turtle.done()
</code>


Удалить элементы из вложенного словаря python [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Учебные задания допустимы в качестве вопросов только при условии, что вы пытались решить их самостоятельно перед тем, как задать вопрос. Пожалуйста, отредактируйте вопрос и укажите, что именно вызвало у вас трудности при решении задачи. Например, приведите код, который вы написали, пытаясь решить задачу

Закрыт 1 месяц назад.

                        Улучшить вопрос

У меня есть вложенный словарь, подскажите как можно удалить пустые строки из такого словаря?

myDict = {
'foo': {
'a':[12,””,13, “”],'b':[14,””,””,””] },
'bar':
{'c':[12,””,””,””],'b':[14,11,13,12] },
'moo':
{'a':[12,””,10,””],'d':[14,””,””,””]
}
}

Получить необходимо следующее

myDict = {
'foo': {
       'a':[12,13],'b':[14] },
'bar': {
        'c':[12],'b':[14,11,13,12] },
'moo': {
        'a':[12,10],'d':[14 ]
} }


Как передать аргументы в класс, вызываемый через другую функцию
Работаю с библиотеками discord.py и pycord. У меня есть функция выдавания кредита, в ней получается сумма, срок, находится процентная ставка:

@bot.slash_command(name='кредит', description='Взять кредит')
async def kredit(ctx, summa:  Option(int, description='Введите желаемую сумму (от 1000 до 100000 монет)', required=True), srok: Option(int, description='Введите срок кредита (от 3 до 14 дней)', required=True)):
    ...

Я хочу сделать кнопки согласия и отказа взятия кредита на данных кредитных условиях. Большинство людей работают с кнопками в отдельном классе (обычно он носит название MyView()). Сработает ли это для меня?.. Ведь мне нужно передать аргументы (сумму, срок и процентную ставку) в этот класс... Можно ли так сделать?
P.S

вызываемый через другую функцию

Вызываю его через функцию
await bot.respond('text', view=MyView()).

Спасибо @denisnumb за ответ в комментариях.
В классе
MyView() следует создать функцию
__init__ с аргументами, которые мы хотим передать и определить
self-переменные:

class MyView(discord.ui.View):
    def __init__(self, summa, srok):
        super().__init__()
        self.summa = summa
        self.srok = srok
    ...

Далее сообщение с кнопками
await bot.respond('text', view=MyView()) заменяем на
await bot.respond('text', view=MyView(summa, srok)).

Использовать переменные в классе можно с помощью
self.summa и
self.srok.


Почему не работает ветвление?
Напишите программу для решения следующей задачи. На зачете по физике ученикам 10 класса было предложено 15 примеров. Зачет ставится, если правильно решено более половины примеров. Сколько зачетов было получено учениками? Если хотя бы один из учеников правильно решил все задачи, выведите YES, иначе выведите NO. Программа получает на вход количество учеников в классе N (1 ≤ N ≤ 30), затем для каждого ученика вводится количество правильно решённых примеров.
Вот программа при сравнении print(temp == 15) выводит True
В условном блоке не работает(!)

N = int(input())
i = 0
count = 0
msg = "YES"
while i < N:
    temp = int(input())
    if temp == 15:
        msg = "YES"
    else:
        msg = "NO"
    if temp >= 8 and temp < 15:
        count = count + 1
    i=i+1
print(count)
print(msg)

спасибо всем за ответы! Получилось вот так:

N = int(input())
i = 0
count = 0
array = []
while i < N:
    temp = int(input())
    if temp >= 8 and temp <= 15:
        count = count + 1
    if temp == 15:
        array.append(temp)
    i=i+1
print(count)
if len(array) > 0:
    print("YES")
else:
    print("NO")

У вас неправильная логика. Если нужно определить, что хотя бы один ученик решил 15 задач, то не нужно сбрасывать сообщение в "NO" на следующем ученике. А начальное значение как раз нужно установить "NO"
<code>
msg = "NO"
while i < N:
    temp = int(input())
    if temp == 15:
        msg = "YES"
    if 8 <= temp <= 15:
        count = count + 1
    i=i+1
</code>