Как сделать так, чтобы как только бот зайдет на сервер в дискорде, он создавал роль muted?
Я знаю, как сделать так, чтобы он выдавал эту роль, но без понятия как сделать так, чтобы ее создать

Это делается через ивент on_guild_join
<code>
@bot.event
async def on_guild_join(guild:discord.Guild):
    for role in guild.roles:
        if role.name == "muted":
            pass # role already exists
        else:
            permissions = discord.Permissions(read_messages=True)
            return await guild.create_role(name='muted', permissions=permissions)
</code>
Лучше роль сразу записывать в базу данных, чтобы было легче проверять её наличие по присоединению к серверу


Как вычислить самые последние подпапки?
Есть структура каталогов. Любая. В ней где то 3-4 уровня вложенности. Именно 3-4, т.е. где то 3, где то 4.
Нужно как то бахнуть действия с подпапкой именно там, где уже дальше подпапок нету. Т.е. только с теми подпапками, которые содержат только файлы.
Сейчас нарисовал себе вот такого монстра, который вроде как работает:
<code>
    for root, dirs, files in os.walk(folder_path, topdown=False):
        for name in dirs:
            sub_folder_path = os.path.join(root, name)

            for sub_root, sub_dirs, sub_files in os.walk(sub_folder_path, topdown=False):
                len_sub_dirs = len(sub_dirs)

            if not len_sub_dirs:
                print(sub_folder_path)
</code>
Пробовал гуглить - найти какую то простую проверку не удалось... Есть ли вариант оформить это как то проще? Заменить нижний for на что то попроще? Мне и количество то по идее не нужно, нужен сам факт - есть ли там хоть одна подпапка, или только файлы.

Ты будешь долго смеяться, но ты уже написал готовое решение =)
Просто немного неправильно.
os.walk - это уже deep обработчик папки. То-есть он смотрит папку, подпапки и файлы.
<code>
from os import walk

result: list[str] = []
for (path, folders, files) in walk(folder_path):
    # path - папка, folders - имена подпапок, files - имена файлов
    if len(folders) == 0: # если нету подпапок
        result.append(path)
print(result)
</code>


Как можно ускорить выполнение цикла for в python?
Есть вот такой вот цикл, заполняющий мне список:
<code>
        i = 0
        j = 1
        newArray = []

        for m in range(count):
            x = ArrayOfByte[i] + (ArrayOfByte[j] * 256)
            i += 2
            j += 2
            newArray.append((x >> swift) & 255)
</code>
Элементов в конечном списке получается много, на выполнение уходит несколько секунд, что довольно много, потому что мне не один раз приходится обращаться к методу, в котором есть этот цикл. Можно ли его как-то оптимизировать? Возможно ли преобразовать этот цикл в генератор? Где-то читал, что метод append довольно медленный, но не знаю какой-либо альтернативы ему. Может, стоит использовать массивы NumPy вместо списков?

Подготовка искусственных данных:

import numpy as np

count = 1_000_000
swift = 4
ArrayOfByte = np.random.randint(255, size=count*2)

Проверим, сколько будет работать обычный питон и сколько он насчитает:

%%time

i = 0
j = 1
newArray = []

for m in range(count):
    x = ArrayOfByte[i] + (ArrayOfByte[j] * 256)
    i += 2
    j += 2
    newArray.append((x >> swift) & 255)
print(sum(newArray))

Вывод:

118611957
CPU times: user 1.76 s, sys: 0 ns, total: 1.76 s
Wall time: 1.76 s

А теперь векторизованный код
numpy:

%%time

newArray = ((ArrayOfByte[::2] + (ArrayOfByte[1::2] * 256)) >> swift) & 255
print(newArray.sum())

Вывод:

118611957
CPU times: user 11 ms, sys: 0 ns, total: 11 ms
Wall time: 14.6 ms

Сумма чисел получилась та же, т.е. код выполняет одинаковые вычисления. При этом векторизованный код выполняется в
100 раз быстрее.
P.S. На более "мелких" типах данных вроде
np.uint8 разница между питоном и
numpy ещё больше - в 1000 раз.
Numpy на них работает ещё быстрее, а
Python ещё медленнее. По умолчанию используется тип
np.int64.


Пытался сделать inline кнопки на aiogram но выдёт ошибку
Ошибка
Непонимаю в чём ошибка,Буду благодарен всем кто поможет с кодом
Вот часть кода
<code>
async def cmd_inline_url(message: types.Message):
    keyboard1 = types.InlineKeyboardMarkup()
    keyboard1.add(types.InlineKeyboardButton(text="Номер", callback_data="num1"))
    keyboard2 = types.InlineKeyboardMarkup()
    keyboard2.add(types.InlineKeyboardButton(text="Номер", callback_data="num2"))
    keyboard3 = types.InlineKeyboardMarkup()
    keyboard3.add(types.InlineKeyboardButton(text="Номер", callback_data="num3"))
    keyboard4 = types.InlineKeyboardMarkup()
    keyboard4.add(types.InlineKeyboardButton(text="Номер", callback_data="num4"))
    keyboard5 = types.InlineKeyboardMarkup()
    keyboard5.add(types.InlineKeyboardButton(text="Номер", callback_data="num5"))
    *и так до 34|and so on until 34*
    keyboards = [keyboard1, keyboard2, keyboard3, keyboard4, keyboard5, keyboard6, keyboard7, keyboard8, keyboard9, keyboard10, keyboard11, keyboard12, keyboard13, keyboard14, keyboard15, keyboard16, keyboard17, keyboard18, keyboard19, keyboard20, keyboard21, keyboard22, keyboard23, keyboard24, keyboard25, keyboard26, keyboard27, keyboard28, keyboard29, keyboard30,keyboard31, keyboard32, keyboard33, keyboard34]
    await message.answer("Номера", reply_markup=keyboards)
</code>

Вместо того, чтобы создать одну клавиатуру и назначить ей кнопки, вы создаёте 34 клавиатур по одной кнопке в каждой - это в корне неправильная логика. Всю Вашу задачу можно уместить в несколько строчек кода:
<code>
async def cmd_inline_url(message: types.Message):
    keyboard = types.InlineKeyboardMarkup()

    for i in range(1, 35):
        keyboard.add(types.InlineKeyboardButton(text=f"Номер {i}", callback_data=f"num{i}"))

    await message.answer("Номера", reply_markup=keyboard)
</code>


Ответ бота на его пинг в дискорде
Я хотел бы сделать так чтобы после того как я буду @упоминать бота, он будет отправлять сообщения в ответ, не подскажете как это сделать?

Вы можете сделать что-то похожее на генератор рандомных сообщений при упоминании бота, или что-то в этом роде. Смотрите, как это можно сделать:

@bot.event
async def on_message(message):
    randommessage=['Зачем ты это сделал?', 'Привет, привет!', 'Вау, меня кто-то пинганул? Круто.']
    botuserid = f'<@!{bot.user.id}>'
    if botuserid  in message.content:
        await message.channel.send(f"{random.choice(randommessage)}")

А можно без рандомного сообщения при пинге. Просто убираете:

