Ошибка `'NoneType' object has no attribute '_root'` при создании `StringVar`
Вот код:

from tkinter import *
from tkinter import font
from tkinter import ttk
import os

def TFN():
    GNFN = CN.get()
    print(GNFN)

Black = "Black"
Blue = "Blue"
Red = "Red"

CV = StringVar(value=Black)
FIN = []
GNFN = ""
FTV = ""
F = ""
LY = 30
OP = ""

root = Tk()
root.title("FILE READER")
root.geometry("2500x1000")

canvas = Canvas(bg="white", width=2500, height=1000)
canvas.pack(anchor=CENTER, expand=1)

def READ_FILE():
    def OF():
        canvas.delete(LFRID)
        canvas.delete(FRID)
        canvas.delete(OPOID)
        CFR = ttk.Label(text='Please choose the colour of the text')
        CFRID = canvas.create_window(999, 100, window=CFR, width=600, height=200)
        BCC = ttk.Radiobutton(text="Black", variable=CV, value=Black)
        BCCID = canvas.create_window(500, 300, anchor=NW, window=BCC, width=600, height=20)
        BLCC = ttk.Radiobutton(text="Blue", variable=CV, value=Blue)
        BLCCID = canvas.create_window(500, 350, anchor=NW, window=BLCC, width=600, height=20)
        RCC = ttk.Radiobutton(text="Red", variable=CV, value=Red)
        RCCID = canvas.create_window(500, 400, anchor=NW, window=RCC, width=600, height=20)
    FR = ttk.Entry(text="")
    FRID = canvas.create_window(500, 300, anchor=NW, window=FR, width=600, height=200)
    LFR = ttk.Label(text='Please enter the name of the file')
    LFRID = canvas.create_window(999, 100, window=LFR, width=600, height=200)
    OPO = ttk.Button(text="OK", command=OF)
    OPOID = canvas.create_window(999, 530, anchor=NW, window=OPO, width=50, height=50)

def START():
    global LY
    canvas.delete(SBID)
    directory = 'D:/Python files'
    for filename in os.listdir(directory):
        f =  filename
        FIN.append(f)
        canvas.create_text(600, LY, font="Arial 50", anchor=NW, text=f, fill="#004D40")
        LY = LY + 80
    AB = ttk.Button(text="ADD FILE", command=ADD_FILE)
    ABID = canvas.create_window(100, 100, anchor=NW, window=AB, width=300, height=800)
    RB = ttk.Button(text="READ FILE", command=READ_FILE)
    RBID = canvas.create_window(1600, 100, anchor=NW, window=RB, width=300, height=800)

SB = ttk.Button(text="START", command=START)
SBID = canvas.create_window(690, 30, anchor=NW, window=SB, width=600, height=200)

def ADD_FILE():
    def TFN():
        GNFN = NFN.get()
        canvas.delete(NFNID)
        canvas.delete(CNID)
        canvas.delete(LFNID)
        file = open("D:/Python files/" + GNFN + ".txt", "w")
        for filename in os.listdir("D:/Python files"):
            print(filename)
    LFN = ttk.Label(text='Please enter the name of the file')
    LFNID = canvas.create_window(999, 100, window=LFN, width=600, height=200)
    NFN = ttk.Entry(text="")
    NFNID = canvas.create_window(500, 300, anchor=NW, window=NFN, width=600, height=200)
    CN = ttk.Button(text="OK", command=TFN)
    CNID = canvas.create_window(999, 530, anchor=NW, window=CN, width=50, height=50)

root.mainloop()

Строчка с выдаваемой ошибкой находится в самом начале.
Вот ошибка:

Traceback (most recent call last):
 File "C:\Users\Sergei\Desktop\Text-file-creator\Text file creator.py", line 14, in <module>
    CV = StringVar(value=Black)
  File "C:\Users\Sergei\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line
505, in __init__
    Variable.__init__(self, master, value, name)
  File "C:\Users\Sergei\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line
335, in __init__
    self._root = master._root()
AttributeError: 'NoneType' object has no attribute '_root'

Я не понимаю что это за ошибка, помогите пожалуйста.

Добро пожаловать на StackOverflow!
Дело в том, что вы объявляете переменную
CV до создания корневого окна
tk. Просто перенесите строку
CV = StringVar(value=Black) ниже строки
root = Tk() и код заработает


Сравнение даты из списка, попадает ил она в диапазон дат
Получаю из базы данных список дат.

conn = sqlite3.connect(config.base_sql)
cur = conn.cursor()
cur.execute('SELECT date FROM smena')
info_sql = cur.fetchall()
cur.close()
conn.close()

И вот сейчас я пытаюсь понять, как мне сделать следующую конструкцию. У меня есть дата 1 и дата 2, я хочу узнать, попадает ли каждая дата из списка в промежуток между дата 1 и дата 2.
UPD:
из базы я получают список дат, мне необходимо вывести те даты, которые попадают в заданный промежуток.
Пример я получаю список дат:

[('13-12-2017',), ('13-12-2018',), ('13-12-2015',), ('21-12-2027',), ('21-07-2022',), ('21-07-2028',)]

Мне нудно понять, какие даты попадают в промежуток с 01.06.2022 по 01.08.2022. Промежуток будет формироваться позже автоматов за текущий месяц.
Возможно есть ли какая-то библиотека, или я не вижу простого решения.
UPD2:
Видимо без парсера дат мне не обойтись.
UPD3:
Из базы я получаю следующие значения и типы:
info_sql = list [((str),tuple),((str),tuple),((str),tuple)]
т.е. внути типо list, внути контежи с str.

Вы можете использовать модуль
datetime
Вот пример:

import datetime
date1 = datetime.date(day=1, month=1, year=2023)
date2 = datetime.date(day=31, month=1, year=2023)
date3 = datetime.date(day=15, month=1, year=2023)
print(date1 < date3 < date2)
# Возвращает True

Если вам понадобится перевести строку в объект типа
datetime.Date, вы можете воспользоваться функцией
strptime, вот пример:

import datetime
print(datetime.datetime.strptime('24052010', "%d%m%Y").date())
# datetime.date(2010, 5, 24)

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

import datetime

def convert_to_date_list(str_list: list[tuple[str]]) -> list[datetime.datetime]:
    return [datetime.datetime.strptime(tup[0], "%d-%m-%Y") for tup in str_list]

def in_range(date_list: list[datetime.datetime], date_from: datetime.datetime, date_to: datetime.date) -> list[datetime.datetime]:
    return [date for date in date_list if date_from <= date <= date_to]

date_from = datetime.datetime(day=1, month=6, year=2022)
date_to = datetime.datetime(day=1, month=8, year=2022)
str_list = [('13-12-2017',), ('13-12-2018',), ('13-12-2015',),
            ('21-12-2027',), ('21-07-2022',), ('21-07-2028',)]
date_list = convert_to_date_list(str_list)
filtered = in_range(date_list, date_from, date_to)
for date in filtered:
    print(date.strftime("%d-%m-%Y"))


Обработка исключения в асинхронном коде
<code>
import asyncio

async def producer(queue):
    for i in range(7):
        await queue.put(i)
        await asyncio.sleep(0.2)
        print('Producer Queue size:', queue.qsize())

async def consumer(queue):
    try:
        while True:
            item = await queue.get()
            await asyncio.sleep(0.3)
            print(item)

            if item is None:
                print('Queue is empty')
                queue.task_done()
                break

            if item == 3:
                raise TypeError("Producer got exception")

            queue.task_done()
            print('Queue size:', queue.qsize())

    except TypeError as e:
        print(f'Error happened asf {e}')
        queue.task_done()
        raise e

async def main():
    queue = asyncio.Queue()
    producer_task = asyncio.create_task(producer(queue))
    consumer_task = asyncio.create_task(consumer(queue))

    # Запуск продюсера
    await asyncio.gather(producer_task)
    await queue.put(None)
    # .join чтобы работало пока очередь непуста
    await queue.join()
    consumer_task.cancel() # Выход из цикла while
    # Запуск consumer_task с возвратом ошибок
    result = await asyncio.gather(consumer_task, return_exceptions=True)
    print(result)

if __name__ == '__main__':
    asyncio.run(main())
</code>
Пытаюсь отловить инициированную ошибку TypeError, но скрипт продолжает висеть и не могу понять где именно тонкое место.
Приходится обращаться к коллективному разуму.

Чтобы обработать ошибку
TypeError и продолжить исполнение, вы должны:

Поместить обработку внутрь цикла
while
Убрать строчку
raise e

Также может возникать ошибка, связанная с тем, что вы не применяете оператор
await к вызову корутины
queue.put(None) в блоке "Запуск продюсера". Вот исправленная версия кода:

import asyncio

async def producer(queue):
    for i in range(7):
        await queue.put(i)
        await asyncio.sleep(0.2)
        print('Producer Queue size:', queue.qsize())

async def consumer(queue):
        while True:
            try:
                item = await queue.get()
                await asyncio.sleep(0.3)
                print(item)

                if item is None:
                    print('Queue is empty')
                    queue.task_done()
                    break

                if item == 3:
                    raise TypeError("Producer got exception")

                queue.task_done()
                print('Queue size:', queue.qsize())

            except TypeError as e:
                print(f'Error happened asf {e}')
                queue.task_done()

async def main():
    queue = asyncio.Queue()
    producer_task = asyncio.create_task(producer(queue))
    consumer_task = asyncio.create_task(consumer(queue))

    # Запуск продюсера
    await asyncio.gather(producer_task)
    await queue.put(None)
    # .join чтобы работало пока очередь непуста
    await queue.join()
    consumer_task.cancel()  # Выход из цикла while
    # Запуск consumer_task с возвратом ошибок
    result = await asyncio.gather(consumer_task, return_exceptions=True)
    print(result)

if __name__ == '__main__':
    asyncio.run(main())

Как упомянул @andreymal, чтобы прервать исполнение, вы должны убрать строчку
await queue.join() в функции
main и вкрнуть строчку
raise e:

import asyncio

async def producer(queue):
    for i in range(7):
        await queue.put(i)
        await asyncio.sleep(0.2)
        print('Producer Queue size:', queue.qsize())

async def consumer(queue):
    while True:
        try:
            item = await queue.get()
            await asyncio.sleep(0.3)
            print(item)

            if item is None:
                print('Queue is empty')
                queue.task_done()
                break

            if item == 3:
                raise TypeError("Producer got exception")

            queue.task_done()
            print('Queue size:', queue.qsize())

        except TypeError as e:
            print(f'Error happened asf {e}')
            queue.task_done()
            raise e

async def main():
    queue = asyncio.Queue()
    producer_task = asyncio.create_task(producer(queue))
    consumer_task = asyncio.create_task(consumer(queue))

    # Запуск продюсера
    await asyncio.gather(producer_task)

    await queue.put(None)
    # .join чтобы работало пока очередь непуста
    consumer_task.cancel()  # Выход из цикла while
    # Запуск consumer_task с возвратом ошибок
    result = await asyncio.gather(consumer_task, return_exceptions=True)
    print(result)

if __name__ == '__main__':
    asyncio.run(main())


Python выдает ошибку как будто я использовал переменную до того как я дал ей значение, но это не так [дубликат]

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

Python функции и область видимости глобальных переменных

                                (2 ответа)

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

Я пишу программу которая бы выводила на экран файл в нужной мне папке и их содержимое.
Вот код с ошибкой:

from tkinter import *
from tkinter import ttk
import os

def TFN():
    GNFN = CN.get()
    print(GNFN)

FIN = []
GNFN = ""
FTV = ""
F = ""
LY = 30

root = Tk()
root.title("FILE READER")
root.geometry("2500x1000")

canvas = Canvas(bg="white", width=2500, height=1000)
canvas.pack(anchor=CENTER, expand=1)

def START():
    canvas.delete(SBID)
    directory = 'D:/Python files'
    for filename in os.listdir(directory):
        f =  filename
        FIN.append(f)
        canvas.create_text(400, LY, font="Arial 55", anchor=NW, text=f, fill="#004D40")
        LY = LY + 20
    AB = ttk.Button(text="ADD/OPEN FILE", command=ADD_FILE)
   ABID = canvas.create_window(100, 100, anchor=NW, window=AB, width=300, height=800)

Python выдает следующую ошибку:

line 30, in START
canvas.create_text(400, LY, font="Arial 55", anchor=NW, text=f, fill="#004D40")
UnboundLocalError: local variable 'LY' referenced before assignment

Я не понимаю что делать. В коде ясно указано что я указал LY = 30 и он все равно пишет мне что я это не сделал. Помогите.

Пишет, что переменная локальная для данной функции, и она действительно не задана. Если вам нужна та же самая LY, что описана снаружи, то пишите в функции
<code>
global LY
</code>
или используйте её в качестве аргумента функции или сделайте полем класса, если будете оформлять класс.


telegram-bot на python отправка сообщений по расписанию
Я новичок, пишу бот у которого хочу реализовать следующий функционал (основной функционал):
первый сценарий:

import random
import telebot
from telebot import types
from words import first, second, second_add, third, mes, pict

bot = telebot.TeleBot('TOKEN')

@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == 'Привет':
       bot.send_message(message.from_user.id, 'Привет!)')
       keyboard = types.InlineKeyboardMarkup()
       key_1 = types.InlineKeyboardButton(text='МУР', callback_data='МУР')
       keyboard.add(key_1)
       bot.send_message(message.from_user.id, text='Узнай!', reply_markup=keyboard)
    elif message.text == '/help':
        bot.send_message(message.from_user.id, text='Напиши Привет')
    else:
        bot.send_message(message.from_user.id, text='Я тебя не понимаю. Напиши Привет')

@bot.callback_query_handler(func=lambda call:True)
def callback_worker(call):
    if call.data == 'МУР':
# random.choice(first) - из файла word генерируются уже заданные слова
        msg = random.choice(first) + '' + random.choice(second) + '' + random.choice(second_add) + '' + random.choice(third) + '' + random.choice(pict)
        sent_message = bot.send_message(call.message.chat.id, msg)
        keyboard = types.InlineKeyboardMarkup()
        key_1 = types.InlineKeyboardButton(text='МУР', callback_data='МУР')
        keyboard.add(key_1)
        bot.edit_message_reply_markup(chat_id=sent_message.chat.id, message_id=sent_message.message_id, reply_markup=keyboard)

bot.polling(none_stop=True, interval=0)

Второй сценарий

import asyncio
import random
from datetime import datetime
from toke import bot, chat_id
from words import mes, pict

async def main():
    while True:
        now = datetime.now()
        if now.hour == 8 and now.minute == 22 and now.second == 0:
            await send_message()
        await asyncio.sleep(1)

async def send_message():
    await bot.send_message(chat_id=chat_id, text='Какой-то текст' + random.choice(pict))

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.create_task(main())
    loop.run_forever()

Не могу запустить оба функционала одновременно. Пробовал, через multiprocessing в main.py, не работает. Объединяя все в один файл, так же не работает, бот ждет отправки сообщения по времени, а основной функционал, не работает. Так же переписывал основную часть через async, попытка не удалась. Так же функционал отправки пробовал реализовать через schedule.
Если запускать второй код отдельно, сообщение он отправляет, но сразу же падает.
Подскажите каким образом можно реализовать?

Пример:

import time
from datetime import datetime
from threading import Thread
import schedule
import telebot
from telebot import types

bot = telebot.TeleBot('2145840652:AAHP6FegIyorKW6OQlFX6y6P3')

@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == 'Привет':
       bot.send_message(message.from_user.id, 'Привет!)')
       keyboard = types.InlineKeyboardMarkup()
       key_1 = types.InlineKeyboardButton(text='МУР', callback_data='МУР')
       keyboard.add(key_1)
       bot.send_message(message.from_user.id, text='Узнай!', reply_markup=keyboard)
    elif message.text == '/help':
        bot.send_message(message.from_user.id, text='Напиши Привет')
    else:
        bot.send_message(message.from_user.id, text='Я тебя не понимаю. Напиши Привет')

def main():
    print('Бот запущен')
    while True:
        now = datetime.now()
        if now.hour == 18 and now.minute == 22:
            send_message()
        time.sleep(50)

def main1():
    print('Бот запущен 2')
    schedule.every().day.at("18:34").do(send_message)
    while True:
        schedule.run_pending()
        time.sleep(1)

def send_message(chat_id=125748):
    bot.send_message(chat_id=chat_id, text='Какой-то текст')

Thread(target=main).start()
Thread(target=main1).start()
bot.polling(none_stop=True, interval=0)

рекомендую перейти на aiogram

import asyncio
import aioschedule as schedule
from aiogram import Bot, Dispatcher, executor
from aiogram.types import Message

API_TOKEN = '2145840652:AAHP6FegIyorKW6OQlFX6y6P3'

bot = Bot(API_TOKEN)
dp = Dispatcher(bot)

async def job(chat_id):
    await bot.send_message(chat_id=chat_id, text="I am working.")

@dp.message_handler(commands='start')
async def cmd_start(message: Message):
    print(message.chat.id)
    await bot.send_message(chat_id=message.chat.id, text=f"chat.id = {message.chat.id}")

async def run_scheduler():
    print("Starting scheduler")
    for hour in range(9, 21):
        schedule.every().day.at(f"{hour}:00").do(job, chat_id=125748)

    while True:
        await schedule.run_pending()
        await asyncio.sleep(1)

async def on_startup(_):
    asyncio.create_task(run_scheduler())

executor.start_polling(dp, on_startup=on_startup)


получить имя цвета из hex кода или максимально близкое
Я знаю что из имени цвета, можно получить hex код.
<code>
import matplotlib
print(matplotlib.colors.cnames["blue"])
</code>
А как получить наоборот имя цвета из hex?

Нашел вариант решения такой
<code>
from scipy.spatial import KDTree
from webcolors import (
    CSS3_HEX_TO_NAMES,
    hex_to_rgb,
)

css3_db = CSS3_HEX_TO_NAMES
names = []
rgb_values = []
for color_hex, color_name in css3_db.items():
    names.append(color_name)
    rgb_values.append(hex_to_rgb(color_hex))
kdt_db = KDTree(rgb_values)
distance, index = kdt_db.query(colors[0])
print(f'closest match: {names[index]}')
</code>


Почему вместе с нужным листом 4, сохраняются все 20 листов при сохранение файлов Excel?
Задача: Есть шаблон файла с
20 разными таблицами для отчёта, нужно заполнить их все, используя различную логику. Я прописываю её на pandas. Далее покажу свою проблему, на примере отчёта
4:
Есть
файл1, в котором содержится информация по деньгам и проектам.
Файл2, который содержит
20 разных шаблонов отчётов.
Мои действия: Открываю шаблон, произвожу необходимые вычисления с данными из
файла1, записываю в новый файл
Result (Важно, чтобы сохранялось исходное форматирование таблиц и шрифтов, поэтому использую
openpyxl, а не
pandas, для чтения и записи шаблона).
Проблема: при выполнении этого скрипта, создаётся новый файл
Result.xlsx, в нём всё правильно посчитано и сохранено исходное форматирование, но вместе с нужным листом 4, сохраняются все
20 листов исходных отчётов из
файла2. И если я запущу аналогичный скрипт для отчёта
5, то он сотрёт все предыдущие посчитанные отчеты и сохранит только отчёт
5 и
20 остальных пустых листов из
файла2.
А в итоге мне нужно прогнать все
20 скриптов, чтобы они сохранили и посчитали
20 отчётов в файле
Result. (т.е. нужно не перезаписывать этот файл, а просто добавлять к нему новый лист с вычислениями соответствующего скрипта)

import pandas as pd
from tqdm import tqdm
import openpyxl

def tablica4():
# Загружаем первый файл
file1 = pd.read_excel(r"C:\1\2\3\4\5\6\File1.xlsx",
                      sheet_name="File1")

# Открываем шаблон
workbook = openpyxl.load_workbook(filename='Отчет_шаблон.xlsx')
worksheet = workbook["4"]
workbook.active = worksheet

# Условия для фильтрации данных. Код строки
kod_3 = file1 .loc[file1 ['Тип'] == "Тип1"]
kod_4 = file1 .loc[file1 ['Тип'].isin(("Тип2", "Тип3"))]

# Суммируем поступления по фильтрованному столбцу
kod_3_4 = kod_3['Сумма'].sum() / 1000
kod_4_4 = kod_4['Сумма'].sum() / 1000
kod_2_4 = kod_3_4 + kod_4_4
kod_1_4 = kod_2_4

# Подсчитаем уникальные проекты
kod_3_3 = len(kod_3['ID'].unique())
kod_4_3 = len(kod_4['ID'].unique())
kod_2_3 = kod_3_3 + kod_4_3
kod_1_3 = kod_2_3

# Записываем данные в ячейки таблицы
worksheet['D8'].value = kod_3_4
worksheet['D9'].value = kod_4_4
worksheet['D7'].value = kod_2_4
worksheet['D6'].value = kod_1_4

worksheet['C8'].value = kod_3_3
worksheet['C9'].value = kod_4_3
worksheet['C7'].value = kod_2_3
worksheet['C6'].value = kod_1_3

workbook.save("Result.xlsx")

tablica4()

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

Вообще судя по описанию и коду всё работает так как я бы и ожидал:

вы открываете файл шаблона:
workbook = openpyxl.load_workbook(filename='Отчет_шаблон.xlsx')
выбираете конретный лист:
worksheet = workbook["4"]
модифицируете его (при этом все остальные листы шаблона на месте)
затем сохраняете его как новый файл
workbook.save("Result.xlsx")

Логично что каждый раз результат перезатирается пустым шаблоном с единственным модифицированным листом. В данном случае непонятно, каким же образом у вас всё корректно работает в случае
pandas
Я бы предположил что правильно было бы так:

открыть файл шаблона
скопировать из него лист в новую книгу
Result.xlsx
модифицировать уже его там
сохранить результат

Таким образом у вас в
Result.xlsx будут последовательно добавлятся листы с данными.
Другой вариант разово копировать шаблон в
Result.xlsx и далее работать только  ним, суть думаю понятна.


Почему программа работает только пока c не превысит (a+b)^3? [закрыт]

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

 Вопрос закрыт, так как на Stack Overflow на русском вопросы принято задавать только на русском языке. Пожалуйста, переведите ваш вопрос на русский язык или воспользуйтесь Stack Overflow на английском.

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

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

Задача: Напишите программу, которая из двух заданных натуральных чисел
a и
b создаст список, содержащий элементы 𝑐, являющиеся элементами последовательности Фибоначчи, по алгоритму:

c = a + b
a = b
b = c

пока
c не превысит
(a+b)^3, затем вернет сумму всех элементов созданного списка.
Например:
Для
a=2,
b=4 он вернет список символов
[6, 10, 16, 26, 42, 68, 110, 178] и сумму
456.
Мой код:

a, b = 2, 4
L = []
c = 0
while c != (a + b) ** 3:
        c = a + b
        a = b
        b = c
        L.append(c)
print(L)
print(sum(L))

Мне нужно, чтобы он выдавал
[6, 10, 16, 26, 42, 68, 110, 178] и сумму
456, но он даже не компилируется.

Судя по примеру, вам нужно запомнить начальные значения
a,b и сравнивать
с с кубом их суммы.
И "пока не превысит" не означает, что нужно ловить строгое равенство.

t = (a + b) ** 3
c = a + b
while c <= t:
    L.append(c)
    a = b
    b = c
    c = a + b


Помощь в улучшении алгоритма
Есть двумерный массив размера N*M (пример N = 4, M = 3)

[1, 0, 0]

[1, 1, 0]

[0, 1, 0]

[0, 0, 2]

нужно получить сумму произведений элементов в массиве длины М удовлетворяющих требованию

arr[i][j], arr[k][x], arr[q][p] где
i<k<q и j<x<p
в примере удовлетворяют условию группы элементов

arr[0][0],arr[1][1],arr[3][2] 1,1,2 прозведени 2
arr[0][0],arr[2][1],arr[3][2] 1,1,2 прозведени 2
arr[1][0],arr[2][1],arr[3][2] 1,1,2 прозведени 2

я написал программу с временной сложностью O(M * N* M)

def dfs(row,col,arr,p):
    if col == len(arr[0]):
        return p
    s = 0
    while row < len(arr):
        s+=dfs(row+1,col+1,arr,p*arr[row][col])
        row+=1
    return s
dfs(0,0,arr,1)

Но есть чувство что его можно улучшить до O(M * N) с помощью динамического программирования. Как это можно сделать?

fi,j - искомая сумма произведений для матрицы [0, i] × [0, j]. Тогда