randommessage=['текст1', 'текст2']`

и в:

await message.channel.send('пишите свой текст!')


Что значит в питоне " |= "?
Что значит в питоне  " |= "

Это на месте | . a |= b в основном эквивалентно a = a | b .
|=-это так называемый расширенный оператор присваивания . Его цель состоит в том, чтобы выполнить операцию на месте или операцию, как и обычная операция | .
Есть, однако, некоторые отличия, так как вызывается другой метод объекта: для | это or() или ror() , для |= это ior() .


Как по нажатию inline кнопки получать значение из сообщения?
Вообщем У меня есть кнопка "Ввести токен" После её нажатия юзер должен ввести текст, а я должен этот текст как то получить и присвоить какой нибудь переменной
Вот кодик кнопки

profile_and_instructions=InlineKeyboardMarkup().row(
    InlineKeyboardButton(text="Инструкции",callback_data="instru"),#не обращаем внимание
    InlineKeyboardButton(text="Мой профиль",callback_data="profile"),# не обращаем внимание
    InlineKeyboardButton(text="Ввести токен",callback_data="token")#обращаем!!!!

@dp.callback_query_handler(lambda c: c.data == 'token')
async def instru(callback_query: types.CallbackQuery):
    #Хз чё тут писать, можете помочь? :3

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

from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup

class FSMToken(StatesGroup):
    token = State()

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

@dp.callback_query_handler(text = "Ввести токен", state = FSMToken.token)
async def instru(callback_query: types.CallbackQuery, state:FSMContext):
    await callback.message.answer('Введите токен:')
    await FSMToken.token.set()

После того как вы вызвали состояние, нужно принять сообщение через message_handler.

@dp.message_handler(state=FSMToken.token)
async def load_token(message: types.Message, state: FSMContext):
    data = message.text

После того как вы получили токен можете отправить его куда-то. После этого можете спокойно делать await state.reset_state() или await state.finish(). Только учитывайте, что после них память очистится, так как значение хранится во временной памяти, если его нигде не сохранять.


Последовательность команд Python [закрыт]

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

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

Закрыт 1 год назад.

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

Может кто объяснить почему в первой части при выполнении кода отсчет начиниается с  1, ведь начальное значение
x=0, а во второй части с
1
И 2 вопрос: Как работает выполнение кода во 2 случае? Ведь я не вывожу ничего, как интерпретатор понимает, что нужно выполнить этот код
x += 1, там же нет команды
print

1 случай

x = 0
while x < 5:
    x += 1
    print(f'The current value of x is {x}')

2 случай

x = 0
while x < 5:
    print(f'The current value of x is {x}')
    x += 1

Заранее спасибо и извините за столько легкие вопросы, только начинаю свою путь. Спасибо

1 случай

x = 0 # Старт это 0
while x < 5:
    x += 1 # x + 1 = 1
    print(f'The current value of x is {x}') # Выводим то что в x ( в прошлой строке мы изменили значение в x с 0 на 1)

Выведет 1..2...etc
2 случай

x = 0 # изначально у нас 0
while x < 5:
    print(f'The current value of x is {x}') # выводим значение переменной x = 0
    x += 1 # К x добавили 1, теперь x = 1

вывод такой 0..1...etc


Не выводится аватар пользователя
Не выводит аватар пользователя emb.set_image(url=member.avatar_url). Подскажите, пожалуйста, что делать ?
<code>
async def userinfo(ctx,member:nextcord.Member = None, guild: nextcord.Guild = None):
        #if member is None:
        member = ctx.author
        emb = nextcord.Embed(title="Информация о пользователе", color=member.color)
        emb.add_field(name="Имя:", value=member.display_name,inline=False)
        emb.set_image(url=member.avatar_url)
        emb.add_field(name="Айди пользователя:", value=member.id,inline=False)
        emb.add_field(name="Роль на сервере:", value=f"{member.top_role.mention}",inline=False)
        emb.add_field(name="Уровень на сервере:", value=f"{cursor.execute('SELECT lvl FROM  users'.format()).fetchone()[0]}", inline=False)
        emb.add_field(name="Предупреждение на сервере:",value=f"{cursor.execute('SELECT warn FROM  users'.format()).fetchone()[0]}", inline=False)
        emb.add_field(name="Акаунт был создан:", value=member.created_at.strftime("%a, %#d %B %Y, %I:%M %p UTC"),inline=False)
        await ctx.send(embed = emb)
</code>

В
nextcord нет
avatar_url

async def userinfo(ctx,member:nextcord.Member = None, guild: nextcord.Guild = None):
        member = ctx.author if not member else member
        member_avatar = member.avatar if member.avatar else member.display_avatar
        emb = nextcord.Embed(title="Информация о пользователе", color=member.color)
        emb.add_field(name="Имя:", value=member.display_name,inline=False)
        emb.set_image(url=member_avatar)
        emb.add_field(name="Айди пользователя:", value=member.id,inline=False)
        emb.add_field(name="Роль на сервере:", value=f"{member.top_role.mention}",inline=False)
        emb.add_field(name="Уровень на сервере:", value=f"{cursor.execute('SELECT lvl FROM  users'.format()).fetchone()[0]}", inline=False)
        emb.add_field(name="Предупреждение на сервере:",value=f"{cursor.execute('SELECT warn FROM  users'.format()).fetchone()[0]}", inline=False)
        emb.add_field(name="Акаунт был создан:", value=member.created_at.strftime("%a, %#d %B %Y, %I:%M %p UTC"),inline=False)
        await ctx.send(embed = emb)


Как отправлять сообщения в канал через бота? Discord bot
Приведу пример:
Я администратор сервера, я пишу боту в личные сообщения текст например и фото, бот отправляем это сообщение в определенный канал от своего имени. И такие сообщения отправляются только от админа.
Я новичок! Спасибо за любую помощь ..
discord.py

Можно использовать ивент
on_message

@bot.event
async def on_message(message: discord.Message):
    channel = discord.utils.get(message.author.guild.text_channels, id='айди канала')
    if not message.guild:
        if message.author.id == 'админ айди':
            await channel.send(message.content)

@commands.Cog.listener()
async def on_message(self, message: discord.Message):
    channel = discord.utils.get(message.author.guild.text_channels, id='айди канала')
    if not message.guild:
        if message.author.id == 'админ айди':
            await channel.send(message.content)

p.s. ds: RAINGM#1941


Как поместить все страницы PDF-файла в Indesign используя python?
Поиски по интернету дали такие плоды:

import win32com.client
app = win32com.client.Dispatch('InDesign.Application')

myFile = r'C:\test.indd'
myDocument = app.Open(myFile)
myPage = myDocument.Pages.Item(1)

for x in range(0, 5):
    myPage = myDocument.Pages.Add()

for a in range(0,5):
    myPage = myDocument.Pages.Item(a + 1)
    myRectangle = myPage.Rectangles.Add()
    myRectangle.GeometricBounds = ["0", "0", "297mm", "210mm"]
    myRectangle.StrokeWeight = 0
    myPlace = myRectangle.Place(r'C:\mail.pdf')

Мне осталось сделать так, чтобы из PDF-файла помещались страницы (например с 1-20стр.) на каждую отдельную страницу в Indesign. Я нашел этот код на сайте adobe indesign, но не получается додумать до конца... Выскакивает ошибка, что такой переменной не существует (myPage.PDFPlacePreference.PageNumber = "2").

myPage.PDFPlacePreference.PageNumber = "2"
myPlacePDFFile = myPage.Place(r'C:\mail.pdf')

Попробуй добавить букву 's' в 'Preferences',
app вместо
myPage,
2 вместо
"2":

app.PDFPlacePreferences.PageNumber = 2


помогите разогнать код
нужно чтобы код работал с числами 10^12, не знаю что с ним делать
исходная задача: нужно рассчитать, сколько последовательностей с двумя 0 (ровно двумя, 000 уже не считается) на конце получится, если перебирать все системы счисления до n
<code>
n = int(input())
z = 0
for i in range(2, n+1)
    if n % i == 0:
        y = n // i
        if y % i != 0:
            z += 1
print(z)
</code>

Перебор сразу сверху ограничить квадратным корнем из N. Т.к. в больших системах это число будет представлено меньше чем тремя знаками, и значит точно не будет оканчиваться двумя нулями.
Например: Число 100 в 10-чной системе счисления это минимальное трёхзначное число. Так что если исходное число, скажем, 99, то квадратный корень от него меньше 10, и проверять в десятичной (и выше) системе вообще не имеет никакого смысла.
<code>
n = int(input())
z = 0
for i in range(2, int(n**0.5)+1):
    if n % (i*i) == 0 and n % (i*i*i) != 0:
        z += 1
print(z)
</code>


Область видимости итератора в for + if Python
Цикл for перебирает элементы списка "a" и сравнивает 1 элемент и следующий за ним другой элемент

a = [1, 1, 2, 3, 4, 4, 4, 5, 6, 7]

for (i, j) in (zip(range(len(a)), range(1, len(a)+1))):
    if int(a[i]) == int(a[j]):
        print(a[i])
        i += 2
        j += 2

В результате выводятся последние две 4, а нужно чтобы код выполнил сравнения:

...
3≠4
4=4
4≠5
...

Как пропустить среднюю 4 в списке "а"? Попробовал их вручную увеличивать (последние две строки кода), но это не дает сделать область видимости (если я правильно понял).
На данном этапе результат выполнения кода: 1 4 4
А я пытаюсь получит: 1 4
P.s. этот код будет в отдельной функции и массив у него будет и нескольких тысяч значений.

Используйте цикл
while для ручного управления индексом. Цикл
for на каждой итерации обновляет свои переменные вне зависимости от того, что в них было записано вами в теле цикла.

a = [1, 1, 2, 3, 4, 4, 4, 5, 6, 7]
i = 0
while i < len(a)-1:
    if a[i] == a[i+1]:
        print(a[i], "=", a[i+1])
        i += 1
    else:
        print(a[i], "≠", a[i+1])
    i += 1

1 = 1
2 ≠ 3
3 ≠ 4
4 = 4
4 ≠ 5
5 ≠ 6
6 ≠ 7


Бот не отвечает на команду
Что делать если бот не отвечает на команду?
Делаю чат-бота с обучением.
Типо если он не знает какой-то команды, то он спрашивает что ему отвечать, и если эту команду написать потом, то он ответит то, что я ему сказал.
<code>
cmds = []

ans = []

inp = input()

ln = len(cmds)

while inp == cmds:
  f = cmds.index(inp)
  print(f'{ans[f]}')
  inp = input()
else:
  print('Я не знаю этой команды. Что мне отвечать?')
  otv = input()
  cmds.insert(ln, inp)
  ans.insert(ln, otv)
  inp = input()
</code>
И если я ввожу что ему отвечать, и потом ввожу эту команду, то процесс программы просто заканчивается, и никаких ошибок даже не выводит. Что делать?

Проганите ваш код через по шаговый визуализатор кода Пайтон может поймете в чем вы ошиблись.
<code>
cmds = ['Спать']
ans = ['Приятных снов, хозяин.']

while True:
    inp = input('Чего изволите,хозяин?')
    if inp == '0':
        print(ans[0])
        break
    if inp in cmds:
        f = cmds.index(inp)
        print(ans[f])
        if f == 0:
            break

    else:
        otv = input('Я не знаю этой команды, хозяин. Что мне делать?')
        if inp == '0':
            print(ans[0])
            break
        cmds.append(inp)
        ans.append(otv)

</code>


Дополнение 4-мерной матрицы
У меня есть 4-мерная матрица размера n × n × n × n заполненная числами. Мне надо дополнить её нулями до размера m × m × m × m. Подскажите, пожалуйста, короткий способ это сделать без использования библиотек.
Пример исходной матрицы размера 2 × 2 × 2 × 2

a = [[[[0, 1], [0, 0]], [[6, 0], [0, 0]]], [[[0, 0], [8, 3]], [[0, 0], [0, 9]]]]

Любопытная оказалась задачка. Конечно, с numpy было бы куда проще, а так пришлось поломать голову. Получился такой, довольно неказистый код, но вроде работает:

def ext(matr, m):
    ''' matr - исходная матрица (list),
        m - необходимый размер (int)
    '''
    def dims(x,m,d):
        if d:
            if len(x) < m:
                if d>1: x+=[[] for _ in range(m-len(x))]
                else: x+=[0] * (m-len(x))
            for i in x: dims(i,m,d-1)  # рекурсивно проходим все вложенные списки
        return x

    f = lambda x: 0 if not x or type(x)!=list else 1 + f(x[0])  # определяем измерения исходной матрицы
    return dims(matr,m,f(matr))

a = [[[[0, 1], [0, 0]], [[6, 0], [0, 0]]], [[[0, 0], [8, 3]], [[0, 0], [0, 9]]]]
ext(a, 3)  # расширяем матрицу 2х2х2х2 до размера 3х3х3х3

результат:

[[[[0, 1, 0], [0, 0, 0], [0, 0, 0]],
  [[6, 0, 0], [0, 0, 0], [0, 0, 0]],
  [[0, 0, 0], [0, 0, 0], [0, 0, 0]]],
 [[[0, 0, 0], [8, 3, 0], [0, 0, 0]],
  [[0, 0, 0], [0, 9, 0], [0, 0, 0]],
  [[0, 0, 0], [0, 0, 0], [0, 0, 0]]],
 [[[0, 0, 0], [0, 0, 0], [0, 0, 0]],
  [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
  [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]]


Сохранение информации в словарь Pyhton
Не могу разобраться как сохранять информацию о более чем двух пользователей.
Выводит только последнего введенного пользователя.
Буду очень благодарен, так как инфы не нашел.
<code>
user_name = {}
arhive = True

while arhive:
   user_names = input("Pleas creat a nickname: ")
   location = input("Where are you from: ")
   pin = input("Create a pin: ")

   user_name['Name'] = user_names
   user_name['Location'] = location
   user_name['Pin'] = pin

finis = input("Want to register one more user?(yes/no)?: ")
   if 'yes' in finis:
       continue
   if 'no' in finis:
       print ("You have successfully register.")
       arhive = False

for key,value in user_name.items():
   print (f"{key}: {value}")
</code>

вариант 1:
если нужен словарь - так и используйте словарь где в качестве ключа - имя

user_name = dict()
arhive = True

while arhive:
   user_names = input("Pleas creat a nickname: ")
   location = input("Where are you from: ")
   pin = input("Create a pin: ")

   user_name[user_names] = {'location': location, 'pin': pin}

   finis = input("Want to register one more user?(yes/no)?: ")
   if 'no' in finis:
       print ("You have successfully register.")
       arhive = False

for key, value in user_name.items():
   print (f"{key}: {value}")

вариант 2:
или используйте список, где в качестве элемента будет словарь:

user_name = list()
arhive = True

while arhive:
   user_names = input("Pleas creat a nickname: ")
   location = input("Where are you from: ")
   pin = input("Create a pin: ")

   user_name.append({'Name': user_names, 'Location': location, 'Pin': pin})

finis = input("Want to register one more user?(yes/no)?: ")
   if 'no' in finis:
       print ("You have successfully register.")
       arhive = False

for obj in user_name:
   print (f"{obj[name]}: {obj[location]}, {obj[pin]}")

P.S.
а вы принципиально у слов последние буквы отрезаете?


Telegram-бот. Python, через telebot. Работа с кнопками
Нет реакции при нажатии кнопок в "consent_message", то есть не выводится сообщение из "answer_no". При этом, если "answer_no" поставить после "start_message" и в call.data заменить переменную на 'hi', то "answer_no" работает.
То есть как-то нарушена связь между второй и третьей частью. Или как-то некорректно завершается вторая часть.
<code>
@bot.message_handler(commands=['start'])
def start_message(message):
    hi = types.InlineKeyboardMarkup()
    hi.add(types.InlineKeyboardButton(text='Привет', callback_data='hi'))
    bot.send_message(message.chat.id, 'Приветствуем, {0.first_name}!   '.format(message.from_user),reply_markup=hi)

@bot.callback_query_handler(func=lambda call: True)
def consent_message(call):
    if call.message:
        if call.data == 'hi':
            bot.answer_callback_query(call.id)
            consent = types.InlineKeyboardMarkup(row_width=1)
            consent.add(types.InlineKeyboardButton(text='Согласен',
              callback_data='yes'))
            consent.add(types.InlineKeyboardButton(text='Нет. Я хочу
              покинуть данный бот',callback_data='no'))
            bot.send_message(call.message.chat.id, 'Далее будут отправлены вопросы анкетирования.', reply_markup=consent)

@bot.callback_query_handler(func=lambda call: True)
def answer_no(call):
        if call.message:
            if call.data == 'no':
                bot.send_message(call.message.chat.id, 'Жаль, что Вы не останетесь с нами. Следуйте ниже написанной инструкции, чтобы покинуть бот.')
</code>

Должно помочь
<code>
@bot.callback_query_handler(func=lambda call: True)
def consent_message(call):
    if call.message:
        if call.data == 'hi':
            bot.answer_callback_query(call.id)
            consent = types.InlineKeyboardMarkup(row_width=1)
            consent.add(types.InlineKeyboardButton(text='Согласен',
              callback_data='yes'))
            consent.add(types.InlineKeyboardButton(text='Нет. Я хочу
              покинуть данный бот',callback_data='no'))
            bot.send_message(call.message.chat.id, 'Далее будут отправлены вопросы анкетирования.', reply_markup=consent)
        elif call.data == 'no':
            bot.send_message(call.message.chat.id, 'Жаль, что Вы не останетесь с нами. Следуйте ниже написанной инструкции, чтобы покинуть бот.')
</code>


Не отправляться сообщения всем пользователям
Проблема в том что бот отправляет сообщение только 5ти пользователям. Что мне делать
<code>
@bot.command()  # Рассылка message_all
    @commands.has_permissions(administrator=True)  # права на команду
    async def message_all(ctx):
        #channel = bot.get_channel(876391511493836800)
        content = "Здравствуйте выжившие ! Это плановая проверка системы оповещения бота. Есле вас не затруднит отправте + в общий канал. С любовью EventBot \n Hello survivors! This is a routine check of the bot's alert system. If it does not bother you, send + to the general channel. Love EventBot"
        for guild in bot.guilds:
            for member in guild.members:
                await member.send(content)
                #await channel.send(f'Сообщения были отправлено этому пользователю : {str(member)} ')
                print("Отправил " + str(member))
                await asyncio.sleep(5)
</code>

Возможно у пользователя заблочена личка для рандомов, есть решение:

<code>
    @bot.command()  # Рассылка message_all
    @commands.has_permissions(administrator=True)  # права на команду
    async def message_all(ctx):
        #channel = bot.get_channel(876391511493836800)
        content = "Здравствуйте выжившие ! Это плановая проверка системы оповещения бота. Есле вас не затруднит отправте + в общий канал. С любовью EventBot \n Hello survivors! This is a routine check of the bot's alert system. If it does not bother you, send + to the general channel. Love EventBot"
        for guild in bot.guilds:
            for member in guild.members:
                try:
                    await member.send(content)
                    #await channel.send(f'Сообщения были отправлено этому пользователю : {str(member)} ')
                    print("Отправил " + str(member))
                    await asyncio.sleep(5)
                except:
                    pass
</code>


Как задать диапазон и передать индексу dataframe?
Есть, список значений индекса полученный из dataframe  : list_data = [5,10]
Нужно, из каждого элемента списка list_data сформировать такой диапазон, для значения '5' : 2-6, а для '10' : 7-11, где начало -3 к значению элемента списка, а для конца +1 к значению элемента списка.
Полученные диапазоны передать датафрейму, где каждый элемент диапазона является индексом для этого дата фрейма, для заполнения атрибута датафрейма.
Псевдо пример:
<code>
df
list_data = [5,10]
for i in list_data:
 df['att1'].loc[list_data(i).shift(-3) between list_data(i).shift(1)]=='Key_val'
</code>

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

list_data = [5,10]
new_index=[]
for i in list_data:
    for j in range (i-3,i+2):
      new_index.append(j)
print(new_index)

Для вашего примера получаем

[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

Теперь список new_index вы хотите использовать как индекс для некоего датафрейма.
Создаем датафрейм, в котором заготавливаем столько строчек, сколько у вас значений в созданном индексе, и используем созданный список для создания индекс-меток. Строки пока вообще не задаем, как и сами значения в датафрейме:

df=pd.DataFrame(index=new_index)

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


БД бота внутри секундомера
есть 2 файла, 1 - это бот, 2 - это секундомер
Проблема состоит в следующем, как в секундомере в периоде 4 часов, отнимать 1(из столбца food) у всех юзеров из БД бота, вот код секундомера

import asyncio
import sqlite3

db = sqlite3.connect("pdb.db")
sql = db.cursor()
db.commit()

async def start(sec, minute, hour):
    while True:
        await asyncio.sleep(1)
        sec += 1
        if sec == 60:
             sec -= 60
             minute += 1
        if minute == 60:
             minute -= 60
             hour += 1
        if hour == 4:
             pass

я додумался до того, что-бы записывать id пользователя в список:

id_user = []
for id in sql.execute("SELECT id FROM profile"):
    id = id[0]
    id_user.append(id)

Теперь есть почти-что самый главный вопрос, как пройтись по списку id_user по-очереди

Я уже нашел решение:
<code>
for test in id_user:
    print(f'food: {sql.execute(f"SELECT food FROM profile WHERE id = {test}").fetchone()[0]}')
</code>


Расчёт PSNR изображений Python
Как я могу расчитать PSNR для изображений в Python, представленных в следующем виде:
<code>
container = Image.open(container_path, 'r')
container_pixels_array = np.array(list(container.getdata()))

img = Image.open(image_path, 'r')
img_pixels_array = np.array(list(img.getdata()))

width, height = container.size
</code>
Может, есть специальные модули, или придётся писать функция вручную?

Для начала создаём массивы пикселей для начального и выходного изображений, затем производим расчёт по формуле:
<code>
container = Image.open(container_path, 'r')
container_pixels_array = np.array(list(container.getdata()))
width, height = container.size
container_pixels_array = container_pixels_array.reshape(height, width, 3)

img = Image.open(image_path, 'r')
img_pixels_array = np.array(list(img.getdata()))
img_pixels_array = img_pixels_array.reshape(height, width, 3)

mse = np.mean((container_pixels_array - img_pixels_array) ** 2)

if mse == 0:
    print(100)
else:
    max_pixel_val = 255.0
    psnr = 20 * log10(max_pixel_val / sqrt(mse))

    print(psnr)
</code>


Здравствуйте. Помогите новичку в написании кода. Мне нужно в одномерном массиве вычислить сумму значений массива с нечетными индексами
<code>
#Произвадим ввод библиотек математики и рандома
from math import*
from random import*
#Здесь производим вывод надписи на экран и попутно элемент для вычисления
n=int(input("Введите количество элементов в массиве: " ))
#Вводим пустой массив
arr=[]
#Производим ввод массива (я взял массив от -15 до 15)
for i in range(n):
    arr.append(randint(-15,15))
    #Производим показ получившегося массива
print(arr)
min=arr[0]
#Зададим в 2 единицы для вычисления
#Одну из них берем за 0
k=0
j=1
#Пишем условие для j
x=j%2==0
#В последней строке не уверен что она правильная
</code>

Создадим функцию которая принимает на вход массив и выводит сумму нечётных индексов
<code>
def odd_sum(a) -> int:
    s = 0
    for i in range(1, len(a), 2):
        s += a[i]
    return s
</code>


Как определить что пользователь отправил число боту а не строку?
Я хочу сделать проверку на то что пользователь отправил команду с цифрами а не строки
<code>
@bot.command()
async def greetingsCHANL(ctx,amount: int = None ):
    if amount == None:
        await ctx.send(f"{ctx.author.name} Введи iD канала преведствия")
    else:
        if type(amount) == str: #isinstance
            await ctx.send(f"{ctx.author.name} Введи iD канала преведствия")
        else:
            cursorLB.execute('UPDATE allvariables SET greetingsCHANL =?', [f"{amount}"])
            # cursor.execute("UPDATES users SET date +=? WHERE id = ?",(massage,member.id))
            Allvariables.commit()
            await ctx.send(cursorLB.execute("SELECT greetingsCHANL FROM allvariables ".format()).fetchone()[0])
</code>

Можно сделать что-то вроде:
<code>
 number = int(input("Введите число: "))
</code>
И прописать исключения try, exept, для обработки, если пользователь введëт не число.


(Least Significant Bit, LSB) Python
При реализации алгоритма LSB на Python столкнулся со следующей проблемой: После замены младших битов исходного изображения я сохраняю изменённую версию как новое изображение. Но после дальнейшего его чтения с целью декодирования обнаруживаю, что пиксели остались неизменными.
Функция, где происходит кодирование и запись:
<code>
def insertData(self, data_to_insert, container_path, image_path):
    img = Image.open(container_path, 'r')
    pixels_array = np.array(list(img.getdata()))
    total_pixels = pixels_array.size // 3
    width, height = img.size
    reqired_pixels = len(data_to_insert)

    if reqired_pixels > total_pixels:
        print('ERROR: largrer file required')
    else:
        index = 0
        for pixel in range(total_pixels):
            for code in range(3):
                if index < reqired_pixels:
                    seven_bits = bin(pixels_array[pixel][code])[2:9]
                    eighth_bit =  data_to_insert[index]
                    pixels_array[pixel][code] = int(seven_bits + eighth_bit, 2)
                    index += 1

    pixels_array = pixels_array.reshape(height, width, 3)
    enc_img = Image.fromarray(pixels_array.astype('uint8'))
    enc_img.save(image_path)
</code>
Для теста использую изображение 8x8 px полностью белое.
Пример сообщения в виде строки: "bob$t3g0"
В формате '08b': 0110001001101111011000100010010001110100001100110110011100110000

Было необходимо использовать только '.png' файлы.


Дан массив символов, среди которых есть символ '#'.Определить, сколько символов стоит после него [закрыт]

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

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

Закрыт 1 год назад.

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

Python Дан массив символов, среди которых есть символ '#'.Определить, сколько символов стоит после него.

вам понадобится

метод
.index('#'), чтобы найти его позицию в списке
функция
len для определения размера списка
вычитание для определения сколько символов осталось после
#


Палиндром на Python
Почему этот код верный, а нижний нет? Для чего нужна temp?

n = int(input('type num: '))
rev = 0
temp=n

while(n>0):
    rev = (rev*10) + (n%10)
    n=n//10

if temp == rev:
    print('palindrom')
else:
    print('not')

2 код:

n = int(input('type num: '))
rev = 0

while(n>0):
    rev = (rev*10) + (n%10)
    n=n//10

if n == rev:
    print('palindrom')
else:
    print('not')

потому что во втором случае вы меняете
n и сравниваете потом с
n:

if n == rev:
    print('palindrom')
else:
    print('not')

но из-за
while(n>0): у вас
n всегда при последующей проверке равно 0
именно поэтому в первом случае
n и сохраняется предварительно в
temp, чтобы потом сравнивать с первоначальным значением
n


Как сделать, чтобы значения в словаре добавлялись с изменением значения переменной? // Python
У меня есть переменные keys и value.
Их значения постоянно меняются, я хочу сделать, чтобы в словарь заносились значения этих переменных(keys будет ключом, value значением). Но когда значения этих переменных поменялись, прошлые значения остались в словаре, а новые занеслись, и так каждый раз, когда переменным присваивались новые значения.
Как это можно реализовать?

keys = {}
database = {}

def add(key, value):
    if key in keys:
        keys[key] += 1
        database[key + "_" + str(keys[key])] = value
    else:
        database[key] = value
        keys[key] = 0

def get_latest(key):
    if key in keys:
        if keys[key] == 0:
            return database[key]
        else:
            return database[key + "_" + str(keys[key])]
    return None

add("hello", "world")
add("hello", "univerce")
add("hello", "another world")

print(keys)
print(database)

print("latest hello = ", get_latest("hello"))


Алгоритм пузырьковой сортировки в PrettyTable
Нужно отсортировать фамилии в алфавитном порядке, обязательно методом пузырьковой сортировки.
Код:
<code>
from prettytable import PrettyTable, HEADER

def Load():
    with open ('Workers.txt', encoding='utf-8') as file:
        v = list(file.read().splitlines())

        d=int(v[0])

        for i in range(len(v)):
            if i == 0:
                continue

        #Фамилии
            elif i % 2 == 1:
                sd_name = ''
                sd_name += v[i]
                sd_name += '                                '

        #Числа
            elif i % 2 == 0:
                z = v[i]
                x = int(z[0] + z[1])
                y = float(z[3] + z[4] + z[5] + z[6])

                itogo=''
                itogo+=str(x*y)

                days=''
                days+=str(x)

                oklad=''
                oklad+=str(y)

                zrplt = round(((x * y) / d), 2)

                summa.append(zrplt)

                Save(zrplt, sd_name, days, oklad)

summa=[]

t = PrettyTable()
t.field_names = ["                Фамилия", "Дни", "  Оклад   ", " Зарплата "]

def Save(zrplt,sd_name,days,oklad):
    with open('Pay.txt', 'w', encoding='utf-8') as f:

        t.add_rows(
            [
                [sd_name,days,oklad,zrplt]

            ]
        )

        t.align["                Фамилия"] = 'l'
        t.align["Дни"] = 'r'
        t.align["  Оклад   "] = 'r'
        t.align[" Зарплата "] = 'r'

        f.write(str(t))
        print(t)

Load()
it=sum(summa)

with open('Pay.txt', 'a', encoding='utf-8') as f:
    f.write('\n')

with open('Pay.txt', 'a', encoding='utf-8') as f:
    k=PrettyTable()
    k.hrules=HEADER
    k.vrules=False

    k.field_names=['Итого                                                       | ', it]

    k.align['Итого                                                         '] = 'l'
    k.align[it] = 'r'

    f.write(str(k))
    print(k)
</code>
Workers:
24
Петров
15 6300
Иванов
24 5600
Сидоров
19 4350
Николаев
15 4800
Малышев
21 4350
Соколов
12 7800


Сортировка списка Python по нескольким параметрам
У меня есть список :

list1 = ['black 2340 1743', 'black 3948 2011', 'black 396 1739', 'black 5080 463', 'black 5864 2059']
Мне необходимо отсортировать сначала по алфавитному порядку первый элемент(цвет), если он повторяется, отсортировать по 3 параметру в порядке возрастания, а если и он повторяется, то отсортировать по 2 парамету в порядке возрастания. Возможно ли это?

Используйте функцию
sorted с параметром
key [1] и [2].

array = ['black 2340 1743', 'black 3948 2011', 'black 396 1739', 'black 5080 463', 'black 5864 2059']

def key(element):
    color, x, y = element.split()
    return (color, int(y), int(x))

print(sorted(array, key=key))
# ['black 5080 463', 'black 396 1739', 'black 2340 1743', 'black 3948 2011', 'black 5864 2059']


Компиляция JIT в библиотеке numba
Есть некоторый код, который считает число Пи.

@numba.njit(parallel=True)
def calc(iter_count):
    result = 1
    for i in numba.prange(1, iter_count):
        result += ((-1)**i)/(2*i+1)
    return result

Возможно ли вынести компиляцию, когда программа только запускается, а не во время первого вызова метода
calc()?

Выдержка из документации:

While Numba’s main use case is Just-in-Time compilation, it also
provides a facility for Ahead-of-Time compilation (AOT).
Benefits

AOT compilation produces a compiled extension module which does not depend on Numba: you can distribute the module on machines which do
not have Numba installed (but Numpy is required).
There is no compilation overhead at runtime (but see the @jit cache option), nor any overhead of importing Numba.

Limitations

AOT compilation only allows for regular functions, not ufuncs.
You have to specify function signatures explicitly.
Each exported function can have only one signature (but you can export several different signatures under different names).
AOT compilation produces generic code for your CPU’s architectural family (for example “x86-64”), while JIT compilation produces code
optimized for your particular CPU model.


Поставить DISLIKE, удаляя LIKE. Django
Возможно кто-нибудь сможет помочь.
Имеется проект на  Django, в который я пытаюсь добавить функцию LIKE/DISLIKE.
Как пользователю добавить или снять LIKE/DISLIKE я разобрался. Но моя логика имеет пробел, в том что пользователь может поставить и LIKE и DISLIKE (это не совсем правильно). Поэтому я хочу сделать "финт ушами" следующим образом: если пользователь поставил LIKE, потом передумал и ставит DISLIKE, то что бы DISLIKE приплюсовался, а LIKE отминусовался автоматически (так же как происходит на YouTube).
У меня есть следующие вьюхи:

class AddLikeView(View)
class RemoveLikeView(View)
class AddDisLikeView(View)
class RemoveDisLikeView(View)

Я так понимаю, мне надо прописать какую то логику в AddDisLikeView и RemoveLikeView. Подскажите пожалуйста.
<code>
class AddDisLikeView(View):
def post(self, request, *args, **kwargs):
    blog_post_id = int(request.POST.get('blog_post_id'))
    user_id = int(request.POST.get('user_id'))
    url_from = request.POST.get('url_from')

    user_inst = User.objects.get(id=user_id)
    blog_post_inst = News.objects.get(id=blog_post_id)

    try:
        blog_dislike_inst = BlogDisLikes.objects.get(blog_post=blog_post_inst, liked_by=user_inst)
    except Exception as e:
        blog_dislike = BlogDisLikes(blog_post=blog_post_inst,
                              disliked_by=user_inst,
                              dislike=True)
        blog_dislike.save()
    return redirect(url_from)

class RemoveLikeView(View):
def post(self, request, *args, **kwargs):
    blog_likes_id = int(request.POST.get('blog_likes_id'))
    url_from = request.POST.get('url_from')

    blog_like = BlogLikes.objects.get(id=blog_likes_id)
    blog_like.delete()
    return redirect(url_from)
</code>

Вынеси функционал по увеличению, уменьшению лайков и дизлайков в сервисные методы и вызывай их из своих view
например:

def add_dislike(post, user):
    try:
        BlogDisLikes.objects.get(blog_post=post, liked_by=user)
    except BlogDisLikes.DoesNotExist:
        BlogDisLikes.objects.create(blog_post=post, liked_by=user)

def remove_dislike(post, user):
    BlogDisLikes.objects.filter(blog_post=post, liked_by=user).delete()

def add_like(post, user):
    try:
        BlogLikes.objects.get(blog_post=post, liked_by=user)
    except BlogLikes.DoesNotExist:
        BlogLikes.objects.create(blog_post=post, liked_by=user)

def remove_like(post, user):
    BlogLikes.objects.filter(blog_post=post, liked_by=user).delete()

и тогда твои view будут выглядеть как-то так

class AddDisLikeView(View):
    def post(self, request, *args, **kwargs):
        blog_post_id = int(request.POST.get('blog_post_id'))
        user_id = int(request.POST.get('user_id'))
        url_from = request.POST.get('url_from')

        user_inst = User.objects.get(id=user_id)
        blog_post_inst = News.objects.get(id=blog_post_id)
        remove_like(post=blog_post_inst, user=user_inst)
        add_dislike(post=blog_post_inst, user=user_inst)
        return redirect(url_from)

если ты сделаешь у модели
BlogDisLikes уникальный ключ
blog_post,
liked_by
тогда можно просто пытаться сразу создать дизлайк, отлавливая исключение

from django.db import IntegrityError

def add_dislike(post, user):
    try:
        BlogDisLikes.objects.create(blog_post=post, liked_by=user)
    except IntegrityError:
        pass  # ничего не делаем, если такой диздайк уже есть

аналогично и для модели лайков


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

import cv2 as cv

image = get_img()
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

contours, hierarchies, _ = cv.findContours(gray, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)

centres = []

for i in contours:
  moment = cv.moments(i)
  if moment["m00"] != 0:
    x = int(moment['m10']/moment['m00'])
    y = int(moment['m01']/moment['m00'])
  else: continue
  centres.append(x)
  centres.append(y)

print(centres)

Впринципе он работает, но работает с готовыми изображениями. Проблема в том, что изображение генерируется через функцию
get_image(). Допустим генерируется квадрат с центро: в точке
200 200. Сейчас код начинает вести себя странно на этапе считывания моментов. Он находит кучу моментов
0 и
200, соответственно
x и
y получаются равны
0 и
200 и так много раз.
Можно ли как-то упросить эту функцию или есть ли более надежная?
Я начал изучать openCV пару дней назад с надобностью и скорее всего неверно понял как работают моменты...

Поиск чего-то в opencv работает не так как ожидатся. То есть зачастую возвращаются правильные результаты,- те на которые и рассчитывает разработчик. Но, так же часто возвращаются неверные результаты, которые к сожалению ни как нельзя проверить. Если суть задачи только в поиске белого квадрата, то проще напрямую работать с пикселями.


Чистое ООП на Python3
Создал метод, чтобы данные из класса
town переносились в список и уже из этого списка выбиралась случайным образом. Но создается 5 строк со множеством объектов, и не получается занести в список.
Помогите, пожалуйста!

import random
class I_am:
    def __init__(self , money , carrying):
        self.money = money
        self.carrying = carrying

class Town:
    random_town_spisok = []
    def __init__(self , name , ligs):
        self.name = name
        self.ligs = ligs
    def __repr__(self):
        return (self.name)

    def random(self, town):
        Town.random_town_spisok.append(town)
        Town.random_town_spisok = (random.choice(Town.random_town_spisok))
        print(Town.random_town_spisok)

class Product:
    def __init__(self, name, weight, quality, price):
        self.name = name
        self.weight = weight
        self.quality = quality
        self.price = price
    def __repr__(self):
        return (self.name)
        return (self.weight)

# Товар = деньги и грузоподъёмность
    def product_money(self, money, carrying):
        # Проверка на количество денег
        if money.money >= self.price:
            money.money = money.money - self.price
            print(f"Мы купили {self.name} за {self.price} биткоинов, на счету осталось {money.money} биткоинов!")
        else:
            print(f"Кошелек пуст")
            exit()

        #Проверка на грузоподъёмность
        if carrying.carrying >= self.weight:
            carrying.carrying = carrying.carrying - self.weight
        else:
            print(f"Машина загружена")
            exit()

class Event_useful:
    def __init__(self, name, ligs):
        self.name = name
        self.ligs = ligs
    def useful(self):
        pass

class Event_not_useful(Event_useful):
    def not_useful(self):
        pass

info = I_am(100, 70)

towns = [Town(*args) for args in (('Moskov', 100),
                                  ('Almaty',  60),
                                  ('Talgar',  50),
                                  ('Taraz' ,  80),
                                  ('Rostov',  90)
                                 )]
products = [Product(*args) for args in (('Мясо', 10, 1, 30),
                                        ('Сухофрукты', 2, 1,  8),
                                        ('Зерно', 7, 1, 10),
                                        ('Мука' , 8, 1, 10),
                                        ('Ткань', 20, 1, 16),
                                        ('Краска', 20, 1,  7)
                                       )]

events_useful = [Event_useful(*args) for args in (('Обычный день', 5),
                                     ('Ровная дорога', 2),
                                     ('Река', 2),
                                     ('Встретил местного', 6),
                                     )]

events_not_useful = [Event_not_useful(*args) for args in (('Дождь', 2),
                                     ('Телега сломалась', 0),
                                     ('Разбойники ',6)
                                     )]
for prod in products:
    prod.product_money(info, info)
for town in towns:
    town.random(towns)

Если надо выбрать случайный город из списка объектов, то вот так:

class Town:

    def __init__(self, name, ligs):
        self.name = name
        self.ligs = ligs
        self.random_town_spisok = []

    def __repr__(self):
        return self.name

    def random(self, town):
        self.random_town_spisok.append(town)
        self.random_town_spisok = random.choice(self.random_town_spisok)
        print(self.random_town_spisok)

towns = [Town(*args) for args in (('Moskov', 100),
                                  ('Almaty',  60),
                                  ('Talgar',  50),
                                  ('Taraz' ,  80),
                                  ('Rostov',  90)
                                 )]

random.choice([town.name for town in towns])

Вывод:

Almaty

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

class Town:

    def __init__(self, name, ligs):
        self.name = name
        self.ligs = ligs
        self.random_town_spisok = []

    def __repr__(self):
        return self.name

    def random(self, town):
        self.random_town_spisok.append(town)
        self.random_town_spisok = random.choice(self.random_town_spisok)
        print(self.random_town_spisok)

towns = [Town(*args) for args in (('Moskov', 100),
                                  ('Almaty',  60),
                                  ('Talgar',  50),
                                  ('Taraz' ,  80),
                                  ('Rostov',  90)
                                 )]

random_towns = []
for _ in range(5): # в данном случае список будет из 5 элементов
    random_towns.append(random.choice([town.name for town in towns]))

print(random_towns)

Вывод:

['Moskov', 'Taraz', 'Taraz', 'Talgar', 'Taraz']


Ошибка при вычислении mean_absolute_error
При вычислении
MAE вылезла ошибка:

Found input variables with inconsistent numbers of samples: [276, 355]

Хотя за 5 минут до этого всё хорошо считалось, не понимаю что пошло не так:

X = student_data.iloc[:, :-1].values
y= student_data['Grade'].values
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.1, random_state=100)

df_clf = tree.DecisionTreeClassifier(max_leaf_nodes=25, random_state=0)
df_clf.fit(X_train, y_train)

pred_trainy = df_clf.predict(X_train)
pred_testy = df_clf.predict(X_test)
print('mean_absolute_error train: %.2f, test: %.2f' %
      (mean_absolute_error(train_y, pred_trainy),
       mean_absolute_error(test_y, pred_testy)))

X_train, X_test, y_train, y_test = train_test_split(...
                 ^^^^^^^  ^^^^^^
...
      (mean_absolute_error(train_y, pred_trainy),
                           ^^^^^^^
       mean_absolute_error(test_y, pred_testy)))
                           ^^^^^^

Посмотрите внимательно на названия переменных, которые я подчеркнул. Видимо, одни из них (по которым вы считаете
MAE) остались у вас от других экспериментов и имеют другие размеры. Замените в подсчёте
MAE переменные на
y_train и
y_test и всё починится.


Баг со словарем в Python 3
Заметил баг при работе со словарём начиная с версии Python 3.6 до 3.9.9, а именно если использовать создание словаря со списком внутри с помощью dict.fromkeys(arr, []) , то при добавлении значений к определенному ключу, они добавляются ко всем ключам в словаре.
Подробнее на примерах ниже:

arr = [i for i in range(1, 6)]
my_dict = {1: [], 2: [], 3: [], 4: [], 5: []}

for _ in range(1, 3):
    my_dict[1] += [50]

print(my_dict)      # {1: [50, 50], 2: [], 3: [], 4: [], 5: []}

Как и ожидалось, код отработал корректно, дважды добавив к ключу "1" значение "50".
В следующем примере, создаем словарь с использованием dict.fromkeys(arr, [])  :

arr = [i for i in range(1, 6)]
my_dict = dict.fromkeys(arr, [])

for _ in range(1, 3):
    my_dict[1] += [50]

print(my_dict)      # {1: [50, 50], 2: [50, 50], 3: [50, 50], 4: [50, 50], 5: [50, 50]}

Код отработал непредсказуемым образом, дважды добавив значение "50" ко всем ключам в словаре. Кто может объяснить почему так происходит?

Рассмотрим на примере.
Вы думаете, что инициализация словаря пройдёт по этому сценарию:

my_dict = {}
for x in range(1, 6):
    my_dict[x] = []

print(my_dict)  #  {1: [], 2: [], 3: [], 4: [], 5: []}

my_dict[1].append("A")
print(my_dict)  #  {1: ['A'], 2: [], 3: [], 4: [], 5: []}

И вроде всё должно работать как надо.
Но нет. Когда вы определяете словарь вот так
dict.fromkeys(arr, []), то список, по сути, создаётся всего раз и ссылка на него идёт во все элементы словаря. Т.е. поведение эквивалентно данному коду:

my_dict = {}
my_list = []
for x in range(1, 6):
    my_dict[x] = my_list

print(my_dict)  #  {1: [], 2: [], 3: [], 4: [], 5: []}

my_dict[1].append("A")
print(my_dict)  # {1: ['A'], 2: ['A'], 3: ['A'], 4: ['A'], 5: ['A']}

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

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

my_dict = {x:[] for x in arr}


Можно ли приложение, написанное на PyQt5 встроить в веб-страницу?
Хочу попробовать свое приложение, написанное на PyQt5, вставить на веб-страницу, можно ли такое осуществить?
P.S.: Кода не приложу, просто теоретический вопрос.

Нет. Но есть косвенный способ, который но очень затруднителен: переписать все классы  pyqt так, чтобы они возвращали html+js, полагаю этом метод нереализуем...
Так же есть вариант с выводом изображения программы в веб, мониторинг кликов при помощи js, затем передавать все нажатия в программу. Допустим при помощи pynput, и обновлять выведенное изображение яваскриптом, но это создаёт огромную дыру в безопасности...
Есть так же варианты с видео, но принципы теже что и с фото...


Удалить словарь по значению
Имеется список словарей:

a = [{"word": "c", "count": 4}, {"word": "dog", "count": 2}, {"word": "_restore", "count": 1}, {"word": "-f", "count": 5}....]

Необходимо удалить те словари, в которых значение длины ключа "word" равно 1 и первый символ равен одному из этих знаков ['-', '_']
Пробовала реализовать это следующим образом, но выводит список без изменений

sp = []
for i in range(0, len(a)):
    if len(a[i]['word']) == 1 or a[i]['word'][0] in ['-', '_']:
        del a[i]

лучше не удалять из списка, а собрать список заново:

a = [{"word": "c", "count": 4}, {"word": "dog", "count": 2}, {"word": "_restore", "count": 1}, {"word": "-f", "count": 5}]

a = [obj for obj in a if len(obj['word']) != 1 and obj['word'][0] not in ('_', '-')]

print(a)

кроме того у вас в условии написано И (
в которых значение длины ключа "word" равно 1 и первый символ равен одному из этих знаков ['-', '_']), а в коде ИЛИ
я в примере привел вариант с ИЛИ
Но поскольку я не удаляю, а собираю список с нужными элементами, то условие такое:
размер не 1 и первый символ не '-' или '_'


Замена в списках по ключ.словам python
Час добрый. Подскажите пожалуйста как можно переделать код, который оставлю ниже, для замены не всех одинаковых элементов выбранных по ключу, а только, скажем второй
<code>
import random

list1 = ['пример', 'пример', '♥♥♥', 'пример', '♥♥']
list2 = ['1', '2', '3', '4', '5', '6', 'текст']
replace = 'пример'

unique2 = sorted(set(list2))
random.shuffle(unique2)
for j, i in enumerate([i for i, e in enumerate(list1) if e == replace]):
    list1[i] = unique2[j % len(unique2)]

print(list1)
</code>
То есть чтобы на выходе получить
list1 = ['пример', '2','♥♥♥', 'пример', '♥♥']
А не заменить все ключ.слова 'пример' на слова из списка 2

Ну вот ради эксперимента с itertools:

import itertools
counter = itertools.count(1)

list1 = ['пример', 'пример', '♥♥♥', 'пример', '♥♥']
list2 = ['1', '2', '3', '4', '5', '6', 'текст']
replace = ("пример", 3) #что заменять и какое по счету вхождение

tmp = [(next(counter), x) if x==replace[0] else (0, x) for x in list1 ]
res = [x[1] if x[0]!=replace[1] else list2[replace[1]-1] for x in tmp]

res:

['пример', 'пример', '♥♥♥', '3', '♥♥']


Как в Python ввести в массив n элементов в одну строку [закрыт]

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

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

Закрыт 1 год назад.

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

есть входные данные
a, b, c, d = map(int,input().split()
есть 3 массива B, G и R, в каждый из которых необходимо ввести числа, количество которых равно a, b, c соответственно.
нужно найти по 1 элементу из каждого массива что бы
B[i]^2 + G[i]^2 + R[i]^2 = d
при этом эти числа были разными.
помогите реализовать

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

a, b = 3, 5
tmp = '1 2 3 4 5 6 7 8 9 0'.split()
B, G = tmp[:a], tmp[a:a+b]
print(f"B = {B}    G = {G}")

А можно так:

a, b = 3, 5
B = '1 2 3 4 5 6 7 8 9 0'.split(maxsplit=a)
B, G = B[:-1], B[-1].split(maxsplit=b)[:-1]
print(f"B = {B}    G = {G}")

B = ['1', '2', '3']    G = ['4', '5', '6', '7', '8']


Проблема использования cursor.fetchone(). Ожидаю получить None, но получаю (None,)
Обращаюсь к пустой ячейке в базе данных на sqlite на python 3.8.
<code>
def get_translated_item_db(language, param):
    connect = sqlite3.connect('db\\users.db')
    cursor = connect.cursor()
    cursor.execute(f"SELECT \"{param}\" FROM languages WHERE language = \"{language}\"")
    one_result = cursor.fetchone()
    print(one_result) # (None,)
</code>
Почему не возвращается None без кортежа?

Если в таблице есть запись по такому условию и там в нужном вам поле значение
NULL, то возвращается
(None,), а если нет подходящей записи, то возвращается просто
None. –
CrazyElf (с)


Как проверить тип полученного контента Aiogram
Мне нужно чтобы пользователь отправил боту фотографию.
Вот кусок кода и функция которую я использую для получения и сохранения изображения.
<code>
from aiogram import types, Dispatcher
from create_app import dp, bot
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
import os, sys, pathlib

class FSMRegister(StatesGroup):
    shop = State()
    name = State()
    position = State()
    photo = State()

...

async def reg_photo(message : types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['photo'] = message.photo[0].file_id
    file_info = await bot.get_file(message.photo[0].file_id)
    filename, file_extension = os.path.splitext(file_info.file_path)
    await message.photo[-1].download('uploads/image' + file_extension)
    async with state.proxy() as data:
         await message.reply(str(data))
    await state.finish()

def register_handlers_register( dp : Dispatcher ):
    ...
    dp.register_message_handler(reg_photo, content_types=['photo'], state=FSMRegister.photo)
</code>
Но если пользователь отправляет вместо фотографии другой тип файла или текст то функция не срабатывает.
Как мне сделать что-бы при возникновении такой ситуации бот в ответ отправлял сообщение о некорректности отправленных данных?

Чтобы обрабатывать все типы сообщений укажите
content_types=['any']
Потом надо просто проверять есть ли фотография в сообщении

async def reg_photo(message: types.Message, state: FSMContext):
    if message.photo:
        pass # Ваш код в случае если пользователь отправил фото
    else:
        await message.answer("Это не фото")

def register_handlers_register( dp : Dispatcher ):
    dp.register_message_handler(reg_photo, content_types=['any'], state=FSMRegister.photo)


Как написать этот код чтобы работало, но не расписывать каждый полученный параметр (a, b, c, d, e)
<code>
def command(a, b, c, d, e, ...):
    for i in range(a, b, c, d, e, ...):
        print(i, 'Этим способом вылазиет ошибка')

command(1, 2, 3, 4, 5, ...)
</code>

*args — это сокращение от «arguments» (аргументы)

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

def command(*args):
    print(args)
    for i in args:
        print(i, 'Hello')

command(1, 2, 3, 4, 5 )


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

def count_substring(string,sub_string):
    l=len(sub_string)
    count=0
    for i in range(len(string)-len(sub_string)+1):
        if(string[i:i+len(sub_string)] == sub_string ):
            count+=1
    return count

if __name__ == '__main__':
    string = input().strip()
    sub_string = input().strip()

    count = count_substring(string, sub_string)
    print(count)

Может кто-то подробно объяснить как работает цикл
for? Что там происходит и что значит эта запись?:

if(string[i:i+len(sub_string)] == sub_string ):, а именно часть с двоеточием
т.к я не видел в учебниках по питону такого синтаксиса
Спасибо!

это называется "срез" и странно, что вы не видели это в учебнике - это база

data[start:end:step]

показывает как резать список (строку и т.д.)
data - начиная с позиции
start, заканчивая позицией (не включая ее)
end и с шагом
step
если не указан шаг, он считается равным 1
если не не указан
end, он считается равным размеру списка
Например:

data[7:]

сформировать список из всех элементов списка
data, начиная с 7

data[:15]

сформировать список из всех элементов списка
data, заканчивая 14ым

data[7:15:3]

сформировать список из каждого 3его элемента списка
data, начиная с 7 и заканчивая 14ым, т.е. 7, 10, 13

data[::-1]

развернуть список задом наперед - т.е. сформировать список начиная с последнего элемента и заканчивая первым
и т.д.
В вашем случае

string[i:i+len(sub_string)]

означает взять из строки
string подстроку размером
len(sub_string)], начиная с позиции
i


Функция для нахождения средне арифметического в списке списков [закрыт]

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

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

Закрыт 1 год назад.

Это сообщение было исправлено и отправлено на проверку 1 год назад, но повторное открытие сообщения провалилось:

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

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

Дан cписок списков:

complaint_stat = [
              [27, 22, 15, 8, 3, 16, 15],
              [12, 4, 10, 13, 29, 22, 121],
              [5, 7, 6, 13, 2, 1, 25],
              [15, 6, 14, 19, 25, 7, 3]]

Нужно найти среднее арифметическое для каждого под_списка:

def get_average_number(week_stat):

#мой код
 return sum(week_stat) // len(week_stat)

Далее посчитать сколько раз средне арифметическое было больше в каждом под_списке соответсветнно:

def outlier_days_count(week_stat, week_avg):

#мой код
 outlier = 0
 for i in week_stat:
     if i > week_avg:
         outlier += 1
 return outlier

Получение сводной информации:

def get_complaint_info(complaint_stat):

#мой код
     over_avg = outlier_days_count(complaint_stat,get_average_number(complaint_stat))
for i in complaint_stat:
 print(i, 'среднее =', get_average_number(i) , ' больше среднего : ', over_avg)

# На выходе должны получить
[27, 22, 15, 8, 3, 16, 15]: среднее = 15,  больших среднего: 3
[12, 4, 10, 13, 29, 22, 121]: среднее = 30, больших среднего: 1
[5, 7, 6, 13, 2, 1, 25]: среднее = 8, больших среднего: 2
[15, 6, 14, 19, 25, 7, 3]: среднее = 12,  больших среднего: 4

Это задание из практики, надеюсь передал понятно. Спасибо

где добавляете результат в массив забыли отступ - в итоге он выполняется вне цикла, т.е. 1 раз

def func(data):
    res = []
    for obj in data:
        value = sum(obj) / len(obj)
        res.append(value) # вот тут был забыт отступ
    return res

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

def func(data):
    return [sum(obj) / len(obj) for obj in data]

но по хорошему надо бы еще обработать ситуацию, когда список значений пустой

def func(data):
    return [(sum(obj) / len(obj)) if len(obj) > 0 else 0 for obj in data]


Целочисленное деление возвращает тип float
В коде, в выделенной процедуре(24 строки), нужно полученную дату в формате unixtime преобразовать в целое число - определённый час по расписанию.

def post(date):  # date = 1637855378
    ...
    post_date = (date % hours(24)) // hours() # hours(t)=t*3600
    ...
    print(f'{post_date + 3}:00, {type(post_date)}')

Иногда возвращает тип float, но в основном int

>>> 15.0:00, <class 'float'>

Троеточие - то, что не влияет на результат.
Я конечно понимаю, что это можно исправить через
int(post_date), но хочу разобраться в ошибке.
Код работает онлайн на Heroku(возможно у них там какие-то проблемы, но я очень сомневаюсь) такая "ошибка" начала выходить пару дней назад(23 ноября, но могло и раньше).

Оператор
// при работе с целыми числами int возвращает int, а при работе с float возвращает float


Как выбрать путь для сохранения?
Как в этом коде выбрать путь для сохранения, например папку
Downloads?

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog
import os

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 221)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(0, 0, 801, 601))
        self.frame.setStyleSheet("background-color: rgb(27, 29, 35);")
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.label = QtWidgets.QLabel(self.frame)
        self.label.setGeometry(QtCore.QRect(320, 20, 151, 41))
        self.label.setMinimumSize(QtCore.QSize(151, 41))
        self.label.setMaximumSize(QtCore.QSize(151, 41))
        font = QtGui.QFont()
        font.setFamily("Montserrat SemiBold")
        font.setPointSize(24)
        self.label.setFont(font)
        self.label.setStyleSheet("color: rgb(255, 255, 255);")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.input = QtWidgets.QLineEdit(self.frame)
        self.input.setGeometry(QtCore.QRect(40, 80, 721, 61))
        font = QtGui.QFont()
        font.setFamily("Montserrat SemiBold")
        font.setPointSize(16)
        self.input.setFont(font)
        self.input.setStyleSheet("background-color: rgb(37, 39, 48);\n"
"color: #ffffff;\n"
"border-radius: 10px;")
        self.input.setText("")
        self.input.setAlignment(QtCore.Qt.AlignCenter)
        self.input.setObjectName("input")
        self.start = QtWidgets.QPushButton(self.frame)
        self.start.setGeometry(QtCore.QRect(250, 160, 131, 31))
        font = QtGui.QFont()
        font.setFamily("Montserrat SemiBold")
        font.setPointSize(13)
        self.start.setFont(font)
        self.start.setStyleSheet("background-color: rgb(37, 39, 48);\n"
"color: #ffffff;\n"
"border-radius: 10px;")
        self.start.setObjectName("start")
        self.folder = QtWidgets.QPushButton(self.frame)
        self.folder.setGeometry(QtCore.QRect(410, 160, 151, 31))
        font = QtGui.QFont()
        font.setFamily("Montserrat SemiBold")
        font.setPointSize(13)
        self.folder.setFont(font)
        self.folder.setStyleSheet("background-color: rgb(37, 39, 48);\n"
"color: #ffffff;\n"
"border-radius: 10px;")
        self.folder.setObjectName("folder")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        self.add_functions()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Ссылка"))
        self.start.setText(_translate("MainWindow", "Старт"))
        self.folder.setText(_translate("MainWindow", "Выбрать папку"))

    def add_functions(self):
        self.start.clicked.connect(lambda: self.start())
        self.folder.clicked.connect(lambda: self.open())

    def open(self):
        QFileDialog.getExistingDirectory(self, "Выберите путь", f"C:\\Users\\{os.getlogin()}")

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Выдаёт ошибку:

TypeError: getExistingDirectory(parent: QWidget = None, caption: str = '', directory: str = '', options: Union[QFileDialog.Options, QFileDialog.Option] = QFileDialog.ShowDirsOnly): argument 1 has unexpected type 'Ui_MainWindow'

Не изменяйте код, сгенерированный Qt Designer. Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.
<code>
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog
import sys
import os

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 221)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(0, 0, 801, 601))
        self.frame.setStyleSheet("background-color: rgb(27, 29, 35);")
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.label = QtWidgets.QLabel(self.frame)
        self.label.setGeometry(QtCore.QRect(320, 20, 151, 41))
        self.label.setMinimumSize(QtCore.QSize(151, 41))
        self.label.setMaximumSize(QtCore.QSize(151, 41))
        font = QtGui.QFont()
        font.setFamily("Montserrat SemiBold")
        font.setPointSize(24)
        self.label.setFont(font)
        self.label.setStyleSheet("color: rgb(255, 255, 255);")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.input = QtWidgets.QLineEdit(self.frame)
        self.input.setGeometry(QtCore.QRect(40, 80, 721, 61))
        font = QtGui.QFont()
        font.setFamily("Montserrat SemiBold")
        font.setPointSize(16)
        self.input.setFont(font)
        self.input.setStyleSheet("background-color: rgb(37, 39, 48);\n"
"color: #ffffff;\n"
"border-radius: 10px;")
        self.input.setText("")
        self.input.setAlignment(QtCore.Qt.AlignCenter)
        self.input.setObjectName("input")
        self.start = QtWidgets.QPushButton(self.frame)
        self.start.setGeometry(QtCore.QRect(250, 160, 131, 31))
        font = QtGui.QFont()
        font.setFamily("Montserrat SemiBold")
        font.setPointSize(13)
        self.start.setFont(font)
        self.start.setStyleSheet("background-color: rgb(37, 39, 48);\n"
"color: #ffffff;\n"
"border-radius: 10px;")
        self.start.setObjectName("start")
        self.folder = QtWidgets.QPushButton(self.frame)
        self.folder.setGeometry(QtCore.QRect(410, 160, 151, 31))
        font = QtGui.QFont()
        font.setFamily("Montserrat SemiBold")
        font.setPointSize(13)
        self.folder.setFont(font)
        self.folder.setStyleSheet("background-color: rgb(37, 39, 48);\n"
"color: #ffffff;\n"
"border-radius: 10px;")
        self.folder.setObjectName("folder")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Ссылка"))
        self.start.setText(_translate("MainWindow", "Старт"))
        self.folder.setText(_translate("MainWindow", "Выбрать папку"))

#### новый класc###
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.add_functions()

    def add_functions(self):
        self.start.clicked.connect(lambda: self.start())### ваша логика
        self.folder.clicked.connect(lambda: self.open())

    def open(self):
        QFileDialog.getExistingDirectory(self, "Выберите путь", "C:\\Users\\{os.getlogin()}")

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    #   uw = Ui_MainWindow()                                      # ---                           # +++
    w.show()
    sys.exit(app.exec())
</code>


UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 334: character maps to <undefined> Python
При чтении ".jpg" файла возникла следующая ошибка:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 334: character maps to <undefined>
Функция, где производится чтение:

def readFile(self, data_path):
        if self.mode == 'encode':
            input_file = open(data_path, 'r')
            data = input_file.read()
        else:
            pass

        input_file.close()

        return data

.jpg файл нужно читать в двоичном режиме:

with open(data_path, 'rb') as input_file:
                     ^^^^ двоичный режим
    data = input_file.read()

А в целом у вас непонятно, что будет при другом
mode, код совсем тогда сломается.


Как напечатать числа от 1 до 100? Python [закрыт]

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

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

Закрыт 1 год назад.

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

Иногда люди задают такой вопрос:

А как мне вывести все числа от 1 до 100 через пробел с помощью цикла
for и
print?

Как его осуществить в реальность? Спасибо заранее

Решение в лоб без генераторов:

i = 1
while i < 102:
    print(i, end=' ')
    i += 1

Но стандартные примеры не очень интересны, попробуем жесть и экзотику.
Так:

[print(i[0], end=' ') for i in enumerate(' ' * 100, 1)]

или:

[print(i, end=' ') for i, j in enumerate(' ' * 100, 1)]

или:

print(*[i for i, j in enumerate(' ' * 100, 1)])


Как вывести в одну строку?
Хотел решить задачу, вышло правильно, но не так как надо. Задача:

Выведите все числа на отрезке от a до b, дающие остаток c при делении на d. Если таких чисел не существует, то ничего выводить не нужно. Input: 2 5 0 2. В Output: 2 4.

В общем, вот мой код:
<code>
a = int(input())
b = int(input())
c = int(input())
d = int(input())
sum = 0
for i in range(a,b+1):
   if i%d == c:
       print(i)
</code>
В выводе у меня вышло 2 и на другой строке 4, а должно быть чтобы 2 и 4 были в одной строке и с пробелом.
Как это сделать?

Укажите print'у в качестве конца строки пробел (вместо перевода строки).
<code>
for i in range(a,b+1):
   if i%d == c:
       print(i, end=" ")
print()
</code>


Как заполнить пустые значение DataFrame по примеру?
Всем привет!
Есть следующий DataFrame:

Название
ID
Дата

Точка А
1
01.11

Точка А

02.11

Точка А
2
02.11

Точка B

02.11

Точка B
3
01.11

Точка B
4
02.11

Нужно заполнить пропуски в столбце ID, но ID должен быть взят именно по последней дате у каждой точки, т.е. если смотреть на пример, то у точки А должен быть ID 2, а у точки B - 4. Вопрос, как можно это сделать с помощью pandas?

Попробуйте так:

df["ID"] = df["ID"].fillna(df.groupby("Название")["ID"].transform("last"))

результат:

In [273]: df
Out[273]:
  Название   ID  Дата
0  Точка А  1.0  1.11
1  Точка А  2.0  2.11
2  Точка А  2.0  2.11
3  Точка B  4.0  2.11
4  Точка B  3.0  1.11
5  Точка B  4.0  2.11


Почему rgb triplet не конвертируется в название?
Я пытаюсь:
<code>
mycolor = "240,240,240"
mycolor = webcolors.rgb_to_name((mycolor))
</code>
Но ничего не выходит.
В чем может заключаться причина?

функция
webcolors.rgb_to_name() ожидает на вход кортеж с тремя целыми значениями, а вы подаете ей на вход строку.
Попробуйте так:

mycolor = (240,240,240)
mycolor = webcolors.rgb_to_name(mycolor)

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

from ast import literal_eval

mycolor = "240,240,240"

if isinstance(mycolor, str):
    mycolor = literal_eval(mycolor)

mycolor = webcolors.rgb_to_name(mycolor)


Как остановить функцию через 5 секунд?

def get_data():

def countdown():
  time.sleep(5)
  print('bed')
  continue

def main():
    check = Timer(30.0, countdown)
    pars = Thread(target=get_data)
    check.start()
    pars.start()
    check.cansle()

for accaunt in bd:
   name = accaunt.split(':')[0]
   pas = accaunt.split(':')[1]
   user = wa(name)
   main()

Каким образом это можно воплотить, задача:
get_data может зависнуть, но если сработает, то успеет исполниться быстрее 5 секунд. По моей логике
countdown запускается раньше
get_data и спит 5 секунд. Если
get_data сработала,
countdown отменится, а если зависнет,
countdown должна вызвать
continue для цикла и вынудить его перейти к проверке следующего элемента. На сколько это реально, и как вызвать этот
continue?

Можно попробовать вот так:

import multiprocessing
import time

def get_data(x, n):
    for i in range(1, n+1):
        print(f"{x}: Get Data {i} of {n}")
        time.sleep(1)

def main(x, n):
    p = multiprocessing.Process(target=get_data, args=(x,n))
    p.start()
    p.join(5) # ждём не более 5 секунд
    if p.is_alive():  # если поток всё ещё выполняется
        print(f"[{x}: {n}]  Timeout!!! Kill 'em all :-E")
        p.terminate()
        p.join()

for account,n in [("my", 10), ("your", 3), ("their", 1)]:
   main(account, n)

my: Get Data 1 of 10
my: Get Data 2 of 10
my: Get Data 3 of 10
my: Get Data 4 of 10
my: Get Data 5 of 10
[my: 10]  Timeout!!! Kill 'em all :-E
your: Get Data 1 of 3
your: Get Data 2 of 3
your: Get Data 3 of 3
their: Get Data 1 of 1


Как находить в базе данных определенный продукт?
Ребят, такой вопрос, у меня есть таблица в базе данных, называется product в ней есть:
<code>
name = 'Название продукта'
calories = 'количество калорий в продукте'
protein = 'Количество белка в продукте'
fats = 'количество жира в продукте'
carbohydrates = 'количество углеводов в продукте'
</code>
Например:
Имя = Рис, калорий = 300, белка = 10, жира = 2, углеводов = 70
Имя = Гречка, калорий = 320, белка = 16, жира = 1, углеводов = 65
Пользователь вводит Рис и хочет получить значение калорий, белка, жира и углеводов в Рисе, в базе он находится под именем Рис, а вдруг пользователь введет Риса, Руса или еще как то ошибется, то в базе ничего не найдется.
Подскажите как можно примерно реализовать, чтобы в базе отыскивалось максимально похожие имя. Я знаю про нечеткое сравнение строк, но как это с базой связать не знаю, может в sqlite есть запрос какой то специальный, но я ничего не нашел

Можно использовать FTS5 расширение для SQLite
Из минусов - функция trigram индекса в нём экспериментальная.
Я бы на Вашем месте присмотрелся к PostgreSQL.


Снятие роли по команде
У меня уже есть команда, которая выдает участникам сервера определенную роль.
Как теперь по еще одной команде снять со всех членов сервера эту роль?

Используйте метод
remove_roles
Затем итерируйте список участников

@commands.command()
async def remove_role(self, ctx, role: discord.Role):
    for member in ctx.guild.members:
        if role in member.roles:
            await member.remove_roles(role)

@bot.command()
async def remove_role(ctx, role: discord.Role):
    for member in ctx.guild.members:
        if role in member.roles:
            await member.remove_roles(role)

# без указания роли
@bot.command()
async def remove_role(ctx):
    role = discord.utils.get(ctx.guild.roles, id='айди роли')
    for member in ctx.guild.members:
        if role in member.roles:
            await member.remove_roles(role)


Запись/удаление и редактирование списка в текстовом файле
Столкнулся с проблемой при выполнении домашнего задания по Python.
Суть программы - создание текстового файла с данными пользователей и их паролями. А в самой программе дальнейшее редактирование и изменение данных (удаление, создание нового пользователя).
Но у меня не выходит записать и удалять строки из списка. Запутался сильно и трудно понять как решить проблему, прошу помочь и обьяснить что я делаю не так.
Вот код моей программы.
<code>
parol=""
passw=["90232","Soroka5","346129S"]
names=["Sasha","Nikita","Nikolai"]

my_file = open("data.txt", "w+")

def registration(passw,names):
    newparol=""
    while newparol !="R" :
        newparol=input("Введите новое имя: ")
        if newparol in names:
            print("Такое имя уже есть, предложите другое. \n : ")
            continue
        names.append(newparol)
        newlogin= input("Введите пароль: ")
        passw.append(newlogin)
        #control.update(newparol)
        print(passw)
        print(names)
        f = open('data.txt', 'wt')
        for s in passw:
            f.write(s + '\n')
        for s in names:
            f.write(s + '\n')
        return passw,names

def udal(passw,names):
    print("\nСписок пользователей: \n")
    print("Пароль: ", passw)
    print("Логин: ", names)
    newname=""
    while newname !="X" :
        newname=input(" Введите логин для удаления. (Или X что бы вернутся в меню.)\n : ")
    if newname in names :
        numb=names.index(newname)
        f = open('data.txt', 'w')

        print("Удаленно!")
        names.remove(newname)
        passw.pop(numb)
        print(passw)
        print(names)
    else:
        print("Такого имени нет. ")
    return passw,names

while parol!="X":
    parol= input(" Добро пожаловать. \n Введите X для завершения работы.\n Или введите R для создания нового пользователя. \n Введите D - что бы удалить существующего пользователя. \n Или введите свой пароль что бы войти. \n :  ")
    if parol=="R" :
       registration(passw,names)
       continue
    elif parol=="D":
        udal(passw,names)
        continue
    elif parol=="X":
        break
    elif parol in passw:
        numb=control.index(parol)
        person=names[numb]
        print("\nПоздравляю! ", person, " - Вы в системе.")

    else:
        print("Ошибка в пароле. Похоже такого не существует.")

input("\n Досвидания!")

</code>

def load_data():
    try:
        with open("data.txt") as f:
            users = {}
            # читаем из файла построчно
            for line in f:
                # в каждой строке записаны имя и пароль через символ табуляции
                name, passw = line.strip("\n").split("\t")
                users[name] = passw
    except FileNotFoundError:
        # в случае отсутствия файла инициализируем словарь начальными данными
        users = {"Sasha"   : "90232",
                 "Nikita"  : "Soroka5",
                 "Nikolai" : "346129S"
                }
    return users

def save_data():
    with open("data.txt", "w") as f:
        for name in users:
            # сохраняем пользователей построчно как имя и пароль через символ табуляции
            f.write(name + "\t" + users[name] + '\n')

def registration(users):
    while True:
        name = input("Введите новое имя (или X чтобы вернуться): ")
        if name == "X":
            return
        if name not in users:
            passw = input("Введите пароль: ")
            users[name] = passw
            break
        print("Такое имя уже есть, предложите другое.\n")
    save_data()

def udal(users):
    print("\nСписок пользователей: \n")
    print(", ".join(users))
    while True :
        name = input(" Введите логин для удаления. (Или X что бы вернутся в меню.): ")
        if name == "X":
            return
        if name in users:
            del users[name]
            print("Удаленно!")
            break
        print("Такого имени нет. ")
    save_data()

# начальная загрузка
users = load_data()

while True:
    menu = input(" Добро пожаловать. \n Введите X для завершения работы.\n Или введите R для создания нового пользователя. \n Введите D - что бы удалить существующего пользователя. \n Или введите свой пароль что бы войти. \n :  ")
    if menu == "R":
        registration(users)
    elif menu == "D":
        udal(users)
    elif menu == "X":
        break
    elif menu in users.values():
        # берём индекс пароля среди значений словаря
        numb = list(users.values()).index(menu)
        # берём соответствующее этому индексу имя среди ключей словаря
        name = list(users.keys())[numb]
        print("\nПоздравляю! ", name, " - Вы в системе.")
    else:
        print("Ошибка в пароле. Похоже такого не существует.")

input("\n Досвидания!")


Python for * in * цикл
В переменной
ItemsID есть много разных ID, например таких:

23998415327
23998414914
23998412075
23998404571
23998402338

Также есть команда в центр, которой нужно подставить эти ID (я пометил куда). Приблизительно это должно выглядеть следующим образом:

sessionid=e8537cfd897ac9151a47fec9&appid=730&contextid=2&assetid=СЮДА НУЖНО ПОДСТАВИТЬ ID &amount=1&price=90

Задача должна по кругу крутиться N раз и постоянно менять ID на следующее. Как мне это сделать? Я понимаю что нужно использовать цикл
for * in *, но никак не могу собрать всё как нужно. Помогите мне, пожалуйста, буду очень благодарен.

Простой способ и самый оптимальный

n=число повторов
for _ in range(n): #Запускаем цикл повторов
  for id in ItemsId.splitlines(): #запускаем цикл прохода по элементам
     new_variable='aaaabbbbXXXccc'.replace('XXX',id) #заменяем ХХХ на текущий элемент

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

a=[1,2] исходный список
for it in a*3: #увеличиваем исходный список в три раза
   #replace

upd: здесь идёт переназначение системной функции id, что не критично, но всё же не желательно


Как вывести объект в списке в строчном виде?
Есть код:
<code>
class Object:
def __init__(self, name, value):
    self.name = name
    self.value = value

def __str__(self):
    return str(self.name) + ": " + str(self.value)

# Список - массив ссылок на объекты
test_list = [Object("Name", 32), 3405, "hello"]
print(test_list)  # Выводит - [<__main__.Object object at 0x00000139E226FFD0>, 3405, 'hello']
test_list = list(map(str, test_list))
print(test_list) # Выводит - ['Name: 32', '3405', 'hello']
</code>
Вопрос:

Почему объект не приводится к строке, хотя реализован метод str? Отдельно, не в списке, объект успешно приводится к строке ('Name: 32')

Потому что при выводе на печать контейнера (спасибо GrAnd за уточнение) используется другой метод, который нужно реализовать в классе:
<code>
    def __repr__(self):
        return str(self)
</code>
Про сортировку у вас вопрос не дописан, но там тоже нужно реализовать некоторые методы класса. См. документацию, в современном питоне достаточно реализовать всего пару методов - один сравнения и один равенства и задекорировать класс специальным декоратором, остальное питон сделает сам.


Почему при многопоточности print иногда работает неправильно Python?
С помощью ThreadPoolExecutor я в нескольких потоках ищу свободные порты, сканируя UPD, и вывожу их на консоль, как найду. Но при выводе почему-то некоторые появляются в одной строке. Как это можно исправить?
Пример:

UPD 993
UPD 992
UPD 994UPD  995

UPD 996
UPD 997
UPD 998UPD  999

Может как-то блокировать print?

threading.Lock() и
multiprocessing.Lock() не помогают.

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


Проблема с выводом. Печатает один город/ Python
<code>
friends = {
    'Серёга': 'Омск',
    'Соня': 'Москва',
    'Дима': 'Челябинск',
    'Алина': 'Хабаровск',
    'Егор': 'Пермь'
}

def is_anyone_in(collection, city):
    for friend in collection:
        if collection[friend] == city:
            print('В городе ' + city + ' живёт ' +friend+ '. Едем в гости!')
        else:
            print('В городе ' + city + ' у меня есть друг, но мне туда не надо')

is_anyone_in(friends, 'Хабаровск')
</code>

Замените
print('В городе ' + city + ' у меня есть друг, но мне туда не надо') на
print('В городе ' + collection[friend] + ' у меня есть друг, но мне туда не надо'). Проблема решена, если я Вас правильно понял ;). Вот полный, уже обновлённый код:

friends = {
    'Серёга': 'Омск',
    'Соня': 'Москва',
    'Дима': 'Челябинск',
    'Алина': 'Хабаровск',
    'Егор': 'Пермь'
}

def is_anyone_in(collection, city):
    for friend in collection:
        if collection[friend] == city: print('В городе ' + city + ' живёт ' +friend+ '. Едем в гости!')
        else: print('В городе ' + collection[friend] + ' у меня есть друг, но мне туда не надо')

is_anyone_in(friends, 'Хабаровск')


Как использовать метод .lower вместе с .startswith?
Как использовать метод
'str'.lower вместе с методом
'str'.startswith?

Строки в Python неизменяемые (immutable), поэтому все функции/методы которые как-либо изменяют строковые переменные возвращают новый измененный объект типа
str, к которому соответственно можно применить следующий метод:

s = "AbA"

if s.lower().startswith("ab"):
    ...

Такие конструкции могут быть достаточно длинными:

print(" BLAH - BLAH ".strip().lower().capitalize().replace(" ", ""))
# Blah-blah


Как использовать методы в генераторах списков?
Например:

a = [{1:'1'},{2:'2'},{3:'3'}]
for i in a:
    i.setdefault('add', 5)

Как записать это генератором?
Что-то типа такого нужно:

a = [{1:'1'},{2:'2'},{3:'3'}]
b = [i.setdefault('add', 5) for i in a]
# Результат нужен такой как выше, не три 5 в списке
# Заодно подвопрос, откуда там три 5 берется если я вроде вставляю словарь?

В общем как методы в них использовать и можно ли вообще?

не совсем понял вопрос
вам нужен вот такой вариант?
<code>
a = [{1:'1'}, {2:'2'}, {3:'3'}]
b = [i | {'add': 5} for i in a]
</code>
вывод будет аналогичен тому, что вы привели в самом начале поста


Не работает многопоточность ThreadPoolExecutor Python

def method(args, num):
    ...

# Массив чисел от 50 до 100
nums = [x for x in range(50, 100)]
# Создаю массивы с агрументами и каждым числом
map_args = [(args, a) for a in nums]
with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as exe:
    exe.map(method, map_args)

Почему-то не работает, сразу же завершается работа с кодом 0. Не могу понять почему?
Может как-то иначе аргументы в метод передавать?
exe.map(method, map_args)

Вам нужно ещё проитерироваться по результатам маппинга:
<code>
result = exe.map(method, map_args)
for res in result:
   print(res)
</code>
С передачей аргументов у вас, кажется, тоже проблемы, но главное то, что вы не потребляете результаты вызова.


функция не выводит числа в excel файл
есть формула (K=A*(1-exp(-LT))^n). при запуске функции она должна выводить(записывать) в excel -файл значения K, A, L, n, T, но при запуске она просто зависает. (по сути это обычная подборка чисел для решения уравнения)
<code>
def Calc():
    global path
    workbook = openpyxl.load_workbook(path)
    print(workbook.get_sheet_names())
    sheet = workbook.active
    for A in range (1, 6):
       for L in range (1, 6):
           for n in range (1, 6):
               for T in np.arange (0.01, 1.00, 0.01):
                   K=A*pow((1-math.exp(-L*T)), n)
                   for i in range (0, 3):
                       c1 = sheet.cell(row = i+10, column = 1)
                       c1.value=K
                       c2 = sheet.cell(row = i+10, column = 2)
                       c2.value=A
                       c3 = sheet.cell(row = i+10, column = 3)
                       c3.value=L
                       c4 = sheet.cell(row = i+10, column = 4)
                       c4.value=n
                       c5 = sheet.cell(row = i+10, column = 5)
                       c5.value=T
                   workbook.save(path)
</code>

    for A in range (1, 6):
       for L in range (1, 6):
           for n in range (1, 6):
               for T in np.arange (0.01, 1.00, 0.01):
                   K=A*pow((1-math.exp(-L*T)), n)
                   for i in range (0, 3):
                      ...
                   workbook.save(path)

У вас запись файла находится внутри четырёх вложенных циклов, если посчитать, вы перезаписываете файл
100 * 5**3 =
12500 раз, поэтому так тормозит. Записывайте файл один раз в самом конце:

    for A in range (1, 6):
       for L in range (1, 6):
           for n in range (1, 6):
               for T in np.arange (0.01, 1.00, 0.01):
                   K=A*pow((1-math.exp(-L*T)), n)
                   for i in range (0, 3):
                      ...
    workbook.save(path) # <- запись после выполнения всех циклов


Замена времени с помощью регулярный выражений в Python
Мне нужно заменить все вхождения времени на строку (TBD).
Время – это строка вида HH:MM:SS или HH:MM, в которой HH – число от 00 до 23,
а MM и SS – число от 00 до 59.
Я делаю это следующим образом:
<code>
textTests = ['В эту субботу в 15:00:23 состоится. В 27:68:01 она уже точно кончится.',
             'Я буду дома примерно в 17:10.',
             'Рейс перенесли с 16:30 на 18:00.',
             'Мой часы показывают, что сейчас 14:30:10.',
             'Встреча состоится 03.10 ровно в 13:00.',
             'Я уйду через часа 2, у меня поезд в 19:20.',
             '23:45:54 - работает',
             '14:47:70 - не работает']

timeCheck = r'([01]\d|2[0-3]):[0-5]\d(:[0-5]\d)?'
i = 0
for test2 in textTests:
    i += 1
    textFinal = re.sub(timeCheck, '(TBD)', test2)
    print(f'Исходный текст {i}: {test2} \nИзмененный текст {i}: {textFinal} \n')
</code>

Результат работы следующий:
Исходный текст 1: В эту субботу в 15:00:23 состоится. В 27:68:01 она уже точно кончится.
Измененный текст 1: В эту субботу в (TBD) состоится. В 27:68:01 она уже точно кончится.
Исходный текст 2: Я буду дома примерно в 17:10.
Измененный текст 2: Я буду дома примерно в (TBD).
Исходный текст 3: Рейс перенесли с 16:30 на 18:00.
Измененный текст 3: Рейс перенесли с (TBD) на (TBD).
Исходный текст 4: Мой часы показывают, что сейчас 14:30:10.
Измененный текст 4: Мой часы показывают, что сейчас (TBD).
Исходный текст 5: Встреча состоится 03.10 ровно в 13:00.
Измененный текст 5: Встреча состоится 03.10 ровно в (TBD).
Исходный текст 6: Я уйду через часа 2, у меня поезд в 19:20.
Измененный текст 6: Я уйду через часа 2, у меня поезд в (TBD).
Исходный текст 7: 23:45:54 - работает
Измененный текст 7: (TBD) - работает
Исходный текст 8: 14:47:70 - не работает
Измененный текст 8: (TBD):70 - не работает
Как видите, во всех примерах, кроме последнего, время заменилось правильно. То есть, замена работает корректно во всех случаях, кроме тех, когда часы/минуты заданы "правильно", а секунды нет. Как изменить регулярное выражение, чтобы замена работала корректно и в последнем примере?

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

([01]\d|2[0-3]):[0-5]\d(:[0-5]\d)?

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

Секунды и минуты имеют одинаковые значения, описывать их дважды нет необходимости:

(:[0-5]\d){1,2}

указываем что
: и диапазон от 00 до 59 может встретиться один или 2 раза

Ограничить выбор часа 23:01:01 из строки 123:01:01, для этого понадобится негативные просмотр назад

(?<![:\d])

В котором проверяем что нет символа
: или цифры от 0 до 9 перед началом захвата по выражению.

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

(?![:\d])

Так же ограничиваем попадание под захват текста указанного в примере и еще нескольких случаях, к примеру 23:45:56:12
В таком виде получаем наше регулярное выражение:

(?<![:\d])([01]\d|2[0-3])(:[0-5]\d){1,2}(?![:\d])

Пример работы: regex101.com


Как написать программу на Python, чтобы после каждой 2й кавычки ставилась точка с запятой
вход будет такой(с переходом на след строку) считывать с файла .txt

ratio "2"
speed "53"
bonk "12"

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

ratio "2"; speed "53"; bonk "12";

На экран:

with open("file.txt") as f:
    for line in f:
         print(f"{line.strip()}; ", end="")
print()

В строку:

with open("file.txt") as f:
    s = f.read().replace("\n", "; ")

или

with open("file.txt") as f:
    s = "; ".join(map(lambda x: x.strip(), f.readlines()))


Создать словарь с помощью enumerate
Можно ли создать список словарей с помощью enumerate такого вида:

[{"id": 0, "animal": 'snail'}, {"id": 1, "animal": 'fish'}, {"id": 2, "animal": 'cow'}

Знаю, что можно сделать так:

animals = ['snail', 'fish', 'cow']
a = {animal: it for it, animal in enumerate(animals)}
b = {v: k for k, v in a.items()}

Но с помощью такого кода получается словарь:

{0: 'snail', 1: 'fish', 2: 'cow'}

animals = ['snail', 'fish', 'cow']
result = [{"id": n, "animal": animal} for n, animal in enumerate(animals)]
# [{'id': 0, 'animal': 'snail'}, {'id': 1, 'animal': 'fish'}, {'id': 2, 'animal': 'cow'}]


Как проверить пустая ли база данных?
Ребят подскажите, у меня есть база данных 'data_per.db', в ней есть 3 таблицы users, product, recipe, как можно проверить пустая база данных или нет, имею ввиду созданы ли эти таблицы?
Я использую sqlite
Знаю что вот так возвращается количество в таблице users:
<code>
"SELECT COUNT(*) FROM users;"
</code>
А как именно проверить таблицы в самом файле базы?

Вот так.
<code>
import sqlite3

with sqlite3.connect('data_per.db') as con:

    tables = ["'users'","'product'", "'recipe'"]
    table_names = ','.join(tables)

    SQL = f"SELECT count(*) FROM sqlite_master WHERE type='table' AND name in ({table_names});"
    num = con.execute(SQL).fetchone()[0]
    if num != len(tables):
        print('Не все таблицы есть')
    else:
        print('Все таблицы есть')
</code>


Второй одинковый объект в списке не отражается
Столкнулся с проблемой,что при нахождении определённых символов в array, программа просто игнорирует такой же второй элемент, и в output показывает то,что было в input.
К пример вот мой код:
<code>
list = str(input()).split()

dict = {"X-(": "Angry",
        "</3": "Broken Heart",
        ":_(": "Crying",
        ":*)": "Drunk",
        "|-O": "Yawn",
        ";)": "Winking",
        ":-)*": "Kiss",
        ";-)": "Winking",
        ":S": "Sarcastic",
        ":-(": "Sad",
        "XD": "Laughing",
        ":)": "Happy",
        ":-)": "Happy",
        ":-*":"Kiss",
        ":-P": "Frustrated"}

for key,value in dict.items():
    if key in list:
        b = list.index(key)
        list[b] = value
    else:
        pass
print(' '.join(list))

</code>
В этом коде пользователь вводит текст в виде смайликов, и программа выдёт ему перевеённые в текст смайлики.
Если ввести такой текст:
I like you so much How its going :-P :-P
То он выведет:
I like you so much How its going Frustrated :-P
В этом и является проблема,что при виде второго же такого символа в input он его игнорирует и оставляет таким же.

Замените

if key in list:

на

while key in list:

И да, не называйте переменные
list,
dict и т.п. (именами встроенных типов/функций) Сами же рано или поздно на свои же грабли наступите.