fi,-1 = 1
fi,j = 0, если i < j
fi,j = ai,j·fi-1,j-1 + fi-1,j - первое слагаемое для всех последовательностей, которые заканчиваются в углу  ai,j, второе для тех которые заканчиваются раньше.

import functools

def f(a):

    @functools.cache
    def f(i, j):
        if j == 0:
            return 1
        if i < j:
            return 0
        return a[i][j] * f(i - 1, j - 1) + f(i - 1, j)

    return f(len(a) - 1, len(a[0]) - 1)

print(f([
    [1, 0, 0],
    [1, 1, 0],
    [0, 1, 0],
    [0, 0, 2]
]))

Сложность O(nm): благодаря кешу для каждой пары (i, j) f вычисляется один раз. Сложность одного вызова - константа. Могут быть проблемы с глубиной рекурсии. Тогда сделаем ручное кеширование:

def f(a):

    f = [[None] * len(r) for r in a]

    f[0][0] = a[0][0]
    for j in range(1, len(a[0])):
        f[0][j] = 0

    for i in range(1, len(a)):
        f[i][0] = a[i][0] + f[i - 1][0]
        for j in range(1, len(a[i])):
            f[i][j] = a[i][j] * f[i - 1][j - 1] + f[i - 1][j]

    return f[-1][-1]

print(f([
    [1, 0, 0],
    [1, 1, 0],
    [0, 1, 0],
    [0, 0, 2]
]))

Можно заметить что следующая строка кеша зависит только от предыдущей. Можно обойтись памятью O(m):

def f(a):
    f_row = [1] + [0] * len(a[0])
    for a_row in a:
        for j in reversed(range(len(a_row))):
            f_row[j + 1] += a_row[j] * f_row[j]
    return f_row[-1]

print(f([
    [1, 0, 0],
    [1, 1, 0],
    [0, 1, 0],
    [0, 0, 2]
]))


Как посчитать количество нужных букв в строке, с помощью анонимной функции python?
Допустим будет строка: '
Аааа Аааа, ну и ещё Ааааа'. Нужно вывести
True, если количество букв
А НЕ меньше 5, иначе
False. Причём, без учёте регистра. Пример:
print(anonim_function('Ааааа аа, и ещё ааа')), должна вернуть
True.

x = lambda x: True if x.lower().count("a") > 5 else False


Как проверить нормальность распределения остактов и дисперсию остатков для модели sklearn.linear_model?
Имеются следующие данные:

    date_trunc  mentor  mentee
0   2021-02-01  3       3
1   2021-03-01  3       3
2   2021-04-01  7       7
3   2021-05-01  18      19
4   2021-06-01  24      27
5   2021-07-01  37      35
6   2021-08-01  53      56
7   2021-09-01  63      70
8   2021-10-01  86      89
9   2021-11-01  102     114
10  2021-12-01  135     149
11  2022-01-01  154     169
12  2022-02-01  174     202
13  2022-03-01  232     287
14  2022-04-01  298     386
15  2022-05-01  343     475
16  2022-06-01  384     552
17  2022-07-01  446     684
18  2022-08-01  509     883
19  2022-09-01  469     757

Я использую следующие библиотеки:

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

Код для построения линейной регрессии:

# подготовка данных
    x = df['mentee'].to_numpy().reshape(-1, 1)
    y = df['mentor'].to_numpy()
# разделение данных на тренировочные и тестовые
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
# обучение модели и прогнозирование
    model = LinearRegression().fit(x_train, y_train)
    y_pred = model.predict(x_test)
# проверка модели
    mse = mean_squared_error(y_test, y_pred)
    mae = mean_absolute_error(y_test, y_pred)
    print('mse: %.3f, sqrt(mse): %.3f, mae: %.3f' % (mse, np.sqrt(mse), mae))
    print("Coefficients: \n", model.coef_)
    print('Independent: \n', model.intercept_)

Мне осталось только проверить нормальность распределения остатков и однородность дисперсии остатков.
Как это сделать?

Нормальность распределения остатков проверяется любым алгоритмом проверки на нормальность. Например, реализованными в scipy.stats критерием Колмогорова-Смирнова, критерием хи-квадрат Пирсона, критерием Крамера-фон Мизеса, критерем Харке-Берра, критерием д'Агустинио, специализированным критерием Шапиро-Уилка.
Однородность дисперсии остатков Проверяется  любым параметрическим или непараметрическим критерием сравнения дисперсии с заданным значением. Начиная от критерия ранговой корреляции Спирмана, критерия Ансари-Бредли, критерия Барлета, критерия Левене.
Крое того, существуют и другие тесты, не реализованные в scipy.stats, но реализовать которые достаточно просто.
А еще часто используют критерий Дарбина—Уотсона, реализованный в statsmodels для анализа наличия автокорреляции в остатках, что есть признаком зависимости (а следовательно и неоднородности) остатков.
Как видите, вариантов много, выбирайте.


распознание объекта по цвету, раздельные рамки для нескольких объектов
Есть скрипт по распознанию заданного цвета. Хорошо работает если объект один, а если два, то рамка выделения просто увеличивается и захватывает два объекта. Как эту рамку разбить для каждого объекта чтоб своя была,а не одна общая.
<code>
import tkinter as tk
from tkinter import ttk
from tkinter.colorchooser import askcolor

import sys
import numpy as np
import cv2
from PIL import Image

from random import randrange

root = tk.Tk()
root.title('Tkinter Color Chooser')
root.geometry('300x150')

c1, c2, c3 = '', '', ''

def change_color():
    global c1,c2,c3
    colors = askcolor(title="Tkinter Color Chooser")
    c1 = str(colors[0]).split(',')[0]
    c1 = ''.join(c1.split('(', 1)[1]) #Red
    c2 = str(colors[0]).split(',')[1]
    c2 = ''.join(c2.split(' ', 1)[1]) #Green
    c3 = str(colors[0]).split(',')[2]
    c3 = ''.join(c3.split(')')[0])
    c3 = ''.join(c3.split(' ', 1)[1]) #Blue
    root.configure(bg=colors[1])

def color_hsv():
    blue = int(c3)
    green = int(c2)
    red = int(c1)
    color = np.uint8([[[blue, green, red]]])
    hsv_color = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)
    hue = hsv_color[0][0][0]

    color_box = [(0,0,255),(0,255,255),(0,255,0),(255,255,0),(255,0,0)]
    c_num = randrange(5)

    img = cv2.imread('Blue.jpg', 1)
    img = cv2.resize(img, (0, 0), fx=0.2, fy=0.2)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    lower_range = np.array([hue - 10 if hue-10>0 else 0, 70, 70], dtype=np.uint8)
    upper_range = np.array([hue + 10 if hue+10<179 else 179, 255, 255], dtype=np.uint8)
    mask = cv2.inRange(hsv, lower_range, upper_range)
    mask_ = Image.fromarray(mask)
    bbox = mask_.getbbox()
    if bbox is not None:
        x1, y1, x2, y2 = bbox
        img = cv2.rectangle(img, (x1,y1), (x2,y2), color_box[c_num], 2)

    #cv2.imshow('mask', mask)
    cv2.imshow('image', img)
    while (1):
        k = cv2.waitKey(0)
        if (k == 27):
            break
    cv2.destroyAllWindows()

ttk.Button(root, text='Select a Color', command=change_color).pack(expand=True)
ttk.Button(root, text='Find objects', command=color_hsv).pack(expand=True)

root.mainloop()
</code>

Я решил вопрос таким образом, если есть решение лучше, буду рад увидеть.
<code>
mask = cv2.inRange(hsv, lower_range, upper_range)

_, thresh = cv2.threshold(mask, 70, 255, cv2.THRESH_BINARY)
dilated = cv2.dilate(thresh, None, iterations=2)

cnts, _ = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in cnts:
    x1, y1, x2, y2 = cv2.boundingRect(c)
    img = cv2.rectangle(img, (x1,y1), (x1+x2,y1+y2), color_box[c_num], 2)

cv2.imshow('image', img)
</code>


Почему пользователю не приходит сообщение в личные сообщения? [закрыт]

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

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

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

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

Сначала пишет "Участник username был разбанен." ,а потом
"Неправильный формат команды. Используйте: $unban <ID участника>", плюс не приходит сообщение о разбане.
<code>
import discord

intents = discord.Intents.default()
intents.message_content = True

client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'We have logged in as {client.user}')

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    if message.content.startswith('$clear'):
        if any(role.name in ["Admin", "Moderator"] for role in message.author.roles):
            await message.channel.purge(limit=None)
            await message.channel.send('Сообщения удалены!')
        else:
            await message.channel.send('Вы не можете использовать эту команду.')
    if message.content.startswith('$ban'):
        if any(role.name in ["Owner", "Admin"] for role in message.author.roles):
            try:
                args = message.content.split()
                member_id = int(args[1])
                member = await message.guild.fetch_member(member_id)
                reason = " ".join(args[2:]) or "No reason provided."
                await member.send(f'Вы были забанены на сервере {message.guild.name}. Причина: {reason}')
                await member.send("Поддержка: westeyeswie#6607 ")
                await member.ban()
                await message.channel.send(f'Участник {member.display_name} был забанен. Причина: {reason}')
            except:
                await message.channel.send('Неправильный формат команды. Используйте: $ban <ID участника> <причина>')
        else:
            await message.channel.send('Вы не можете использовать эту команду.')
    if message.content.startswith('$unban'):
        if any(role.name in ["Owner", "Admin"] for role in message.author.roles):
            try:
                args = message.content.split()
                member_id = int(args[1])
                member = await client.fetch_user(member_id)
                await message.guild.unban(member)
                await message.channel.send(f'Участник {member.display_name} был разбанен.')
                user = client.get_user(member_id)
                await user.send('Вы были разбанены на сервере ChatGPT Bot')
            except:
                await message.channel.send('Неправильный формат команды. Используйте: $unban <ID участника>')
        else:
            await message.channel.send('Вы не можете использовать эту команду.')
</code>

Всё очень просто. Сообщение, что неправильное использование команды, приходит потому, что в блоке try возникает ошибка, но не та, о которой вы думаете. Для этого в except нужно указывать конкретный тип ошибки, к примеру: except ZeroDivisionError. А ошибка как раз-таки в том, что бот не может отправить сообщение тому, кто не находится на сервере.


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

import itertools
s = input()
new_s = ''
for x in s:
    if x != ' ':
        new_s += x
for j in range(len(new_s)):
    for i in itertools.permutations(new_s,j+1):
        print(''.join(i))

Но есть проблема в одном тесте
Если я ввожу
aaa, то должно выводиться:

a
aa
aaa

А у меня выводит все варианты, то есть
a a a aa aa и так далее.
Что нужно изменить в скрипте, чтобы он заработал корректно?

во первых можно не сразу выводить, а накапливать результаты, например в множестве:

res=set()

for x in s:
    if x != ' ':
        new_s += x
for j in range(len(new_s)):
    for i in itertools.permutations(new_s,j+1):
        res.add(''.join(i))

print(*res)

P.S.
кстати от пробелов можно было и через replace избавиться

s = s.replace(' ', '')

P.P.S.
весь код можно записать так:

new_s = s.replace(' ', '')
for j in range(len(new_s)):
    print(*sorted(set(map(''.join, itertools.permutations(new_s, j + 1)))))

я добавил еще сортировку результата чтоб в лексическом порядке выводилось


Имитировать Ctrl+V через selenium python
Нужно после открытия браузера нажать сочетание клавиш Ctrl+V, но окно браузера "headless" то есть работает в фоновом режиме. Имитировать нажатие напрямую с пк не получится - файл просто не вставится (окно скрыто), нужно именно сделать это как-то при помощи selenium.

В итоге:
<code>
from selenium.webdriver.common.keys import Keys # Необходимый класс

target_input = # Цель для копипаста
target_input.send_keys(Keys.CONTROL + 'v')
</code>


Перевод компьютера в спящий режим
Всем привет! Пытаюсь сделать питон код для перевода компьютера в "ждущий режим" (сон). (Windows)
Перерыл много вариантов, но нашёл только для перевода в режим гибернации.
Помогите, пожалуйста с кодом. Заранее спасибо! ☺

Перевод в спящий режим на разных ОС выполняется по разному, так что вы можете выполнить команду
os.system для выполнения консольной команды и выбрать команду в зависимости от ОС пользователя. ОС пользователя можно определить с помощью функции
platform.system(). Делается это следующим образом:

import platform
import os

match platform.system():
    case "Linux":
        os.system("systemctl suspend")
    case "Darwin":  # MacOS
        os.system("pmset sleepnow")
    case "Windows":
        os.system("rundll32.exe powrprof.dll,SetSuspendState 0,1,0")
    case "Java":
        raise NotImplementedError("Sleep command not implemented for Java")
    case "":
        raise ValueError("Can't determine operation system")

Я воспользовался match-case statement, но вы также можете использовать
if,
elif,
else
UPD: Добавил команду для Windows


Ошибка при запуске обучения модели
При попытке запустить обучение, выдаёт ошибку. Подскажите, что не так?
neuro.py:

import tensorflow as tf
import pickle

answers = []
questions = []

print("1")
with open("dataset.pickle", "rb") as f:
    dataset = pickle.load(f)
    f.close()

print("2")
for i in dataset:
    questions.append(str(i))
    answers.append(str(dataset[i]))

dataset = None

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(32, activation='relu', input_shape=(10000,), name='hidden_layer_1'),
    tf.keras.layers.Dropout(0.2, name='dropout'),
    tf.keras.layers.Dense(10, name='hidden_layer_2')
])

model.compile(
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    optimizer='Adam',
    metrics=[
        'accuracy',
        tf.keras.metrics.Precision()
    ]
)

early_stopping = tf.keras.callbacks.EarlyStopping(
    monitor='val_loss',
    patience=2,
    mode='min',
    restore_best_weights=True
)

model_checkpoint = tf.keras.callbacks.ModelCheckpoint(
    filepath='my_model', #
    monitor='val_loss',
    save_best_only=True,
    mode='min'
)

tensorboard = tf.keras.callbacks.TensorBoard(
    log_dir='log',
)
model.fit(
    questions,
    answers,
    epochs=90,
    batch_size = 8,
    callbacks = [
        early_stopping,
        tensorboard,
        model_checkpoint
    ]
)

model.save("neuro_model")

Вывод:

1
2
Traceback (most recent call last):
  File "neuro.py", line 56, in <module>
    model.fit(
  File "/usr/local/lib/python3.8/dist-packages/keras/utils/traceback_utils.py", line 70, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "/usr/local/lib/python3.8/dist-packages/keras/engine/data_adapter.py", line 706, in __init__
    x = np.asarray(x)
numpy.core._exceptions.MemoryError: Unable to allocate 21.8 GiB for an array with shape (1443353,) and data type <U4047

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

Удалить некоторые, например, невалидные данные из датасета
Разделить датасет на часть для обучения и для проверки (train  и test)
Убрать произвольную часть датасета
Разделить датасет на несколько частей (например, по 1 Гб) и обучать поочерёдно на каждой части, пока вы не обучите на всём датасете

Подробно о разделении датасетов вы можете почитать в официальной документации tensorflow


Можно ли как-то на ткинтере сделать сообщение с выбором ответа? [закрыт]

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

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

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

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

Мне нужно сделать вывод сообщения на
tkinter (по типу
showinfo) где задаётся вопрос: Принимаете ли вы условия соглашения?, а внизу две кнопки: Да, Нет (на которые может нажать пользователь). Помогите.

Полагаю Вы хотите сделать кнопку на
tkinter, при нажатии на которую, пользователь выбирает, согласен ли он с условиями соглашения.
Для этого нам понадобятся функции
askyesnocancel() и
showinfo() из модуля
tkinter.messagebox.
Импортируем их:
from tkinter.messagebox import showinfo, askyesnocancel.
Дальше мы "запихиваем" команду для кнопки в функцию и там просто сравниваем условием
if ответы "да, нет, отмена".
Полный код:

from tkinter import *
import tkinter as ttk
from tkinter.messagebox import showinfo
from tkinter.messagebox import askyesnocancel

root=Tk()

root.title('Условия соглашения')
root.geometry('500x500')

def message_choice():
    result =  askyesnocancel(title="Условия соглашения", message="Вы принимаете условия соглашения?")
    if result==None: showinfo(title="Условия соглашения",
message="Операция приостановлена")
    elif result: showinfo(title="Условия соглашения",
message="Успешно")
    else : showinfo(title="Условия соглашения",
message="Неудачно")

ttk.Button(text='click', width=6, height=2,
command=message_choice).pack(anchor='center',
expand=1)

root.mainloop()


Почему в список переносится только 2 элемента? [дубликат]

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

Не выводятся все значения списка [дубликат]

                                (3 ответа)

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

messages = [1, 2, 3, 4]
sent_messages = []

for i in messages:
    message = messages.pop(0)
    sent_messages.append(message)

print(sent_messages)

Почему в список sent_messages переносится только 2 элемента
1, 2, когда в самом списке откуда происходит перенос всего 4 элемента?

Нельзя удалять элементы итерируемого объекта. Сначала создайте новый, потом удалите старый объект.


path.rename сохраняет файлы в корневую папку
Есть скрипт для переименования файлов по порядку, которые находятся по пути "D:/files".
По окончанию работы скрипта файлы сохраняются в корневую папку, в которой находится main.py
Как сохранить переименованные файлы в папку в которой они лежат изначально, тобишь в "D:/files" ?
<code>
import pathlib

folder = "D:/files"
filename = input('Введите имя файлов:')

path = pathlib.Path(folder)
for i, path in enumerate(path.glob('*.jpg')):
    new_name = str(filename) + ' ' + '[' + str(i) + ']' + path.suffix
    path.rename(new_name)
</code>

rename на самом деле не переименование (не только переименование), а перемещение.
Чтобы при перемещении файл остался в той же папке, в которой был, нужно к имени слева добавить путь к папке. Например, взять
path, который у вас снаружи цикла:

base_path = pathlib.Path(folder)
for i, path in enumerate(base_path.glob('*.jpg')):
    new_name = str(filename) + ' ' + '[' + str(i) + ']' + path.suffix
    path.rename(base_path / new_name)

Либо брать исходный путь к файлу из path внутри цикла:

path.rename(path.parent / new_name)

По поводу формирования имени файла:

filename не нужно оборачивать в
str, т.к.
input и так вернул строку
В целом, удобнее использовать форматирование строк (например, f-строки), а не склеивать из кусков

Можно переписать формирование нового имени файла так:

new_name = f"{filename} [{i}]{path.suffix}"


Python Numpy, пересечение двумерных массивов
Имеется два массива np:

a = np.array([
    [1, 2, 3, 5],
    [5, 6, 3, 3],
    [6, 8, 1, 7],
    [9, 5, 1, 9],
    [6, 4, 8, 12],
    [5, 9, 2, 14],
])

b = np.array([
    [1, 2, 3, 3],
    [3, 3, 3, 6],
    [6, 8, 1, 8],
    [0, 0, 0, 1],
    [5, 9, 2, 9],
])

Необходимо создать два массива a_ и b_. В эти массивы должны быть записаны строки, которые повторяются в обоих массивах по первым 3м элементам. То есть должны получиться такие массивы:

a_ = np.array([
    [1, 2, 3, 5],
    [6, 8, 1, 7],
    [5, 9, 2, 14],
])

b_ = np.array([
    [1, 2, 3, 3],
    [6, 8, 1, 8],
    [5, 9, 2, 9],
])

Ничего умнее цикла придумать не могу, может есть какая то функция о которой я не знаю и не могу нагуглить.
Можно в принципе поудалять неподходящие строки на месте прям в массивах a и b не создавая новых массивов a_ и b_ если есть возможность.

Извиняюсь, сейчас не могу комментарий написать
<code>
a1 = a[:, :-1]
b1 = b[:, :-1]
m = (a1[:, None] == b1).all(-1).any(1)
print(a[m])

[[ 1  2  3  5]
 [ 6  8  1  7]
 [ 5  9  2 14]]
</code>


Как получить текст из поля Enter Python Tkinter
Пишу приложение на Tkinter с использованием классов и столкнулся с проблемой: не могу найти, как получить данные из поля Entry.
<code>
class Personal(tk.Tk):
    def __init__(self, *arg, **kwarg):
        super().__init__(*arg, **kwarg)
        self.geometry('1200x600')
        MainfontStyle = tk.font.Font(family="helvetica 14", size=19, weight="bold")
        ExtrafontStyle = tk.font.Font(family="helvetica 14", size=14)
        MinifontStyle = tk.font.Font(family="helvetica 14", size=10)
        label = tk.Label(self, text='Форма записи на посещение',anchor='center', font=MainfontStyle, fg='#c78605')
        label2 = tk.Label(self, text='Форма записи на посещение',anchor='center', font=ExtrafontStyle, bg='#c78605', fg="black")
        EnterDate = tk.Entry(self, font=MinifontStyle)
        b1 = tk.Button(self, text="Записать", height=3, width=24,  command=self.get_text)
        label.pack()
        b1.pack(pady=10, side = 'bottom')
        label2.pack(anchor="w",padx=40, pady=10)
        EnterDate.pack(anchor='w', padx=48, pady=20)

    def get_text(self):
        return self.EnterDate.get()
</code>
Выдает следующую ошибку:

'_tkinter.tkapp' object has no attribute 'EnterDate'

def get_text(self):
    return self.EnterDate.get()

Всё верно из поля
Entry информация извлекается методом
.get(). Однако с чего вы взяли что сможете получить доступ к атрибуту экземпляра класса
self.EnterDate, заранее не определив его в конструкторе класса
__init__?.

class Personal(tk.Tk):
    def __init__(self, *arg, **kwarg):
        ...
        EnterDate = tk.Entry(self, font=MinifontStyle)
        ...

Переменная
EnterDate здесь является локальной переменной, чтобы была возможность обращатся к ней из других методов этого класса необходимо дописать "self." Перед переменной. Пример:

class Personal(tk.Tk):
    def __init__(self, *arg, **kwarg):
        ...
        self.EnterDate = tk.Entry(self, font=MinifontStyle)
        ...


Преобразовать список словарей с вложенным списком словарей при возможном отсутствии ключа python
Исходные данные на python:

lst = [
{'fruit': 'apple', 'types': [{'type':'green', 'amount':'2'},{'type':'red', 'amount':'3'}]},
{'fruit': 'melon', 'types': [{'type':'yellow', 'amount':'4'},{'type':'red', 'amount':'5'},{'type':'orange', 'amount':'1'}]}
]

нужно получить следующий словарь из списка
lst:

dict = {'apple': {'green':'2','red':'3'},'melon': {'yellow':'4','red':'5','orange':'1'}}

в одном из предыдущих вопросов мне уже помогли со способом преобразования списка
lst в нужный вид:

dict1 = {item['fruit']: {v['type']: v['amount'] for v in item['types']} for item in lst}

Однако некоторые вложенные словари в исходных данных
lst могут не содержать в себе ключа
'amount', соответственно выдает ошибку:
KeyError: 'amount'
Задача: дописать этот способ, чтобы он выдавал значение
'amount': None внутри вложенного словаря, если не нашел значение по ключу
'amount', чтобы не было такой ошибки
KeyError: 'amount'
Буду очень благодарен помощи!

Надо чуть доработать dict comprehebsion - воспользоваться методом
.get для словарей, который подставляет в искомый ключ значение по умолчанию, если этот ключ отсутствует в словаре:

lst = [
{'fruit': 'apple', 'types': [{'type':'green', 'amount':'2'},{'type':'red', 'amount':'3'}]},
{'fruit': 'melon', 'types': [{'type':'yellow', 'amount':'4'},{'type':'red', 'amount':'5'},{'type':'orange', 'amount':'1'}]},
{'fruit': 'banana', 'types': [{'type':'green'},{'type':'red', 'amount':'3'}]},
]

dict1 = {item['fruit']: {v['type']: v.get('amount', "unknown") for v in item['types']} for item in lst}
print(dict1)

{'apple': {'green': '2', 'red': '3'}, 'melon': {'yellow': '4', 'red': '5', 'orange': '1'}, 'banana': {'green': 'unknown', 'red': '3'}}


Отправка файла на сайт через Python
Мне нужно на определённый сайт каким-то образом отправить файл, автоматически через питон. Файл вручную можно отправить либо drag&drop либо нажать на кнопку и выбрать файл через открывшееся окно.
Также нужно вписать в input окно определённый текст, затем нажать кнопку отправки. Возможно ли это сделать при помощи python без открытия браузера и каких-либо действий от пользователя? Просто открыть файл .py и всё само сделается.

Да. Например с помощью селениума. Для начала прописать что бы браузер не открывался в видимом окне headless. Что бы эмулировать нажатие нужно использовать локатор и метод .click() что бы эмулировать ввод то метод .send_keys


Ошибка TypeError: refresh_data() takes 1 positional argument but 2 were given
У меня есть класс для динамического отображения графиков, написанный с использованием kivy:

class Graph(FloatLayout):
    def __init__(self, root, name, x, y, height, width, time, graph_update_freq, data_update_freq, data_queue):
        self.root = root
        self.name = name
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.time = time
        self.graph_update_freq = graph_update_freq
        self.data_update_freq = data_update_freq
        self.data_queue = data_queue
        self.exist = True
        self.step = int((self.width - 40) * data_update_freq / self.time)
        self.len_graph_buf = int(self.time / data_update_freq)
        self.deviation = int(((self.width - 40) - ((self.len_graph_buf - 1) * self.step)) / 2)
        self.current_value = 0
        self.previous_value = 0
        self.graph_queue = []

        for i in range(0, self.len_graph_buf):
            self.graph_queue.append(0)

    def start_read_data(self):
        self.do_asyncio()

    def do_asyncio(self):
        Clock.schedule_once(self.refresh_data, 0.005)

    def refresh_data(self):
        if self.exist:
            self.canvas.clear()
            Builder.load_string('''
                canvas:
                    Color:
                        rgba: 1, .1, .1, .9
                    Line:
                        points: 20 + self.deviation, 20, self.width - 20 - self.deviation, 20
                        width: 0.5
                    Color:
                        rgba: 69, 40, 66, 0.12
                    Line:
                        points: 20 + self.deviation, self.height - 20, self.width - 20 - self.deviation, self.height - 20
                        width: 0.5
                    Color:
                        rgba: 69, 40, 66, 0.12
                    Line:
                        points: 20 + self.deviation, self.height / 2, self.width - 20 - self.deviation, self.height / 2
                        width: 0.5
                    Line:
                        points: 20 + self.deviation, self.height - (self.height / 2 + 20) / 2,
                                    self.width - 20 - self.deviation, self.height - (self.height / 2 + 20) / 2
                        width: 0.5
                    Color:
                        rgba: 69, 40, 66, 0.12
                    Line:
                        points: 20 + self.deviation, 10, 20 + self.deviation, self.height - 10
                        width: 0.5
                    Line:
                        points: self.width - 20 - self.deviation, 10,
                                    self.width - 20 - self.deviation, self.height - 10
                        width: 0.5
                    Line:
                        points: 20 + self.deviation, self.height / 2,
                                    self.width - 20 - self.deviation, self.height / 2
                        width: 0.5
                    ''')

            # TODO: масштаб
            while not len(self.data_queue) == 0:
                self.graph_queue.append(self.data_queue.pop(0) * int(self.height / 2 - 10))
                self.graph_queue.pop(0)

            j = len(self.graph_queue) - 1
            self.current_value = self.graph_queue[j]
            i = 0

            maxx = 1e-7
            for g in self.graph_queue:
                if abs(g) > maxx:
                    maxx = abs(g)

            mScale = (int(self.height / 2) - 20) / maxx

            for j in range(self.len_graph_buf - 2, -1, -1):
                self.previous_value = self.current_value
                self.current_value = self.graph_queue[j]
                self.l = Line(points=(i + 20 + self.deviation, int(-self.previous_value * self.mScale) + int(self.height / 2),
                                      i + self.step + 20 + self.deviation, int(-self.current_value * self.mScale) + int(self.height / 2)),
                                      fill='red')  # ???
                self.canvas.add(self.l)
                i += self.step

            Clock.schedule_once(self.refresh_data, self.graph_update_freq)

    def remove(self):
        self.exist = False
        self.root.destroy()

при запуске файла main, который ссылается на вышенаписанный класс возникает ошибка:
TypeError: refresh_data() takes 1 positional argument but 2 were given. Насколько я знаю, такая ошибка обычно появляется, когда в аргументах функции класса забывают указать
self, но у функции
refresh_data() он есть, в качестве единственного аргумента. Подозреваю, что проблема в данной строке:
Clock.schedule_once(self.refresh_data, 0.005) так как в документации kivy.clock нет ни одного примера, где бы первый аргумент (выполняемая функция) указывалась после
self. но если убрать self, среда тут же просит его вернуть из-за явной ошибки. Заранее спасибо за помощь

Когда вы используете какой-то фреймворк, как в вашем случае Кivy, хорошо следовать его рекомендациям. И так

Вместо

def refresh_data(self):

примените

def refresh_data(self, dt):

dt - это параметр, который заполняется функцией
schedule_once() (реальное время между планированием и спуском).
Вы можете затем использовать это значение или нет, но без этого параметра вы усложняете себе жизнь, не соблюдая намерения фреймворка.

Вы вызываете функцию
schedule_once() дважды в вашем коде, пытая запланировать запуск того же метода —
refresh_data().
Это бы было в порядке, когда бы вы не планировали запуск этого метода из него самого, т.е. из метода
refresh_data() (бесконечный цикл). Я не знаю, что вы хотели этим достичь, но удалите этот вызов.


Indentaion Error [дубликат]

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

unexpected unindent [закрыт]

                                (1 ответ)

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

Я хочу создать бота в Telegram, но не могу по сколько присутствует такая ошибка.

@dp.message_handler(commands=["start"])
^
IndentationError: expected an indented block after 'with' statement on line 10

А вот и сам код.

from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
import python_weather

bot = Bot(token="5946210024:AAGkNfgBnFcDBNQLZIEoKVtlZCikxe7VNis")
dp = Dispatcher(bot)
async with python_weather.Client(format=python_weather.IMPERIAL)as client:

@dp.message_handler(commands=["start"])
async def process_start_command(message):
    weather = await client.get(message.text)
    celsius = (weather.current.temperature - 32) * 5 / 9

    resp_msg = weather.location_name + "\n"
    resp_msg += f"Текущая температура:{celsius}\n"

    await message.answer(message.text)

@dp.message_handler()
async def echo_message(msg: types.Message):
    await bot.send_message(msg.from_user.id, msg.text)

if __name__ == '__main__':
    executor.start_polling(dp)

Дело в том, что вы не сделали отступ после объявления функции:

async def process_start_command(message):

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

from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
import python_weather

bot = Bot(token="TELEGRAM_BOT_TOKEN")
dp = Dispatcher(bot)

@dp.message_handler(commands=["start"])
async def process_start_command(message):
    async with python_weather.Client(format=python_weather.IMPERIAL) as client:
        weather = await client.get(message.text)
    celsius = (weather.current.temperature - 32) * 5 / 9

    resp_msg = weather.location_name + "\n"
    resp_msg += f"Текущая температура:{celsius}\n"
    #resp_msg +=

    await message.answer(message.text)
    #await client.close()

@dp.message_handler()
async def echo_message(msg: types.Message):
    await bot.send_message(msg.from_user.id, msg.text)

if __name__ == '__main__':
    executor.start_polling(dp)

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

async with python_weather.Client(format=python_weather.IMPERIAL) as client:

в тело функции, перед получением результата в
weather.


Получить конец недели исходя из переданной даты
Есть ли какой-то простой способ получить конец недели исходя из произвольной даты? Например если передать в функцию 14.04.2023 то она вернет 16.04.2023 23:59:59. Я смотрел документацию модуля time и datetime, но не смог разобраться

Хм, можно попытаться сделать так:

from datetime import datetime, timedelta

input_date = datetime(2023, 4, 14)

def next_week(date):
    days_to_next_week = 7 - date.isoweekday()
    result = (timedelta(days=days_to_next_week) + date).strftime('%d.%m.%Y %H:%M:%S')
    return result

output_date = next_week(input_date)

print(output_date)

date.isoweekday() - возвращает текущий день недели в виде числа. 1 = Понедельник, 2 = Вторник ... 7 = Воскресенье.

timedelta(days=days_to_next_week) + date - сколько осталось дней + введённая дата.

strftime('%d.%m.%Y %H:%M:%S') - далее переводим в формат который вы хотели.

Символ
Значение

%d
Текущий день в формате DD

%m
Текущий месяц в формате MM

%Y
Текущий год в формате YYYY

%H
Текущий час

%M
Текущая минута

%S
Текущая секунда

А чтобы добиться конкретно конца дня, можно сделать так:

from datetime import datetime, timedelta

input_date = datetime(2023, 4, 14)

def next_week(date):
    days_to_next_week = 7 - date.isoweekday()
    result = (timedelta(days=days_to_next_week + 1) + date - timedelta(seconds=1)).strftime('%d.%m.%Y %H:%M:%S')
    return result

output_date = next_week(input_date)

print(output_date)

timedelta(days=days_to_next_week + 1) + date - timedelta(seconds=1) - эквивалентно =
недостоющее_кол-во_дней_до_конца_недели + 1_день + текущая_дата - 1_секунда


Есть задачка, как можно сократить данный код?
Есть код
<code>
from PIL import Image

image = Image.open("monro.jpg")
red, green, blue, = image.split()
red = red.save("red.jpg")
green = green.save("green.jpg")
blue = blue.save("blue.jpg")
image = Image.open("red.jpg")
coordinates = (200, 0, image.width, image.height)
coordinates2 = (100, 0, 596, 522)
red1 = image.crop(coordinates) .save("red1.jpg")
red2 = image.crop(coordinates2) .save("red2.jpg")
red1 = Image.open("red1.jpg")
red2 = Image.open("red2.jpg")
red = Image.blend(red1, red2, 0.5) .save("red.jpg")
</code>
Как можно сократить код?

image = Image.open("monro.jpg")
image,, = image.split() #выкидываем блю и грин тк далее не используются

#радикально: нужна только эта строка
red = Image.blend(Image.crop((200, 0, image.width, image.height)), image.crop((100, 0, 596, 522)) , 0.5) .save("red.jpg")

#red = red.save("red.jpg")
#green = green.save("green.jpg")
#blue = blue.save("blue.jpg")

#image = Image.open("red.jpg") #объект уже имеется
coordinates = (200, 0, image.width, image.height)
#coordinates2 = (100, 0, 596, 522)#переменная ради переменной
red1 = image.crop(coordinates) #.save("red1.jpg") #зачем сохранять промежуточный результат? #можно поступить как с координатес2
red2 = image.crop((100, 0, 596, 522)) #.save("red2.jpg")
#red1 = Image.open("red1.jpg") лишнее переоткрытие
#red2 = Image.open("red2.jpg")
red = Image.blend(red1, red2, 0.5) .save("red.jpg")


Как мне упростить формулу добавления букв

favorite_fruits = ['papaya', 'apple', 'banana', 'coconut', 'orange', 'pineapple']

x = 1

if 'banana' in favorite_fruits:
    print(f"You "
        f"{'r'+ 'e'*x + 'a'*x + 'l'*x + 'ly'}"
        " like bananas!")
    x += 1

if 'apple' in favorite_fruits:
    print(f"You "
        f"{'r'+ 'e'*x + 'a'*x + 'l'*x + 'ly'}"
        " like apples!")
    x += 1

if 'coconut' in favorite_fruits:
    print(f"You "
        f"{'r'+ 'e'*x + 'a'*x + 'l'*x + 'ly'}"
        " like coconuts!")
    x += 1

Мне нужно упростить формулу:

'r'+ 'e'*x + 'a'*x + 'l'*x + 'ly'
Или найти другие способы это сделать, что бы при каждом пройденном условии добавлялась еще одна буква E, A, L.

Можно попытаться сделать так, возможно это то что вам подходит:

favorite_fruits = ['papaya', 'apple', 'banana', 'coconut', 'orange', 'pineapple', 'berry']
fruits = ['banana', 'apple', 'coconut', 'berry']
x = 1

def what_i_like(fruit):
    letters_e = 'e' * x
    letters_a = 'a' * x
    letters_l = 'l' * x
    ends_with_y = fruit.endswith('y')
    end = 'ies' if ends_with_y else 's'
    fruit_name = (fruit[0:-1] if ends_with_y else fruit) + end

    print('You r' + letters_e + letters_a + letters_l + 'ly like ' + fruit_name + '!')

for fruit in fruits:
    if fruit in favorite_fruits:
        what_i_like(fruit)
        x += 1

Я также добавил небольшую проверку, чтобы проверить, оканчивается ли название фрукта на
y, если так, тогда окончание будет
ies, в противоположном случае будет
s.


Как отправить в телеграм бот определенные данные из полученных запросом?
Как отправить в телеграм бот определенные данные из полученных запросом?
Доброго времени суток. Ребята хелпаните плиз.
Есть код запустив который получаю через print два результата в зависимости от запроса
<code>
{
"cmd": "ss",
"prs": {
"htt": "ww",
"db": "ee",
"ul": "rr",
"pr": "tt",
"activ": "yy",
"lean": "uu"
},
"status": true,
"str": false,
"cd": {
"pol": [
{
"bd": 111111,(Значение меняется)
"cmn": {
"al": "32423434543534532",
"amd": "22222", (Значение меняется)
"bl": "fdgfdfdgdfgdfgdfgerer",
"mtt": "BBB",
"tolop": "0x00",
"tuuls": null,
"stron": true,
"saer": [],
"snd": false,
"mmr": "0",
"pol": "0"
}
}
],
"snd":[{ (в зависимости от запроса может быть пусто)
"bd":23232,
"cmn":{
"al": "32423434543534532",
"amd": "32323", (Значение меняется)
"bl": "fdgfdfdgdfgdfgdfgerer",
"mtt": "BBB",
"tolop": "0x00",
"tuuls": null,
"stron": true,
"saer": [],
"snd": false,
"mmr": "0",
"mmrentry":"22696",
"pol":"117780"
}
}]
}
}
</code>
Мне нужно из "pol" отправить "bd": 111111 и "amd": "22222"
И те же даынные с "snd":[ если не пусто
bot.send_message(message.chat.id,
получено данных из"pol" : "bd": 111111 и "amd": "22222"
отправлено данных из "snd": "bd": 111111 и "amd": "22222" )

Для того, чтобы отправить определенные данные из полученного запроса в сообщении телеграм бота, вам нужно:
Распарсить полученный JSON запрос, чтобы получить нужные данные. Вы можете использовать модуль json для этого:

import json

json_data = '{"cmd": "ss", ...}' # Замените это вашим полученным JSON запросом

parsed_data = json.loads(json_data)

Используйте метод bot.send_message для отправки сообщения в телеграм бота. Вы можете сформировать текст сообщения, используя полученные данные и метод строки format():

import telegram

bot = telegram.Bot(token='<TOKEN>') # Замените <TOKEN> на токен вашего бота
chat_id = '<CHAT_ID>' # Замените <CHAT_ID> на id чата, куда вы хотите отправить сообщение

message_text = 'получено данных из "pol": "bd": {} и "amd": {}'

# Получаем данные из "pol"
bd = parsed_data['cd']['pol'][0]['bd']
amd = parsed_data['cd']['pol'][0]['cmn']['amd']

# Отправляем сообщение
bot.send_message(chat_id=chat_id, text=message_text.format(bd, amd))

Вы можете использовать ту же логику для отправки данных из "snd":[].


Django массовое добавление многий ко многим
Есть 2 модели

class Image(models.Model):
    image_path = models.CharField("image path", max_length=300, unique=True)
    image_name = models.CharField("image name", max_length=30)
    tags = models.ManyToManyField("Tag", verbose_name=("tags"))

class Tag(models.Model):
    tag = models.CharField("tag", max_length=20, unique=True)

Обе заполняются через
bulk_create. Надо массово связать
Image и
Tag.
Что-то типа этого:

for tag in Tag.objects.all():
        Image.objects.filter(image_path__contains=os.sep + tag.tag + os.sep).update(tags=tag)

При этом если изображение уже имеет связь с тегом повторно её создавать не надо.
Как это сделать?

Сам спросил сам ответил =)
<code>
for tag in Tag.objects.all():
    tag.image_set.add(*Image.objects.filter(image_path__contains=os.sep + tag.tag + os.sep))
</code>
Дубли при этом не создаются.


замена значений во вложенном словаре python
есть исходные данные (словарь с вложенными словарями):

dict = {
    "Shop1": {
        "apple": {"Can_buy": "allow", "amount": 5, "Can_sell": "restrict"},
        "orange": {"Can_buy": "restrict", "amount": 4, "Can_sell": "allow"},
    },
    "Shop2": {"Melon": {"Can_buy": "allow", "amount": 61, "Can_sell": "restrict"}},
}

Таким образом это словарь, ключи которого - магазины, а в значениях - словари. Уже в эти словарях ключ - название фрукта, а в значении этого ключа словарь с данными о возможности купить, количестве и возможности продать.
Задача в том, чтобы заменить значения '
allow' и '
restrict' на булевые
True и
False соответственно.
Наверное возможно это сделать тройным вложенным циклом и заменой значения по условию, но пока не знаю как именно
Буду очень рад вашей помощи

Если лениво разбираться с вложениями, то можно просто перевести данные в
json, потом заменить строки и вернуть данные обратно в объект:

import json
import pprint

data = {'Shop1': {'apple': {'Can_buy': 'allow', 'Can_sell': 'restrict', 'amount': 5},
                  'orange': {'Can_buy': 'restrict', 'Can_sell': 'allow', 'amount': 4}},
        'Shop2': {'Melon': {'Can_buy': 'allow', 'Can_sell': 'restrict', 'amount': 61}}}

new_data = json.loads(json.dumps(data).replace('"allow"', 'true').replace('"restrict"', 'false'))
pprint.pprint(new_data)

Вывод:

{'Shop1': {'apple': {'Can_buy': True, 'Can_sell': False, 'amount': 5},
           'orange': {'Can_buy': False, 'Can_sell': True, 'amount': 4}},
 'Shop2': {'Melon': {'Can_buy': True, 'Can_sell': False, 'amount': 61}}}


Как оптимальнее по времени проверить, является ли множество подмножеством?
Необходимо написать функцию, которая проверяет можно ли из строки s1 сделать строку s2. Примеры:

scramble('rkqodlw', 'world') ==> True
scramble('cedewaraaossoqqyt', 'codewars') ==> True
scramble('katas', 'steak') ==> False

А вот мой код:

def scramble(s1, s2):
    result = True
    for i in s2:
        if s1.count(i) < s2.count(i) or i not in s1:
            result = False
    return result

Проблема в том, что он выходит за рамки времени выполнения задачи.
Главный вопрос: Что и как можно поменять, чтобы он работал быстрее?

collections.Counter считает символы строки и складывает в словарь. На этих словарях определён порядок - первый словарь "больше либо равен" второму если все счётчики в первом словаре "больше либо равны" соответствующим счётчикам во втором.

@>>> import collections
@>>> c1 = collections.Counter('rkqodlw')
@>>> c1
Counter({'r': 1, 'k': 1, 'q': 1, 'o': 1, 'd': 1, 'l': 1, 'w': 1})
@>>> c2 = collections.Counter('world')
@>>> c2
Counter({'w': 1, 'o': 1, 'r': 1, 'l': 1, 'd': 1})
@>>> c1 >= c2
True

Работает это за линейное время - грубо говоря, быстрее не бывает.

import collections

def scramble(s1, s2):
    return collections.Counter(s1) >= collections.Counter(s2)

print(scramble('rkqodlw', 'world'))
print(scramble('cedewaraaossoqqyt', 'codewars'))
print(scramble('katas', 'steak'))


как оптимиизовать ассоциации с командами?
Есть такой код:

play_commands= ['включи','запусти','вруби','сыграй']
search_commands = ['найди','найди в гугл','найди в гугле','загугли','найди в интернете','найти в интернете']

    for key in play_commands:
        if command.startswith(key):
            command=command[len(key)+1:]
            play(command)
            return
    for key in search_commands:
        if command.startswith(key):
            command=command[len(key)+1:]
            search(command)
            return

в будущем будет появляться больше новых команд и асоциаций к ним. Как это всё оптимизировать чтобы свести появление новых commands и чтобы не повторялся циклы примерно как:

  for key in play_commands:

Для решения этой проблемы можно использовать словарь, в котором по названию команды будет храниться список ассоциаций.
<code>
commands_blocks = {
    'play_commands': [
        'включи',
        'запусти',
        'вруби',
        'сыграй',
    ],
    'search_commands': [
        'найди',
        'найди в гугл',
        'найди в гугле',
        'загугли',
        'найди в интернете',
        'найти в интернете',
    ]
}

for command_name, key in commands_blocks.items():
    ...
</code>


TypeError: () takes no arguments Ошибка [закрыт]

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

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

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

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

Я писал небольшую игру и возникла ошибка коде:

    clouds = Clouds(MAP_W, MAP_H)
TypeError: Clouds() takes no arguments

Не понимаю из-за чего появляется ошибка, если кто-то знает, помогите пожалуйста.
Вот код:

from pynput import keyboard
from cloud import Clouds
import time
import os
from map import Map
from helicopter import Helicopter as Helico

TICK_SLEEP = 0.1
CLOUDS_UPDATE = 20
TREE_UPDATE = 50
FIRE_UPDATE = 25
MAP_W, MAP_H = 20, 10

helico = Helico(MAP_W, MAP_H)
tmp = Map(MAP_W, MAP_H)
clouds = Clouds(MAP_W, MAP_H)
MOVES = {'w': (-1, 0), 'd': (0, 1), 's': (1, 0), 'a': (0, -1)}

def process_key(key):
    global helico
    c = key.char.lower()
    if c in MOVES.keys():
        dx, dy = MOVES[c][0], MOVES[c][1]
        helico.move(dx, dy)

listener = keyboard.Listener(on_press=None, on_release=process_key)
listener.start()

if tmp.check_bounds(20, 30):
    print('YES')
tmp.generate_forest(3, 10)
tmp.generate_rivers(10)
tmp.generate_rivers(10)
tmp.generate_rivers(10)
tmp.generate_upgrade_shop()
tmp.generate_hospital()

tick = 1

while True:
    os.system('cls')
    tmp.process_helicopter(helico, clouds)
    helico.print_stats()
    tmp.print_map(helico, clouds)
    print('TICK', tick)
    tick +=1

    time.sleep(TICK_SLEEP)
    if tick % TREE_UPDATE == 0:
        tmp.add_tree()
    if tick % FIRE_UPDATE == 0:
        tmp.add_fire()
    if tick % CLOUDS_UPDATE == 0:
        clouds.update()

В строчке
clouds = Clouds(MAP_W, MAP_H) вы создаёте объект класса
Clouds, передавая ему аргументы
MAP_W и
MAP_H. Ошибка возникает, потому что в методе
__init__(self) класса
Clouds, который описан в файле
cloud.py нет аргументов, кроме
self. Чтобы исправить эту ошибку, вам нужно добавить аргументы в конструктор класса
Clouds. Это может выглядеть так:

class Clouds:
    def __init__(self, map_width, map_height): # изменяем конструктор класса
        ... # ваш код здесь


Как удалить лишнее из команды?
В общем есть такой код бота:

import speech_recognition

recognizer = speech_recognition.Recognizer()
microphone = speech_recognition.Microphone()
BOT_NAME="рекса"
play_commands = ['включи','запусти','сыграй']

def record_and_recognize_audio(*args: tuple):
    with microphone:
        recognized_data = ""

        # регулирование уровня окружающего шума
        recognizer.adjust_for_ambient_noise(microphone, duration=2)

        try:
            print("Listening...")
            audio = recognizer.listen(microphone, 5, 5)

        except speech_recognition.WaitTimeoutError:
            return

        # использование online-распознавания через Google
        try:
            print("Started recognition...")
            recognized_data = recognizer.recognize_google(audio, language="ru").lower()

        except speech_recognition.UnknownValueError:
            pass

        except speech_recognition.RequestError:
            print("Check your Internet Connection, please")

        return recognized_data

def bot_command(command : str):
    if not command.startswith(BOT_NAME):
        return
    command=command[6:]
    if command in play_commands:
        play()
        return
while True:
    voice_input = record_and_recognize_audio()
    print(voice_input)
    bot_command(voice_input)

В моменте

if command in play_commands:
play(command)

мне нужно обрезать всё лишнее у переменной command, то есть, если строка была "Включи песни", должен запускаться метод с включением музыки и слово "Включи" должно обрезаться, как мне это сделать?

Для удаления лишних слов из строки в Python можно использовать метод split(), который разделяет строку на слова и возвращает их в виде списка. Затем можно обрезать первое слово (которое в данном случае является командой) с помощью среза, и объединить оставшиеся слова обратно в строку, используя метод join().
В вашем случае можно заменить строку command=command[6:] на следующий код:
<code>
words = command.split()
if words[0] in play_commands:
    play()
    command = ' '.join(words[1:])
</code>
Здесь мы разбиваем строку command на список слов words, проверяем, является ли первое слово командой для воспроизведения, и если это так, то вызываем функцию play() и обрезаем первое слово с помощью среза words[1:]. Затем мы объединяем оставшиеся слова обратно в строку с помощью метода join() и записываем результат обратно в переменную command.


<code>
from itertools import product, combinations

list1 = [[['a1', 66],['a2', 58],['a3', 56]],
         [['b1', 66],['b2', 49],['b3', 51]],
         [['c1', 66],['c2', 53],['c3', 50]],
         [['x1', 66],['x2', 53],['x3', 50]]
       ]
list_product = list(product(*[combinations(x,2) for x in list1]))
print(list_product)
</code>
Решение не полное. Сам не проверял.
Просто пример того, в какую сторону нужно копать


Как избавиться от if'ов
Задача: отсортировать список, в котором хранятся словари. У словарей +- одинаковые ключи и значения (пример ниже).
Проблема в том, что при увеличении количества принимаемых аргументов, по которым фильтруем словари, увеличивается количество блоков
if [Аргумент функции] not None. Как этого можно избежать? И какой самый оптимальный вариант решения этой задачи?

arr = [
    {'title': 'Dom kva', 'price':2000}, # ключ-значение может быть больше
    {'title': 'dom2 kva', 'price':3000},
    {'title': 'dom3', 'price':3555},
    {'title': 'dom4','price':4000},
    {'title':'dom6 kva','price':3540}
]

def sort_price(array:list, high :int=None , low: int=None, text : str=None) -> list:
    sort_arr = []
    for item in array:
        if low is not None:
            if item['price'] < low:
                continue
        if high is not None:
            if item['price'] > high:
                continue
        if text is not None:
            if text not in item['title']:
                continue
        sort_arr.append(item)
    return sort_arr

print(sort_price(arr,3999,2000,'kva'))  # выводит в консоль [{'title': 'Dom kva', 'price': 2000}, {'title': 'dom2 kva', 'price': 3000}, {'title': 'dom6 kva', 'price': 3540}]

Можно все условия объединить через операторы
and и
or

arr = [
    {'title': 'Dom kva', 'price': 2000},  # ключ-значение может быть больше
    {'title': 'dom2 kva', 'price': 3000},
    {'title': 'dom3', 'price': 3555},
    {'title': 'dom4', 'price': 4000},
    {'title': 'dom6 kva', 'price': 3540}
]

def sort_price(array: list, high: int = None, low: int = None, text: str = None) -> list:
    sort_arr = []
    for item in array:
        if not (low is not None and item['price'] < low
                or high is not None and item['price'] > high
                or text is not None and text not in item['title']):
            sort_arr.append(item)
    return sort_arr

print(sort_price(arr, 3999, 2000,'kva'))

[{'title': 'Dom kva', 'price': 2000}, {'title': 'dom2 kva', 'price': 3000}, {'title': 'dom6 kva', 'price': 3540}]


Как получить результат value_counts() Pandas Python в виде списка списков?
Результат value_counts() пакую в JSON, он выходит в таком виде
<code>
s = pd.Series([3, 1, 5, 3, 9, 4])
    jsn = s.value_counts(bins=3).to_json()
    print(jsn)
</code>

{"(0.991, 3.667]":3,"(3.667, 6.333]":2,"(6.333, 9.0]":1}

Но мне нужен JSON списка списков в таком виде

[ [0.991, 3.667, 3], [3.667, 6.333, 2], [6.333, 9.0, 1] ]

Как правильно упаковать в такой вид из объекта результата value_counts(), до преобразования в JSON?

Преобразуем Series во фрейм (индекс фрейма - IntervalIndex вида
(0.991, 3.667]). Методом
.apply()перебираем фрейм построчно, формируя новый Series, содержащий списки, составленные из значений свойств left и right каждого объекта IntervalIndex и значения из столбца
count. Потом конвертируем этот Series в json в виде 'records'.

s = pd.Series([3, 1, 5, 3, 9, 4])
s = s.value_counts(bins=3)
out = s.to_frame().apply(lambda x: [x.name.left, x.name.right, x['count']], axis=1).to_json(orient='records')
print(out)

[[0.991,3.667,3],[3.667,6.333,2],[6.333,9.0,1]]


Как запустить selenium в боевом режиме?
python
Подскажите пожалуйста, как запустить selenium web driver через python таким образом, чтобы браузер запускался в обычном режиме а не тестовом.
По факту мне просто нужно автоматизировать несколько процессов по работе с сайтом, но лучше это делать в обычном режиме, но селениум постоянно открывает в тестовом режиме. Может быть  есть альтернатива как можно автоматизировать процессы на сайте (заполнение форм и тд) через python?

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

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("user-data-dir=C:/Users/Ваш_username/AppData/Local/Google/Chrome/User Data")
chrome_options.add_argument("profile-directory=Ваш_профиль")
driver = webdriver.Chrome(options=chrome_options)

Путь к профилю смотрим тут:
chrome://version/
Драйвер загрузит предварительно настроенный Вами профиль для конкретных задач.
Возможно, Вам еще пригодится:

options.add_experimental_option("detach", True)

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


Непонятная работа time.sleep()
Этот код проверяет, какое сейчас время и если время совпадает с указанным значением, то код отправляет уведомление. Почему-то код отправляет уведомления на час позже, хотя в else нету time.sleep()
<code>
import time
import datetime
from threading import Thread

def minute1():
    print("Функция проверки 18 часов - запущена  -")
    Datetime = datetime.timezone(datetime.timedelta(hours=3))
    now = datetime.datetime.now(Datetime)
    Time = int(now.hour)
    while Time != 18:
        print("1 поток в режиме ожидания -\n")
        Datetime = datetime.timezone(datetime.timedelta(hours=3))
        now = datetime.datetime.now(Datetime)
        Time = int(now.hour)
        print(Time)
        time.sleep(3600)
    else:
        week = now.isoweekday()
        with open("TiMe.txt", mode="r", encoding="utf-8") as code:
            s = code.read()
        if s != str(week):
            with open("TiMe.txt", mode="w", encoding="utf-8") as ime:
                ime.write(str(week))
            print("Отправка уведомления -")
            return
def minute2():
    print("Функция проверки 17 часов - запущена  -")
    Datetime = datetime.timezone(datetime.timedelta(hours=3))
    now = datetime.datetime.now(Datetime)
    Time = int(now.hour)
    while Time != 17:
        print("2 поток в режиме ожидания -\n")
        Datetime = datetime.timezone(datetime.timedelta(hours=3))
        now = datetime.datetime.now(Datetime)
        Time = int(now.hour)
        print(Time)
        time.sleep(3600)
    else:
        week = now.isoweekday()
        with open("TiMe.txt", mode="r", encoding="utf-8") as code:
            s = code.read()
        if s != str(week):
            with open("TiMe.txt", mode="w", encoding="utf-8") as ime:
                ime.write(str(week))
            print("Отправка уведомления -")
            print("Уведомление отправлено -")
            return

def weekly():
    print("Функция день недели запущена -")
    Datetime = datetime.timezone(datetime.timedelta(hours=3))
    now = datetime.datetime.now(Datetime)
    week = now.isoweekday()
    while True:
        with open("TiMe.txt", mode="r") as t:
            s = t.read()
            Datetime = datetime.timezone(datetime.timedelta(hours=3))
            now = datetime.datetime.now(Datetime)
            week = now.isoweekday()
            week = str(week)
        if s != week:
            with open("TiMe.txt",  mode="w") as m:
                m.write(week)
            print("Изменение дня недели -")
            print("Перезапуск консоли -")
            Tread()
            return
        else:
            print("3 поток в режиме ожидания -\n")
            time.sleep(3600)
def Tread():
    print("Консоль создана -")
    Thread(target=minute1).daemon = True
    Thread(target=minute2).daemon = True
    Thread(target=weekly).daemon = True
    print("Потоки завершены -")
    Thread(target=minute1).start()
    Thread(target=minute2).start()
    Thread(target=weekly).start()
    print("Потоки созданы -")
Tread()
</code>
Время sleep(), можно уменьшить, чтобы легче проверить

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

pip install schedule

Использование:

import schedule
import datetime

def event_function():  # функция которую мы должны запускать по времени
    timezone = datetime.timezone(datetime.timedelta(hours=3))
    current_time = datetime.datetime.now(timezone)
    print(f"Функция запущена в {current_time.hour} часов.")

    week = current_time.isoweekday()
    with open("TiMe.txt", mode="r", encoding="utf-8") as file:
        s = file.read()

    if s != str(week):
        with open("TiMe.txt", mode="w", encoding="utf-8") as file:
            file.write(str(week))
        print("Отправка уведомления -")

schedule.every().day.at("17:00").do(event_function)  # Регистрируем вызов функции event_function на 17:00
schedule.every().day.at("18:00").do(event_function)  # Регистрируем вызов функции event_function на 18:00

# Запускаем тактирование с периодичностью 1 секунду, желательно запускать в отдельном потоке
while True:
    schedule.run_pending()
    time.sleep(1)

В итоге функция
event_function будет выполняться в 17:00 и 18:00 каждый день(естественно вы можете изменить на неделю или месяц). В случае если вам не надо слишком высокая точность времени вызова функции вы можете изменить частоту тактирования например на 60 секунд, а то и вовсе на 1 час.


AttributeError: module 'django.conf.global_settings' has no attribute 'ROOT_URLCONF'
AttributeError: module 'django.conf.global_settings' has no attribute 'ROOT_URLCONF' - ошибка при написании юнит-теста, сам тест такой:
<code>
from unittest import TestCase
from django.test import Client
from django.conf import settings

settings.configure(DEBUG=True)

class TestViews(TestCase):

    def test_main_page_GET(self):
        client = Client()
        response = client.get('registration/')

        self.assertEqual(response.status_code, 200)
        # self.assertTemplateNotUsed(response, 'quiz_core_app/main_page.html')
</code>
В файле settings.py эта переменная для корневых urls указана верно, DJANGO_SETTINGS_MODULE тоже указан, при попытка изменения этого теста ошибка уходит, но появляются другие и при решении их эта ошибка опять дает о себе знать

from django.conf import settings

settings.configure(
    ROOT_URLCONF=__name__,
)


Как найти максимальный элемент среди значений по ключам в словаре в цикле?
У меня есть словарь

dict = {'1 2 3 4 5 6 7 8 9 10': {' 0': -78.857, ' 2': -80.738, ' 1': -79.679}}

Я хочу найти максимальный элемент среди -78.857, -80.738 и -79.679
Я попробовал достать их

listsum = []

for key in dict.keys():
  for key in (dictt.keys()).keys():
    listsum.append(((dict.keys()).keys()).values())
print(listsum)

Чтобы далее найти в списке наибольший с помощью max()
Но Pycharm выдал мне ошибку

for key in (dict.keys()).keys():
       ^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'dict_keys' object has no attribute 'keys'

Подскажите, пожалуйста,  как это можно сделать


Взять название для ключа из переменной
Я создаю програмку, которая по коду страны, будет выводить ее полное название. Например.
Ввод:
US
Вывод:
United States of America
И я названия стран беру из отдельного файла, в котором они записаны в таком виде:
US: United States of America
И записываю это в список, откуда позже циклом for раскладываю ключ и название в словарь, и тут проблема, когда я пытаюсь ввести в название ключа переменную, ключом становиться сама переменная.
А нужно что бы ключом становилась строка из переменной.
Вот код:

file = open("country.txt", "r").read()
country_list_not = file.split(": ")
country_list = []
country = {}
for i in country_list_not:
    if i.find("\n") != -1:
        if not i.endswith("\n"):
            country_list.append(i[:len(i) - 3])
            country_list.append(i[-2:len(i)])
            continue
        else:
            country_list.append(i[:-1])
            continue

    country_list.append(i)
key = 0
value = 0
for x in country_list:
    if not country_list.index(x) % 2:
        key = x
        continue
    value = x
    country.update(key=value)
print(country)

Вывод:

{'key': 'United Kingdom'}

А должно быть:

{'UK': 'United Kingdom'}

Добавьте, пожалуйста, пример файла
country.txt. Если Вы храните
US: United States of America в каждой строчке отдельно, то можно решить Вашу задачу по-другому.
Основная проблема Ваша в строчке
country.update(key=value).

key= - это не Ваша переменная
key, а название ключа, по которому будет добавлено значение из переменной
value. Правильно будет сделать
country[key] = value!
Дополнительно можно упростить Ваш код:

>>> country = {}
>>> with open("country.txt", "r") as file:
...     for line in file.readlines():
...         code, name = line.split(': ')
...         country[code] = name.removesuffix('\n')
...
>>> print(country)
{'US': 'United States of America', 'GBR': 'The United Kingdom of Great Britain and Northern Ireland'}

country.txt

US: United States of America
GBR: The United Kingdom of Great Britain and Northern Ireland


'NoneType' object is not callable / pytelegrambot api
при попытке перезаписать глобальную переменную вылетает нон тайп
ошибка вылетает в fio = message.text при попытке записать текст пользователя в переменную Весь код:

import telebot
from telebot import types
import smtplib, ssl

TOKEN = '************************'
bot = telebot.TeleBot(TOKEN)

smtp_server = "smtp.gmail.com"
sender_email = "*****************"
receiver_email = "********************"
password = '***********************'
context = ssl.create_default_context()
fio = None
@bot.message_handler(commands=['start'])
def start(message):
    global fio, birth_date, passport_date,passport_org
    fio = None
    print(fio)
    markup = types.InlineKeyboardMarkup()
    rus = types.InlineKeyboardButton("🇷🇺 Русский 🇷🇺",
callback_data='rus')
    markup.row(rus)
    mess = f"Здравствуйте, <b>{message.from_user.first_name}
{message.from_user.last_name}</b>! Выберете язык дальнейшего
общения:"
    bot.send_message(message.chat.id, mess, parse_mode='html',
reply_markup=markup)

@bot.callback_query_handler(func=lambda callback: True)
def callback_message(callback):
    if callback.data == 'rus':
        bot.send_message(callback.message.chat.id, 'Еще раз
здравствуйте! Я ваш персональный бот помощник! Я здесь чтобы помочь
вам устроиться  в фирму ЭГИДА.',
parse_mode='html')
        rus(callback.message)
    if callback.data == 'yes_rus':
        bot.send_message(callback.message.chat.id, 'Отправляю
ваши данные для рассмотрения')
        bot.register_next_step_handler(callback.message,
push_to_mail())
    if callback.data == 'no_rus':
        bot.send_message(callback.message.chat.id, 'Введите ваши
данные повторно, более внимательно')
        bot.register_next_step_handler(callback.message,
start(callback.message))

def rus(message):
    bot.send_message(message.chat.id, 'Чтобы зарегистрировать вас
нам нужно собрать некоторые данные. Пожалуйста введите ваши имя
фамилию и отчество')
    bot.register_next_step_handler(message, get_fio_rus)

def get_fio_rus(message):
    global fio
    fio = message.text
    print(fio)
    bot.register_next_step_handler(message, final_rus(message))
def final_rus(message):
    global fio
    markup = types.InlineKeyboardMarkup()
    yes = types.InlineKeyboardButton("Верно",
callback_data="yes_rus")
    no = types.InlineKeyboardButton("Неверно",
callback_data="no_rus")
    markup.add(yes, no)
    bot.send_message(message.chat.id, "Проверьте ваши данные")
    bot.send_message(message.chat.id, f"ФИО: {fio}")
    bot.send_message(message.chat.id, f"Все верно?",
reply_markup=markup)

def push_to_mail():
    global fio
    m = f'{fio}'.encode('utf-8')
    with smtplib.SMTP(smtp_server, port) as server:
        server.starttls(context=context)
        server.login(sender_email, password)
        server.sendmail(sender_email, receiver_email, m)

 bot.polling(none_stop=True)

код ошибки:

Traceback (most recent call last):
    File "C:\Users\Сергей\Desktop\bot\test.py", line 70, in
    <module>
        bot.polling(none_stop=True)
    File "C:\Users\Сергей\Desktop\bot\venv\Lib\site-
    packages\telebot\__init__.py", line 1043, in polling
    self.__threaded_polling(non_stop=non_stop, interval=interval,
        timeout=timeout,
        long_polling_timeout=long_polling_timeout,
    File "C:\Users\Сергей\Desktop\bot\venv\Lib\site-
    packages\telebot\__init__.py", line 1118, in
    __threaded_polling
        raise e
    File "C:\Users\Сергей\Desktop\bot\venv\Lib\site-
    packages\telebot\__init__.py", line 1074, in
    __threaded_polling
        self.worker_pool.raise_exceptions()
    File "C:\Users\Сергей\Desktop\bot\venv\Lib\site-
    packages\telebot\util.py", line 148, in raise_exceptions
        raise self.exception_info
    File "C:\Users\Сергей\Desktop\bot\venv\Lib\site-
    packages\telebot\util.py", line 91, in run
        task(*args, **kwargs)
TypeError: 'NoneType' object is not callable

Скорее всего ошибка связана с этими строками:

bot.register_next_step_handler(callback.message, start(callback.message))
                                                 ^^^^^^^^^^^^^^^^^^^^^^^
...
bot.register_next_step_handler(message, final_rus(message))
                                        ^^^^^^^^^^^^^^^^^^

Вторым аргументом надо передавать функцию, а вы передаёте результат вызова функции, т.е.
None, поскольку эти функции ничего не возвращают. Правильно так:

bot.register_next_step_handler(callback.message, start)
...
bot.register_next_step_handler(message, final_rus)


Как в pytest лучше всего проверять uuid?
Подскажите, пожалуйста, как лучше всего передавать значения переменных в pytest?
В коде, представленном ниже, мне потребовалось загнать значения uuid в переменные MENU_ID и SUBMENU_ID для дальнейшего использования.
Для этого я использовал global, но это считается плохой практикой.
Какие лучшие практики для этого существуют в pytest?
<code>
# conftest.py

import pytest
from fastapi.testclient import TestClient

from src.main import app
from src.session import Base, engine

@pytest.fixture(scope="module", autouse=True)
def test_db():
    Base.metadata.create_all(engine)
    yield
    Base.metadata.drop_all(engine)

@pytest.fixture(scope="module")
def client():
    yield TestClient(app)

#test.py

import uuid

import pytest

class TestSubmenus:
    @pytest.fixture(scope='class', autouse=True)
    def make_menu(self, client):
        response = client.post(
            "/api/v1/menus",
            json={"title": "My menu 1",
                  "description": "My menu description 1"}
        )
        global MENU_ID
        MENU_ID = response.json()["id"]

    def test_create_submenu(self, client):
        response = client.post(
            f"/api/v1/menus/{MENU_ID}/submenus",
            json={
                "title": "My submenu 1",
                "description": "My submenu description 1"
            }
        )
        global SUBMENU_ID
        SUBMENU_ID = response.json()["id"]
        assert response.status_code == 201
        assert response.json() == {
            "id": SUBMENU_ID,
            "title": "My submenu 1",
            "description": "My submenu description 1",
            "dishes_count": 0
        }

</code>

В решении проблемы очень помог @insolor
Решением было вынести создание меню и подменю в фикстуры и возвращать значения id через yield.
<code>
# conftest.py

import pytest
from fastapi.testclient import TestClient

from src.main import app
from src.session import Base, engine

@pytest.fixture(scope="module", autouse=True)
def test_db():
    Base.metadata.create_all(engine)
    yield
    Base.metadata.drop_all(engine)

@pytest.fixture(scope="module")
def client():
    yield TestClient(app)

@pytest.fixture(scope='class')
def make_menu(client):
    response = client.post(
        "/api/v1/menus",
        json={"title": "My menu 1",
              "description": "My menu description 1"}
    )
    menu_id = response.json()["id"]
    yield menu_id

@pytest.fixture(scope='class')
def make_submenu(client, make_menu):
    menu_id = make_menu
    response = client.post(
        f"/api/v1/menus/{menu_id}/submenus",
        json={"title": "My submenu 1",
              "description": "My submenu description 1"}
    )
    submenu_id = response.json()["id"]
    yield submenu_id

# test.py

class TestSubmenus:
    def test_create_submenu(self, client,
                            make_menu, make_submenu):
        menu_id = make_menu
        submeu_id = make_submenu
        response = client.post(
            f"/api/v1/menus/{menu_id}/submenus",
            json={
                "title": "My submenu 1",
                "description": "My submenu description 1"
            }
        )
        assert response.status_code == 201
        assert response.json() == {
            "id": submeu_id,
            "title": "My submenu 1",
            "description": "My submenu description 1",
            "dishes_count": 0
        }

</code>


Как разделить строку по два символа в кортеж?
Если кратко, дана строка
some text. Результат нужен типа такой:
[('so','me'), (' е', 'ex'), ('t')].
Ранее подсмотрел в интернете и по невнимательности сделал так:

data= 'some text'
step = 2
splitted_data = [tuple(data[i:i+step]) for i in range(0, len(data), step)]

Но результат здесь не тот:
[('s', 'o'), ('m', 'e'), (' ', 't'), ('e', 'x'), ('t',)]. Думал со вложенным циклом туда же сделать,  но так я не умею

Немного дополнив мой предыдущий ответ получим:

data='some text'
pagination = lambda s, n : [ s[i:i+n] for i in (range(0,len(s),n)) ]
N=2
full_list = pagination(data, 2)
splitted_data = [tuple(full_list[n:n+N]) for n in range(0, len(full_list), N)]
print('splitted data:', splitted_data)

Вывод:

[('so', 'me'), (' t', 'ex'), ('t',)]

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


Напишите решение задачи ("Драконий покер") [закрыт]

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

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

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

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

Драконий покер - сложная игра и в нем есть специальный раунд, где требуется сбросить ровно n
карт, для того что бы набрать нужное количество баллов. Карты требуется сбрасывать как можно
быстрее. У игрока не может быть больше чем m карт. Изначально карт у игрока нет.
Игрок может взять ровно m карт за a секунд, или добрать всего одну карту за b секунд. Сброс
одной карты занимает ровно одну секунду. Помогите посчитать, за какое минимальное время игрок
сможет сбросить ровно n карт. Нельзя добрать карту, если у игрока уже m карт.
Формат входных данных
В строке находятся четыре целых числа n, m, a и b (1 <= n, m, a, b <= 10^4) — число карт, которое
сбросить, максимальное количество карт, которое может быть у игрока, время за которое можно
взять из колоды ровно m карт, и время за которое можно взять всего одну карту из колоды.
Формат выходных данных
Выведите одно число — минимальное время, которое понадобится игроку, что бы сбросить ровно
n карт.
Пример

стандартный ввод
3 2 1 1

стандартный вывод
5

Замечание
В тесте из условия требуется один раз полностью взять m карт, два раза сбросить по одной
карте, потом добрать одну карту из колоды и сбросить ее.
Есть такой пример моего кода, но больше примера он не проходит, почему ?

n,m,a,b = map(int, input ().split())
time = 0
cart = 0

while n > 0:
    if cart + m > m:
        n-=1
        cart -= 1
        time += 1
    else:
        if n - 1 == 0 and b <= a:
            cart += 1
            time += b
        else:
            cart += m
            time += a

print(time)

Попробуем по-простому:
<code>
n + min( (n//m)*a+(n%m)*b, ((n+m-1)//m)*a,   n*b)
</code>
Три случая - пачки по m + остаток по одной, все карты набраны в пачках с возможным перебором в последний раз (когда b велико), все карты берутся по одной (когда a велико)


как автоматизировать импорт данных вида ключ-значение в python?
хочу быстро закинуть эти данные в питон, чтобы потом ими воспользоваться. дана таблица буквенно-цифрового кодирования (ключ-значение). вручную закидывать рутинно, хочу узнать, какими способами можно воспользоваться для этого. изначально таблица в html
<code>
0   1   2   3   4   5   6   7   8   9   A   B   C   D   E
0   1   2   3   4   5   6   7   8   9   10  11  12  13  14

F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T
15  16  17  18  19  20  21  22  23  24  25  26  27  28  29

U   V   W   X   Y   Z   Пробел  $   %   *   +   -   .   /   :
30  31  32  33  34  35    36    37  38  39  40  41  42  43  44
</code>

ну если в html, то как то так можно
<code>
import pandas
all_tables = pandas.read_html(url)  # изначально таблица в html
my_table = all_tables[0]  # таблица буквенно-цифрового кодирования
dict_table = my_table.to_dict()  # ключ-значение
print(dict_table['V'])
</code>