Ошибка при вызове абстрактного класса?
Возникает ошибка при использовании абстрактного метода, моя задача состояла в том, чтобы сделать абстрактный метод, который дальше будет переопределен, но возникает ошибка: 'Flat' object has no attribute 'every_month'
Пожалуйста, прошу исправьте мой код, чтобы при вызове абстрактного метода в дальнейшем выводило число по задумке
<code>
from abc import ABC, abstractmethod

class City:
    def __init__(self):
        self.name_city = ' '

    def get_name(self):
        return self.name_city

    def set_name(self, name_city):
        self.name = name_city

class Building:
    def __init__(self):
        self.name_street = ' '
        self.house_number = 0
        self.square = 0
        self.payment = 0

    def get_name_street(self):
        return self.name_city

    def get_house_number(self):
        return self.house_number

    def get_square(self):
        return self.square

    def get_payment(self):
        return self.payment

    def set_name_street(self, name_city):
        self.name_city = name_city

    def set_house_number(self, house_number):
        self.house_number = house_number

    def set_payment(self,payment):
        self.payment = payment

class Room(ABC,Building):
    def __init__(self):
        super().__init__()
        self.number=0
        self.square=0
    def get_number(self):
        return self.number
    def get_square(self):
        return self.square
    def set_number(self,number):
        self.number=number
    def set_square(self,square):
        self.set_square=square
    @abstractmethod
    def every_month_payment(self):
        self.every_month=self.payment*self.square
class Flat(Room):
    def add_people(self,name_people):
        self.name_people=name_people
        self.all_people=[]
        self.all_people.append(self.name_people)
    def get_people(self):
        return self.all_people
    def every_month_payment(self):
        return self.every_month * (1 + len(self.all_people) * 0.1)
class Office(Room):
    def set_name_firm(self,name):
        self.name_firm=name
    def get_name_firm(self):
        return self.name_firm
    def set_type(self,type):
        self.type=type
    def get_type(self):
        return self.type
    def every_month_payment(self):
        return super().every_month * 2
names1=Flat()
names1.set_payment(5)
names1.set_square(6)
names1.add_people('IVANOV')
names1.every_month_payment()```
</code>

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

class A:
  def __init__(self):
    self._test=0
  def set_test(self, test):
    self._test = test
  def get_test(self):
    return self._test
  test = property(get_test, set_test)  # добавление свойства

a = A()
print(a.test) # нет необходимости писать a.get_test()
a.test = 5    # нет необходимости писать a.set_test(5)
print(a.test)

В ответе на вопрос я убрал все что не касалось самой сути вопроса чтобы легче было заметить внесенные изменения.
Так же подправил расчет платы, исходя из того, что полагаю чистая плата взимается за одного и +10 % за дополнительного жильца (Вы можете использовать свою формулу, но она считает +10% и для первого жильца, т.е. один жилец будет платить 110% чистой платы):

class Building:
    def __init__(self):
        self._square = 0
        self._payment = 0

    def get_square(self):
        return self._square

    def set_square(self, square):
        # тут может быть проверка
        self._square = square

    def get_payment(self):
        return self._payment

    def set_payment(self, payment):
        # тут может быть проверка
        self._payment = payment

    square = property(get_square, set_square)
    payment = property(get_payment, set_payment)

class Room(Building):
    def __init__(self):
        super().__init__()

    def every_month_payment(self):
        # тут используется доступ уже через геттеры
        return self.payment * self.square

class Flat(Room):
    def __init__(self):
        super().__init__()
        self.all_people=[]

    def add_people(self,name_people):
        self.all_people.append(name_people)

    def get_people(self):
        return self.all_people

    def every_month_payment(self):
        neighbors = len(self.get_people()) - 1
        return super().every_month_payment() * (
          1 + ((neighbors) * 0.1 if neighbors > 0 else 0)
        )

names1=Flat()
names1.set_payment(5)
names1.set_square(6)
print(names1.every_month_payment()) # 30
names1.add_people('IVANOV')
print(names1.every_month_payment()) # 30
names1.add_people('PETROV')
print(names1.every_month_payment()) # 33.0
print(names1.get_people())

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

Абстра́ктный ме́тод — в объектно-ориентированном программировании,
метод класса, реализация для которого отсутствует


Как умножить подсписок на число?
Есть список a = [[1, 2, 3], [4, 8, 6]], хочу умножить подсписок [1, 2, 3] на какое либо число, а затем снова распечатать массив а, но с изменением. Пытался как-то решить задачу, получилось это:
<code>
a = [[1, 2, 3], [4, 8, 6]]
b = []
c = []
for i in a[0]:
    i = i * 2
    b.append(i)
c.append(b)
c.append(a[1])
print(c)
</code>

Возможно такой вариант подойдет
<code>
a = [[1, 2, 3], [4, 8, 6]]

a[0] = [ x*2 for x in a[0] ]

print(a)
</code>


Python нумерует пустые строки при копировании
<code>
with open('C:\\...\\Demos\\first.txt','r') as firstfile, open('C:\\...\\reports\\second.txt','a') as secondfile:
for idx, line in enumerate(firstfile, start=1):
    secondfile.write('{} {}'. format(idx, line))
</code>
Как можно обойти нумерацию, кроме проверки циклом?

Можно использовать функцию
filter для
firstfile:

with open('C:\\...\\Demos\\first.txt','r') as firstfile, open('C:\\...\\reports\\second.txt','a') as secondfile:
    for idx, line in enumerate(filter(lambda s: s != '\n' , firstfile), start=1):
        secondfile.write('{} {}'. format(idx, line))


Получить количество неповторяющихся чисел в зависимости от системы исчисления.(оптимизация)
Неповторяющееся число, то число где все цифры в числе не повторяются, например 53498
Помогите, пожалуйста, сделать так, чтобы код не вычислял все возможные последовательности, потому что при системе исчисления, например, в 10 тратится очень большое количество памяти и я в, принципе, понимаю, что есть какой то вариант просто прибавлять счетчик не сохраняя данные каждого множества.
Вот пример моего кода:
<code>
def non_repeats(radix):
   from itertools import permutations
   thelist = [x for x in range(radix)]
   arr = []
   if len(thelist) > 0:
       for r in range(0,len(thelist)+1):
            arr += list(permutations(thelist, r))
   n = len(arr)
   for i in range(1, len(arr)-1):
       if arr[i][0] == 0:
           n -= 1
   return n-1
print(non_repeats(6))
</code>

Если я правильно понял:

import math

def count_non_repeats(radix):
    cnt = radix
    for i in range(2, radix + 1):
        cnt += (radix-1)*math.perm(radix-1, i-1)
    return cnt

>> 3  11  49  261  1631  11743  95901  876809  8877691

Откуда взялось: на первом месте в k-значном числе может стоять любая из цифр 1..radix-1, а после идёт любое из размещений выборки k-1 цифр из остальных цифр 0..radix-1, не включая уже задействованную цифру, таких размещений
A(radix-1, i-1)


Как посчитать количество итерации рекурсивной функции?
<code>
def F(n):
    print('*')
    if n > 0:
        F(n-2)
        F(n // 2)
        F(n // 2)

F(5)
</code>
Нужно посчитать количество звездочек в функции, то есть количество проходов стека, как это сделать?

Возможно слишком сложный способ - с декоратором, но позволяющий не трогать код функции
<code>
def countCalls(fun):
    def inner(*args):
        inner.calls += 1
        return fun(*args)
    inner.calls = 0
    return inner

@countCalls
def F(n):
    print('*')
    if n > 0:
        F(n-2)
        F(n // 2)
        F(n // 2)

F(5)
print(F.calls)  # 34
</code>


При чтении файла возникает IndexError: list index out of range
при выполнении кода :

b_12 = "1"
b_2 = "2"
b_22 = "2"
b_3 = "3"
b_32 = "3"
b_4 = "4"
b_42 = "4"
b_5 = "5"
b_52 = "5"
b_6 = "6"
b_62 = "6"
b_7 = "7"
b_72 = "7"
b_8 = "8"
b_82 = "8"
b_9 = "9"
b_92 = "9"

dir_path = os.path.dirname(os.path.realpath(__file__))
print (dir_path)
path_to_file = dir_path + "/cfg.txt"

with open(path_to_file) as file:

    b_1 = file.readlines()[1]
    b_12 = file.readlines()[2]
    b_2 = file.readlines()[3]
    b_22 = file.readlines()[4]
    b_3 = file.readlines()[5]
    b_32 = file.readlines()[6]
    b_4 = file.readlines()[7]
    b_42 = file.readlines()[8]
    b_5 = file.readlines()[9]
    b_52 = file.readlines()[10]
    b_6 = file.readlines()[11]
    b_62 = file.readlines()[12]
    b_7 = file.readlines()[13]
    b_72 = file.readlines()[14]
    b_8 = file.readlines()[15]
    b_82 = file.readlines()[16]
    b_9 = file.readlines()[17]
    b_92 = file.readlines()[18]

питон выдаёт ошибку

  File "c:\Users\Александр\Desktop\Qboard Sowftware\main.py", line 35, in <module>
    b_12 = file.readlines()[2]
IndexError: list index out of range

моя задача была каждой переменной выдать значение каждой строки файла cfg.txt
в чём моя ошибка ?

После первого
file.readlines() курсор находится в самом конце файла и читать оттуда больше нечего. Поэтому в строчке
b_12 = file.readlines()[2] считывается примерно ничего, а у ничего нет второго элемента.
Да и сама идея 18 раз читать файл, мягко скажем, не самая удачная. Во-первых, это медленно, во-вторых, зачем делать 18 раз одно и то же. Считай один раз в переменную и бери уже из этой переменной:

with open(path_to_file) as file: # после этой строчки не нужно делать две пустых
    data = file.readlines()
b_1 = data[1]
и т.д.


Как распаковать вот такое вот значение в python
Подскажите как распаковать вот это

['Диаметр возвратного провода [мм]', '10']['Наружный диаметр [мм]', '75']['Выпускн.-? [мм]', '8']['Впускн. ? [мм]', '8']['Высота [мм]', '131']

Чтоб получилось

Диаметр возвратного провода мм 10

и т.д в цикле

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

data = ["яблоко", "апельсин"]
value1, value2 = data
print(value1)
# яблоко
print(value2)
# апельсин

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

data = [["яблоко", "апельсин"], ["груша", "мандарин"]]
for value1, value2 in data:
    print(value1)  # 1-я итерация: яблоко, 2-я итерация: груша
    print(value2)  # 1-я итерация: апельсин, 2-я итерация: мандарин

Соответственно, дальше вы можете комбинировать эти переменные как вам угодно


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

import queue
some_list = [[1, -2, 3], [2, -3, 4], [3, -6, 7]]
q = queue.PriorityQueue(maxsize=len(some_list ))
for i in range(some_list (neg_list)):
    q.put(neg_list[i][-2::-1])

Итого в очереди имеем:

[-6, 3]
[-3, 2]
[-2, 1]

Как можно обратиться к первому элементу
[-6, 3] и к первому значению элемента
[-6]без его удаления из очереди?
В интернете нашел только обращение через q.get(), но он удаляет значение. Или следующее использование оптимально?

item = q.get()
# some code with item
q.put(item)

Ко всем элементам очереди можно всегда обратиться:

list(q.queue)

соответственно, к отдельному элементу - через индекс:

q.queue[0]
q.queue[1][1]


При конвертации даты и использование timezone получаю неверный пояс. datetime
На сервере время -3 по мск, мне нужно чтобы при конвертации времени, оно было московское, сейчас в ручную делаю offset, можно ли использовать для этого datetime timezone, но вот он выдает мне не верный часовой пояс при конвертации. Т.е даже не так, при datetime.now() часовой пояс верный, а вот при конвертации нет
<code>
>>> tm = datetime.datetime.strptime('29.09.2022', '%d.%m.%Y').replace(tzinfo=pytz.timezone("Europe/Moscow"))
>>> tm.utcoffset()
datetime.timedelta(seconds=9000)
>>> tm = datetime.datetime.now(pytz.timezone("Europe/Moscow"))
>>> tm.utcoffset()
datetime.timedelta(seconds=10800)
</code>

Попробуйте провести локализацию времени,  как рекомендуют разработчики pytz
ваш код:

tm = datetime.datetime.strptime('29.09.2022', '%d.%m.%Y').replace(tzinfo=pytz.timezone("Europe/Moscow"))
print(tm.utcoffset())

2:30:00

с локализацией:

tm = datetime.datetime.strptime('29.09.2022', '%d.%m.%Y').astimezone(pytz.timezone("Europe/Moscow"))
print(tm.utcoffset())

3:00:00


Как избавиться от break в коде по подсчету наценки в зависимости от суммы?
Написал мини программку для себя которая считает какую сумму с наценкой должен заплатить клиент.
Логика такая, если сумма заказа до 3000 то клиент платит наценку в зависимости от суммы (до 100, до 500 и до 3000) если более 3000 то наценка в зависимости от выбранного брэнда.
Программку я написал, она работает) Но код мне совсем не нравиться. Есть ли возможность как то обойти break которые мне пришлось использовать что бы дальше условия не проверялись? и вообще как все сделать по красивее (но не усложнять слишком сильно разными библиотеками)
<code>
def percent(num, divider):
    i = num/100*divider
    i = num+i
    return i

data, brand = int(input('Введите цену: ')), int(input('Введите брэнд: (1 = FOBI)'
                                                      ' (2 = Knox) (3 = PRAM)'
                                                      ' (4 = LOFE): '))
while(True):
    if data <= int(100):
        print(percent(data, 300))
        break
    if data <= 500:
        print(percent(data, 150))
        break
    if data <= 3000:
        print(percent(data, 80))
        break
    if brand == 1:
        print(percent(data, 5))
        break
    if brand == 2:
        print(percent(data, 17))
        break
    if brand == 3:
        print(percent(data, 25))
        break
    if brand == 4:
        print(percent(data, 11))
        break
</code>

<code>
def get_percent(price, multiply):
    return price + price / 100 * multiply

def calc(price, brand):
    coefficient = {
        1: 5,
        2: 17,
        3: 25,
        4: 11,
    }
    if price <= 100:
        return get_percent(price, 300)
    if price <= 500:
        return get_percent(price, 150)
    if price <= 3000:
        return get_percent(price, 80)
    return get_percent(price, coefficient[brand])

if __name__ == '__main__':
    price = int(input('Введите цену: '))
    brand = int(input('Введите брэнд: (1 = FOBI) (2 = Knox) (3 = PRAM) (4 = LOFE): '))
    print(calc(price, brand))
</code>
Зачем тут цикл, абсолютно не понятно, типа цикл идёт ровно до первого условия, а значит проходит 1 раз максимум, и он тут просто без надобности


Как перезапустить AsyncTeleBot после ошибки Aiohttp ClientError: ServerDisconnectedError
Есть чат-бот, написанный с помощью pyTelegramBotApi и asyncio. При запуске использую такую простую конструкцию:

from telebot.async_telebot import AsyncTeleBot
import asyncio

TOKEN = "some token"
bot = AsyncTeleBot(TOKEN, parse_mode=None)

# some handlers

async def bot_start():
    await bot.polling(non_stop=True)

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

Всё стабильно работает приблизительно от 2 до 5 дней. Однако после возникает ошибка:

ERROR - TeleBot: "Aiohttp ClientError: ServerDisconnectedError"
ERROR - TeleBot: "Request timeout. Request: method=get url=getUpdates params=<aiohttp.formdata.FormData object at 0x>

Пытался обрабатывать ошибку и добавлять запуск в блок while, но особого успеха нет.

Ответ оказался максимально прост.
Ввёл параметр request_timeout для метода polling и ошибки не возникало уже целый месяц.

await bot.polling(non_stop=True, request_timeout=90)


получение данных из очереди в заданном порядке
Вопрос в том что
part разной длины и грубо говоря если
data[0] больше чем
data[1], то
data[1] достаётся раньше из очереди, а мне бы хотелось чтобы были по порядку, как
part идут. Ждать пока
data[0] будет готова, поместить её в выходную очередь, а потом уже
data[1] туда положить, посоветуйте как такое реализовать.

from multiprocessing.dummy import Pool
from queue import Queue

def func(data):
    rec = KaldiRecognizer(model, sample_rate)
    for part in data:
        if rec.AcceptWaveform(data):
            queue.put(rec.Result())
        else:
            rec.PartialResult()
        if rec.FinalResult() != '':
            queue.put(rec.FinalResult())
    return

with Pool as pool:
    pool.map(func, data)

    while not queue.empty():
        print(queue.get())

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

from multiprocessing.dummy import Pool
from queue import Queue

def func(data):
    rec = KaldiRecognizer(model, sample_rate)
    result = []
    for part in data:
        if rec.AcceptWaveform(data):
            result.append(rec.Result())
        else:
            rec.PartialResult()
        if rec.FinalResult() != '':
            result.append(rec.FinalResult())
    return result

with Pool() as pool:
    for result in pool.map(func, data):
        for item in result:
            print(result)


Python. Помогите найти ошибку
<code>
print ("введите натуральное число")
n = input()
f=0
print("Введите цифру которую хотите убрать" )
m= input()
f=n.replace(m, '')
m=int
while(m>=0):
  if (f!=n):
     print(f)
  else:
     m=input()
</code>
Нужно чтобы при вводе цифры, которой нет в числе, ввод цифры повторялся.

Как вам правильно заметили в комментарии, ошибка была в строке
m=int. Функция
int позволяет преобразовать число или строку с числом в тип int (т.е. целое число). Чтобы вызвать функцию, послее неё нужно написать скобки (), чего вы не сделали, поэтому и возникает ошибка при исполнении кода. Кроме того, в скобки нужно указать аргумент, т.е. значение, которое вы хотите привести к типу целого числа. Правильно было бы
m = int(m). Но у вас также ошибка в логике построении кода.
Если я правильно понял вашу задачу, думаю, такой код вам подойдёт:

print("Введите натуральное число:")
n = input()
print("Введите цифру, которую хотите убрать:")
m = input()
while m not in n:  # до тех пор пока m нет в n:
    print("Введенная цифра отсутствует в числе, введите другую:")
    m = input()
# как только условие m not in n перестает выполняться, цикл while
# прекращается и выполняется код ниже:
f = n.replace(m, '')
print(f)


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

if message.from_user.full_name == 'Менеджер':
    await bot.kick_chat_member(message.chat.id, message.from_user.id)
    await message.delete()
    return

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

bmenbers = ['Менеджер', 'Manager']

Должно быть так:
<code>
if message.from_user.full_name in bmenbers:
    await bot.kick_chat_member(message.chat.id, message.from_user.id)
    await message.delete()
    return
</code>


Каким образом заменить функцию .find() языка python в языке c++
Всем привет! Появилась задача переписать небольшой код с языка python на c++ (суть задачи: шифрование сообщения многоалфавитной одноконтурной подстановкой) и возникла проблема замены функции .find() в Пайтон на что либо другое в плюсах. Пытался и через цикл и через функцию find в с++ - не выходит. Если сможете помочь - буду очень благодарен!
Код на Python:

alphabet_two = "ABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}$#@+=_*&^%,-abcdefghijklmnopqr|/tuvwxyz:!?."
alphabet_three = "АБВГДЕЁЖЗИЙКЛМНОПРСТУ ,абвгдеёжзий-клмнопрстуфхцчшщъыьэюя;ФХЦЧШЩ|/ЪЫЬЭЮЯ."
alphabet_four = "STUVWXYZ[]{}$#@+=_*&^%,abcdABCDEFGHIJKLMNOPQRefghijk-lmnopqrst|/uvwxyz:!?"

def crypt (message, alphabet_one, alphabet_two, alphabet_three, alphabet_four):
    result = ''
    for i in range(0, len(message), 3):
        index = alphabet_one.find(message[i])
        result += alphabet_two[index]
        if i + 1 < len(message):
            index = alphabet_one.find(message[i + 1])
            result += alphabet_three[index]
        if i + 2 < len(message):
            index = alphabet_one.find(message[i + 2])
            result += alphabet_four[index]
    return result

def decrypt(message, alphabet_one, alphabet_two, alphabet_three, alphabet_four):
    result = ''
    for i in range (0, len(message), 3):
        index = alphabet_two.find(message[i])
        result += alphabet_one[index]
        if i + 1<len(message):
            index = alphabet_three.find(message[i+1])
            result += alphabet_one[index]
        if i + 2 < len(message):
            index = alphabet_four.find(message[i+2])
            result += alphabet_one[index]
    return result

Мои попытки на плюсах:

#include <iostream>
#include <string>
using namespace std;

string alphabet_one = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ ,абвгдеёжзийклмнопрстуфхцчшщъыь!?эюя;.-";
string alphabet_two = "ABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}$#@+=_*&^%,-abcdefghijklmnopqr|/tuvwxyz:!?.";
string alphabet_three = "АБВГДЕЁЖЗИЙКЛМНОПРСТУ ,абвгдеёжзий-клмнопрстуфхцчшщъыьэюя;ФХЦЧШЩ|/ЪЫЬЭЮЯ.";
string alphabet_four = "STUVWXYZ[]{}$#@+=_*&^%,abcdABCDEFGHIJKLMNOPQRefghijk-lmnopqrst|/uvwxyz:!?";

string crypt (string message, string alphabet_one, string alphabet_two, string alphabet_three, string alphabet_four)
{
    string result = "";
    for (int i = 0; i < message.length() - 1; i += 3)
    {
        int index = 0;
        for (int y = 0; y < alphabet_one.length(); y++)
        {
            if (alphabet_one[y] != message[y])
            {
                index++;
            }
            else
            {
                break;
            }
        }
        result += alphabet_two[index];
        if (i + 1 < message.length())
        {
            for (int t = 0; t < alphabet_one.length(); t++)
            {
                if (alphabet_one[t] != message[t + 1])
                {
                    index++;
                }
                else
                {
                    break;
                }
            }
            result += alphabet_three[index];
        }
        if (i + 2 < message.length())
        {
            for (int r = 0; r < alphabet_one.length(); r++)
            {
                if (alphabet_one[r] != message[r + 2])
                {
                    index++;
                }
                else
                {
                    break;
                }
            }
            result += alphabet_four[index];
        }
        }
        return result;
}
int main()
{
    string message;
    cin >> message;
    cout << crypt(message,alphabet_one,alphabet_two,alphabet_three,alphabet_four) << endl;
}

У класса
std::string есть точно такой же метод find() (с некоторыми исключениями). Если передать туда символ, то он вернёт индекс первого вхождения в строке этого символа, либо -1, если такого символа нет. Подробнее можете прочитать здесь


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

def main():
    while True:
        requests.post(url, headers = auth, data = msg_work)
        requests.post(url, headers = auth, data = msg_daily)

if __name__ == '__main__':
    main()

Мне надо, чтобы запрос с msg_work выполнялся раз в час, а запрос с msg_daily раз в 24 часа. Я думал это реализовать как- то через time.sleep() но так и не придумал каким образом я могу это сделать
upd
Реализовал всё таки это через time.sleep()

def main():
    hours_passed = 0
    while True:
        if hours_passed == 0:  # a day has passed
            requests.post(url, headers = auth, data = msg_daily)
            print(f'Daily success💼 {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
        requests.post(url, headers = auth, data = msg_work)
        print(f'Work success⛏ {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
        hours_passed = (hours_passed + 1) % 24
        time.sleep(3600)  # it will sleep for a hour

if __name__ == '__main__':
    main()

Но буду переделывать через
@tasks.loop() так как выглядит более лаконично

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

from discord.ext import tasks

@tasks.loop(hours=24)
async def write_a_message():
   await channel.send('Hello world!')

Время можно указывать не только в часах, но и в секундах и в минутах, для этого есть соответствующие параметры
minutes и
seconds. Более подробно можно прочитать здесь


Python SQLite3 AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY [закрыт]

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

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

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

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

При написании небольшой программы для контроля базы данных на SQLite3 и PyWebIO возникает данная ошибка:

Traceback (most recent call last):
  File "C:\Users\WORK\AppData\Local\Programs\Python\Python310\lib\site-packages\pywebio\session\coroutinebased.py", line 321, in step
    coro_yield = self.coro.send(result)
  File "C:\Users\WORK\AppData\Local\Programs\Python\Python310\lib\site-packages\pywebio\session\coroutinebased.py", line 101, in _start_main_task
    await target()
  File "C:\Users\WORK\Desktop\SQLite\main.py", line 20, in main
    cursor.execute("CREATE TABLE IF NOT EXISTS users ('id' INTERGER PRIMARY KEY AUTOINCREMENT, 'name' STRING)")
sqlite3.OperationalError: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY

Вот код:

import sqlite3 as sql

import asyncio

from pywebio import start_server
from pywebio.input import *
from pywebio.output import *
from pywebio.session import defer_call, info as session_info

global name
name = ""
async def main():
    put_markdown("Users database control.")
    database = put_scope(name="database")
    put_scrollable(database, height=300, keep_bottom=True)

    with sql.connect('Users.db') as db:

        cursor = db.cursor()
        cursor.execute("CREATE TABLE IF NOT EXISTS users ('id' INTERGER PRIMARY KEY AUTOINCREMENT, 'name' STRING)")
        def add():
            global name
            cursor.execute("SELECT name FROM users")
            cursor.execute("INSERT OR IGNORE INTO users ('name') VALUES (?)",(name))
            clear("database")
            cursor.execute("SELECT * FROM USERS")
            rows = cursor.fetchall()
            [put_text(f'{row[0]}    {row[1]}', scope="database") for row in rows]
            toast(f"Sucessfully added {name}")

        def delete():
            global name
            cursor.execute("SELECT name FROM users")
            cursor.execute("DELETE FROM users WHERE name = ?",(name))
            clear("database")
            cursor.execute("SELECT * FROM USERS")
            rows = cursor.fetchall()
            [put_text(f'{row[0]}    {row[1]}', scope="database") for row in rows]
            toast(f"Sucessfully deleted {name}")

        def exit():
            toast("See you next time!")
            db.commit()
            cursor.close()
            quit()
        def clr():
            global next_id
            cursor.execute("DELETE FROM users")
            next_id = 0
            toast("Sucessfully cleared database")
            clear("database")
        global name
        put_button("Add user", onclick=add)
        put_button("Delete user", onclick=delete)
        put_button("Clear database", onclick=clr)
        put_button("Exit", onclick=exit)
        while True:
            clear("database")
            cursor.execute("SELECT * FROM USERS")
            rows = cursor.fetchall()
            [put_text(f'{row[0]}    {row[1]}', scope="database") for row in rows]
            name = await input("Username", placeholder="Username")
        put_button("Exit", onclick=exit)
if __name__ == '__main__':
    start_server(main, port=8080, debug=True)

Опечатка в Слове "Integer".
Вот корректный запрос:

CREATE TABLE IF NOT EXISTS users ('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'name' STRING)


Формирование словаря по value
Нужна помощь, из списка получить словарь, который бы из хобби человека вывел имена.

data: str -> dict:

Например,

Маша:футбол, Артур:хоккей, Миша:футбол, Моника:теннис, Ира:теннис.

Из этого он должен делать dict:

{хоккей: [Артур], теннис: [Моника, Ира], футбол: [Маша, Миша]}

result = {}
sort_dictionary = {k: sorted(v) for k, v in dict.items()}
for line in data.split('\n'):
    name, hobby = line.split(":")
    result.setdefault(hobby, []).append(name)
    result = sort_dictionary(result)
return result

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

В цикле после:
<code>
name,hobby=line.split(":")

result.setdefault(hobby,[]).append(name)
</code>


Как найти определенное изменение с помощью сигнала Django?
Концепция:
Я изменяю определнный
Model. Затем после сохранения срабатывает
POST_SAVE-сигнал. (Все происходит в Djangp-admin)
Вопрос:
Как именно мне отследить, что был изменен определенный
Model и затем запускать функцию?

Получилось решить самому. Решил, что нужно после инициализирования сохранить результат таким образом. Поправьте, если что-то не так.
<code>
@receiver(signal=signals.post_init, sender=AgentCards)
def send_bucks(instance, **kwargs):
    instance.old_bucks = instance.bucks

@receiver(signal=signals.post_save, sender=AgentCards)
def send_bucks(instance, **kwargs):
    if instance.old_bucks != instance.bucks:
        send_message(instance.chat_id, (instance.bucks - instance.old_bucks))
</code>


Преобразовать список координат точек в словарь в Python
Есть список координат точек

[1, 1, 4, 1, 1, 3, 4, 3]

Как из этого списка создать словарь вида

{"x1": 1, "y1": 1, "x2": 4, "y2": 1, ... }

?


Отсортируйте value в алфавитном порядке. Сортирует всё
<code>
def sort_dictionary(dict: dict) -> dict:
  return sorted(dict.items(), key=lambda x: x[1])

print(sort_dictionary({"b": [], "a": [], "c": []}))  # = > {"b": [], "a": [], "c": []}
print(sort_dictionary({"": ["a", "f", "d"]}))  # = > {"": ["a", "d", "f"]}
print(sort_dictionary({"b": ["d", "a"], "a": ["c", "f"]}))  # = > {"b": ["a", "d"], "a": ["c", "f"]}
print(sort_dictionary({"Jack": ["swimming", "hiking"], "Charlie": ["games", "yoga"]}))  # = > {"Jack": ["hiking", "swimming"], "Charlie": ["games", "yoga"]}
</code>
Отсортируйте value в алфавитном порядке. Порядок key не важен.

Не понимаю как сделать, чтобы выдавал ответ в dict формате
Начинает сортировать всё, а не только value.

Судя по комментариям, вам надо отсортировать списки, которые являются значениями в словаре
<code>
def sort_dictionary(d: dict) -> dict:
  return {k:sorted(v) for k,v in d.items()}
</code>
Не называйте переменные именами встроенных типов!


Пользователь вводит число N, после чего вводит N чисел. Верно ли, что они упорядочены по возрастанию?
Задание по Python, выданное на этапе, когда изучены только for, while, if
Вот, что у меня получилось. Проблема в том, что программа выводит положительный ответ, когда i нулевое меньше, чем i n-ное, игнорируя промежуточные значения (например, при вводе чисел 4, 3, 2, 5). Прошу помощи.
<code>
if n<=1:
    print('Введите количество, большее, чем 1')
else:
    lst = [int(input('Введите число: ')) for i in range(n)]
    for k in range(len(lst)):
        k=0
        if lst[i]<lst[i+1]:
            print('Числа упорядочены по возрастанию')
            break # если убрать break  - выводит n раз "Да"
            k+=1
        else:
            print('Числа не упорядочены по возрастанию')
            break # если убрать break  - выводит n раз "Нет"
</code>

<code>
flag = True
for k in range(len(lst) - 1):
    if lst[k] >= lst[k+1]:
        print('Числа не упорядочены по возрастанию')
        flag = False
        break
if flag:
   print('Числа упорядочены по возрастанию')
</code>
А вот k внутри цикла for изменять не надо


Создайте словарь о людях и их увлечениях, т.е. {имя1: [хобби1, хобби2, ...], имя2: [...]}

def create_dictionary(data: str) -> dict:
    dct = {}
    for line in data:
        d = line.strip().split(":")
        if len(d) > 1:
            if d[0] in dct:
                dct[d[0]].append(d[1])
            else:
                dct[d[0]] = [d[1]]
    return dct

sample_data = """Jack:crafting\nPeter:hiking\nWendy:gaming\nMonica:tennis\nChris:origami\nSophie:sport\nMonica:design\nCarmen:sport\nChris:sport\nMonica:skateboarding\nCarmen:cooking\nWendy:photography\nMonica:tennis\nCooper:yoga\nWendy:sport\nCooper:movies\nMonica:theatre\nCooper:yoga\nChris:gaming\nMolly:fishing\nJack:skateboarding\nWendy:fishing\nJack:drawing\nMonica:baking\nSophie:baking\nAlfred:driving\nAlfred:shopping\nAlfred:crafting\nJack:drawing\nCarmen:shopping\nCarmen:driving\nPeter:drawing\nCarmen:shopping\nWendy:fitness\nAlfred:travel\nJack:origami\nSophie:design\nJack:pets\nCarmen:dance\nAlfred:baking\nSophie:sport\nPeter:gaming\nJack:skateboarding\nCooper:football\nAlfred:sport\nCooper:fitness\nChris:yoga\nWendy:football\nMolly:design\nJack:hiking\nMonica:pets\nCarmen:photography\nJack:baking\nPeter:driving\nChris:driving\nCarmen:driving\nPeter:theatre\nMolly:hiking\nWendy:puzzles\nJack:crafting\nPeter:photography\nCarmen:theatre\nSophie:crafting\nCarmen:cooking\nAlfred:gaming\nPeter:theatre\nCooper:hiking\nChris:football\nChris:pets\nJack:football\nMonica:skateboarding\nChris:driving\nCarmen:pets\nCooper:gaming\nChris:hiking\nJack:cooking\nPeter:fishing\nJack:gaming\nPeter:origami\nCarmen:movies\nSophie:driving\nJack:sport\nCarmen:theatre\nWendy:shopping\nCarmen:pets\nWendy:gaming\nSophie:football\nWendy:theatre\nCarmen:football\nMolly:theatre\nPeter:theatre\nMonica:flowers\nMolly:skateboarding\nPeter:driving\nSophie:travel\nMonica:photography\nCooper:cooking\nJack:fitness\nPeter:cooking\nChris:gaming"""

dic = create_dictionary(sample_data)

print("shopping" in dic["Wendy"])  # -> True
print("fitness" in dic["Sophie"])  # -> False
print("gaming" in dic["Peter"])  # -> True
print(len(dic["Jack"]))  # ->  12
print(len(dic["Carmen"]))  # -> 10
print(len(dic["Molly"]))  # -> 5
print(len(dic["Sophie"]))  # -> 7

что-то явно делаю не так. Можете помочь? Не должно быть повторяющихся увлечений на 1 человеке.

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

def create_dictionary(data: str) -> dict:
    dct = {}
    for line in data.split('\n'):
        d = list(map(str.strip, line.split(":")))
        if len(d) > 1:
            dct[d[0]] = dct.get(d[0], []) + [d[1]]
    return dct

dic = create_dictionary(sample_data)

print("shopping" in dic["Wendy"])  # -> True
print("fitness" in dic["Sophie"])  # -> False
print("gaming" in dic["Peter"])  # -> True
print(len(set(dic["Jack"])))  # ->  12
print(len(set(dic["Carmen"])))  # -> 10
print(len(set(dic["Molly"])))  # -> 5
print(len(set(dic["Sophie"])))  # -> 7

ваши ошибки

вы не разбиваете строку на строки по разделителю '\n' в самом начале:

 for line in data.split('\n'):

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

 print(len(set(dic["Jack"])))  # ->  12

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

 dct[d[0]] = dct.get(d[0], []) + [d[1]]

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

    if len(d) > 1:
        dct[d[0]] = set.union(dct.get(d[0], set())).union([d[1]])

ну и
strip() можно применить не к начальной строке, а к строкам, которые получаются из нее - это понадежнее

 d = list(map(str.strip, line.split(":")))


Вывод текста с "\n" из списка: не переносится на новую строку
Текст в txt файле:

It is a... \nof a page when looking at its layout

Код:

f = open('f.txt', 'r')
s_list = f.readlines()

current_quest = 0

print(s_list[current_quest])

Вывод:

It is a... \nof a page when looking at its layout

Должен быть так:

It is a...
of a page when looking at its layout

ну можно произвести замены типа

text = r'line1\nline2'
text = text.replace(r'\n', '\n')

чтобы заменить 2 символа
\n на один символ, который означает перенос строки
а вообще используйте стандартные функции, которые позволяют декодировать эскейп последовательности

text = r'line1\nline2'

text = text.encode('ascii', 'ignore').decode('unicode_escape')


Ответ с изображением на сообщение пользователя aiogram
Здраствуйте, мне нужно отправить фото в ответ на последнее сообщение от пользователя в aiogram. Я пытался использовать
<code>
await bot.send_photo(chat_id=message.chat.id, photo=photo, caption='текст', parse_mode="Markdown", reply_to_message_id=message.from_user.id)
</code>
но выдавало ошибку что сообщение не найдено, кто может помочь?

Почему-то в параметр вы указываете message.from_user.id - это id пользователя. Вам же нужно ответить на id сообщения - message.message_id.
Не понял, зачем вам указывать parse_mode (это можно сделать в самом боте, а не в каждом сообщении)
Код будет выглядеть так:
<code>
await bot.send_photo(
    message.chat.id, photo, caption='текст',
    reply_to_message_id=message.message_id)
</code>


Как отправить группу фото Aiogram [закрыт]

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

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

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

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

Нужно чтобы от лица бота отправлялось 2+ картинки, причем текст под постом так же должен присутствовать.
Но по дефолту бот отправляет первую картинку, а остальные игнорирует.

Вот так
<code>
@dp.message_handler(commands=['start'])
async def bot_message(message: types.Message):
    media = MediaGroup()
    media.attach_photo(photo=InputFile("icon.png"))
    media.attach_photo(photo=InputFile("icon.png"))
    media.attach_photo(photo=InputFile("icon.png"))
    media.attach_photo(photo=InputFile("icon.png"))
    await message.answer_media_group(media=media)
</code>


Как изменить время сна цикла в зависимости от условия
Есть некий цикл while например:
<code>
while True:
    что-то там
time.sleep(5)
</code>
хотелось бы изменять значение time.sleep в зависимости от условия, например если бд пустая то time.sleep(3600) если нет то time.sleep(5) как это можно сделать?

Открыть учебник по Python.
Изучить, что такое "переменная" и как ее использовать.
Изучить, что такое оператор if.

Потом попытаться написать скрипт примерно такого вида
<code>
while True:
    if условие1:
        a=5
    else:
        a=3600
    time.sleep(a)
</code>
Про то, как выйти из вашего бесконечного цикла -  оставляю для самостоятельной проработки.


Как передать переменную из def в другой файл python
Здраствуйте, у меня есть два файла, в одном есть функция def, в которой переменная присваивается чему-то. А во втором файле запускается функция из первого файла, и она должна получить присвоенную переменную, как это сделать? Вот пример кода
1 файл (test.py)

value = 0
def test():
    value = 1

2 файл

for test.py import test, value
test()
print(value)

test.py

def func():
    value = 1
    return value

2 файл

from test import func
value = func()
print(value)


Оптимизировать алгоритм поиска кратных чисел
Надо найти все числа кратные хотя бы одному из 2-х чисел(напр. 7 и 19) и вернуть список кратных чисел. Требование вывести именно список кратных чисел, поэтому тут никак не схитрить. Я решил оптимизировать код и не использовать простой перебор всех чисел. Первая мысля - это взять наименьшее число и прибавлять каждый проход это же число(напр. кратность 7 т.е. 7 а дальше 14, 21 и т д. и аналогично для второго числа). Для эксперимента я замерил время моего "эффективного" алгоритма и время простого перебора - выхлоп не очень, на отрезке от 0 до 100 млн выигрыш 1-3 секунд(на отрезках много меньше выигрыш вообще в пределах погрешности). Из этого два вопроса: 1) есть ли более эффективный алгоритм для поиска 2(а может и более) кратных чисел? 2) влияет конкретно в python тот факт, что я +- 10 млн чисел запихал в память влияет на производительность?
предложенный алгоритм

def sol (count, num1, num2):
res = []
working = True
flag1 = True
flag2 = True

while(working):
    if num1 <= count:
        res.append(num1)
        num1 += 3
    else:
        flag1 = False

    if num2 <= count:
        res.append(num2)
        num2 += 5
    else:
        flag2 = False

    if not(flag1 or flag2):
        working = False

res = list(set(res))
return res

как я сделал простой перебор

def sec_sol(count, num1, num2):
res = []
for i in range(count + 1):
    if i % num1 == 0 or i % num2 == 0:
        res.append(i)

res = list(set(res))
return res

и вот замеры по времени с модулем time()
11.5572 -  первый "эффективный" алгоритм
12.6264 -  простой перебор

А не хотите найти НОК и дальше не мучиться?...

def gcd(m,n):
    while m != 0 and n != 0:
        if m < n:
            n %= m
        else:
            m %= n
    return m+n

def lcm(m,n):
    return (m//gcd(m,n))*n

def sol (count, num1, num2):
    res = []
    l = lcm(num1,num2)
    for i in range(1,count+1):
        res.append(l*i)
    return res

Да, ваше

числа кратные заданным 2м числам

я рассматриваю как кратные одновременно обоим заданным числам. Если это не так, перепишите условие как кратные хотя бы одному из двух заданных чисел.
Update
Тогда примерно так:

def sol (num1, num2, count):
    res = []
    if num1 > num2:
        tmp = num1
        num1 = num2
        num2 = tmp

    k = 0
    m1 = num1
    m2 = num2
    while 1:
        if m1 < m2:
            res.append(m1)
            m1 += num1
        elif m1 > m2:
            res.append(m2)
            m2 += num2
        else:
            res.append(m2)
            m2 += num2
            m1 += num1
        if m1 > count or m2 > count:
            break
    return res


Изменение Inline кнопки aiogram

@dp.message_handler(commands=['start'], state=None)
async def starter(message):
    kp = types.InlineKeyboardMarkup()

    btn1 = types.InlineKeyboardButton(text='❤', callback_data='btn1')
    btn2 = types.InlineKeyboardButton(text='❤', callback_data='btn2')
    btn3 = types.InlineKeyboardButton(text='❤', callback_data='btn3')

    btn4 = types.InlineKeyboardButton(text='❤', callback_data='btn4')
    btn5 = types.InlineKeyboardButton(text='❤', callback_data='btn5')
    btn6 = types.InlineKeyboardButton(text='❤', callback_data='btn6')

    btn7 = types.InlineKeyboardButton(text='❤', callback_data='btn7')
    btn8 = types.InlineKeyboardButton(text='❤', callback_data='btn8')
    btn9 = types.InlineKeyboardButton(text='❤', callback_data='btn9')
    kp.add(btn1, btn2, btn3)
    kp.add(btn4, btn5, btn6)
    kp.add(btn7, btn8, btn9)
    await bot.send_message(message.from_user.id, 'Генерация поля', reply_markup=kp)

@dp.callback_query_handler(lambda call: True)
async def back(call):
    if call.data == 'btn1':
        btn1 = types.InlineKeyboardButton(text='❌')

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

@dp.callback_query_handler(lambda call: True)
    async def back(call):
        if call.data == 'btn1':
            btn1 = types.InlineKeyboardButton(text='❌')

Прекрасно понимаю, что вот эта часть ничего не даст.
Как обычно - готового решения не жду (а может и жду)

<code>
@dp.callback_query_handler(lambda call: True)
async def back(call):
    if call.data == 'btn1':

        kp = types.InlineKeyboardMarkup()

        btn1 = types.InlineKeyboardButton(text='Тестовый код', callback_data='Тест')
        btn2 = types.InlineKeyboardButton(text='❤', callback_data='btn2')
        btn3 = types.InlineKeyboardButton(text='❤', callback_data='btn3')

        btn4 = types.InlineKeyboardButton(text='❤', callback_data='btn4')
        btn5 = types.InlineKeyboardButton(text='❤', callback_data='btn5')
        btn6 = types.InlineKeyboardButton(text='❤', callback_data='btn6')

        btn7 = types.InlineKeyboardButton(text='❤', callback_data='btn7')
        btn8 = types.InlineKeyboardButton(text='❤', callback_data='btn8')
        btn9 = types.InlineKeyboardButton(text='❤', callback_data='btn9')
        kp.add(btn1, btn2, btn3)
        kp.add(btn4, btn5, btn6)
        kp.add(btn7, btn8, btn9)

        await bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id, reply_markup=kp)
</code>
Сработало вот таким кодом.


Как удалять стикеры тг ботом?
Обычные сообщения и смайлы можно удалить через
delete_message, а вот стикеры и GIF не подпадают под это.
Как собственно удалять эти стикеры и гифы?

@dp.message_handler(content_types=types.ContentTypes.STICKER)
async def bot_message(message: types.Message):
    await message.delete()


Перестановки неограниченной длины на python
Я хочу получить итератор на все возможные строки, представляющие собой перестановки из символов имеющегося алфавита.
К примеру, при алфавите ('0', '1') и длине строки 3 я хочу получить:

"000", "001", "010", ... "110", "111"

К сожалению, модуль itertools мне это сделать не даёт: если длина строки превосходит длину алфавита, то permutation просто создаёт пустой итератор.
Лично мне не особо принципиально, я могу сделать что-то типа такого:

alphabet = {'a', 'b', 'c', 'd'}
for a in alphabet:
  for b in alphabet:
    # Смысл дальше, думаю, понятен

Ни в документации, ни на форумах я, к сожалению, не нашёл решения подобной проблемы. Но мне просто интересно: 1) верно ли, что itertools не предоставляет такой функционал? Но если да, то 2) можно ли обойтись без "наивного" кода сверху?

во первых есть стандартная библиотека
itertools и функция
product:

import itertools

print(*itertools.product((0, 1), repeat=3))

во вторых данную задачу можно свести к перебору чисел от
0 до
N^M - 1, где
M - кол-во цифр,
N - система счисления
например в вашем примере имеется 2-ричная система со словарем
(0, 1), а всего соответственно может быть
2^3 вариантов и значит надо перебрать все числа до 8 и каждое перевести из 10 ричной в 2ричную систему:

dictionary = ('0', '1')
size = 3
for i in range(len(dictionary)**size):
    value = i
    res = []
    for j in range(size):
        digit = value % len(dictionary)
        value = (value - digit) // len(dictionary)
        res.append(dictionary[digit])

    print(res[::-1])


Как возвести целое число в степень 2 без использования ** и pow? [закрыт]

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

 Скорее всего, данный вопрос не соответствует тематике Stack Overflow на русском, согласно правилам описанным в справке.

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

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

Дано целое число n и нужно возвести его в степень 2ки, т е n = 10 и вывод 1024.
Как это вообще монжо сделать без использования ** и pow?

Можно воспользоваться оператором побитового сдвига Побитовые операторы(bitwise) в Python.

n = 10
print('Результат: ', 1 << n)
print('Проверка: ', 2 ** n)

Результат:  1024
Проверка:  1024


Python встроить библиотеку в файл
Я создаю приложение на Python и задумался над одной проблемой. Python есть не на всех устройствах, а тем более модули которые я использую. Есть идеи как встроить интерпретатор и модули в .exe шник? Если я не ошибаюсь, minecraft сам при установке импортирует Java.

Начну с конца, Minecraft не тянет JRE (Java Runtime Environment - она же Java-машина), из-за чего всего и возникала проблема у школьников (во всяком случае ещё лет 6 назад), где скачать и как устанавить эту непонятную для них Джаву.
По поводу того, как переносить настроенное окружение Python, тут как минимум 2 варианта.
Первый - в каталоге с файлом запуска держать папку с python'ом, где будут и подтянутые библиотеки и нужная версия интерпретатора. Для запуска можно создать .bat файл, в котором пропишете строку запуска приложения, или же можно для красоты создать или на том же c\c++ .exe файл, который будет иметь и иконку и расширение .exe
Второй - по сути усложнение первого варианта - использовать PyInstaller, он создаст вам сборку python проекта в .exe файл. Но на самом деле, это просто архиватор, при запуске этого exe'шника, это приложение распакует те же файлы во временную папку и оттуда будет тянуть.


Aiogram остановка бота на момент парсинга. Multiprocessing. Async
Мне нужно с высокой скорость парсить сайт. Для этого я использовал multiprocessing и aiohttp. При запуске парсинга, бот стопорится. Полагаю, проблема где-то в этом участке кода, помогите разобраться. p.map блокирует основной поток, есть ли способ этого избежать?

async def get_json(CURL):
    # парсинг через aiohttp

def middleware(curl):
    asyncio.run(get_json(curl)) # запуск самого асинхронного парсинга

# запускаемая функция
async def start_pars():
    CURL = [1, 2, 3, 4, ...]
    with multiprocessing.Pool(multiprocessing.cpu_count()) as p:
        p.map(middleware, CURL) # запуск 4-х потоков

Ещё постоянно выскакивает, как я прочёл, некритичная ошибка:

raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

p.map блокирует поток, в котором он был запущен. Поэтому я решил проблему путём создания потока, в котором запустил p.map
<code>
thread = Thread(target=(asyncio.run), args=(start_pars(), ))
thread.start()
</code>


Как исключить один графиков в distplot
Есть датасет с 7 столбцами, он выделен из большого датасета.
вида -

df_numeric = df[['1','2','3','4','5','6','type']]

type имеет значения 0 и 1
надо построить графики distplot в цикле.

plt.subplots(figsize=(20,15))
num_cols=3
num_rows=len(df_num.columns.values)//num_cols + 1
for i, col in enumerate(df_numeric.columns.values):
    sns.distplot(df_numeric.query('type==1')[col], label ='try1',ax=plt.subplot(num_rows,
                                                                          num_cols, i+1))
    sns.distplot(df_numeric.query('type==0')[col], label ='try2')
    plt.title(col)
    if i ==0: plt.legend()

Как исключить из этих график, который отрисовывает по столбцу - type.
т.е. сделать только 6 графиков по столбцам 1-6

Например, так:
<code>
for i, col in enumerate(df_numeric.columns.values):
    if col == 'type':
        continue
    ...
</code>


Где я ошибся в логическом выражении?
Вот само выражение - ((x ∈ P) ≡ (x ∈ Q)) → ¬(x ∈ A)
Вот мой код:

#Наибольшее -> remove
#Наименьшее -> append

p = list(range(5, 31))
q = list(range(14, 24))
a = list(range(52))

for x in range(52):
    if not(((x in p) == (x in q)) <= (x not in a)):
        a.remove(x)
print(a)

Вот сама задача, если кому надо:
На числовой прямой даны два отрезка: P = [5, 30] и Q = [14, 23]. Укажите наибольшую возможную длину промежутка A, для которого формула
((x ∈ P) ≡ (x ∈ Q)) → ¬(x ∈ A)
тождественно истинна, то есть принимает значение 1 при любом значении переменной х.
Вывод, который должен:

[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
Мой вывод:

[5, 6, 7, 8, 9, 10, 11, 12, 13]

sympy.Interval представляет отрезок прямой:

import sympy

p = sympy.Interval(5, 30)
q = sympy.Interval(14, 23)

r = p.symmetric_difference(q)
print(r)

$ python symdif.py
Union(Interval.Ropen(5, 14), Interval.Lopen(23, 30))


почему он дает ошибку пишите называние interface если я написал уже (в чем проблема )
почему он дает ошибку  пишите называние interface если  я написал уже (в чем проблема )

#!/usr/bin/env python

import subprocess
import optparse

def get_arguments():
    parser = optparse.OptionParser()
    parser.add_option("-i", "--interface", dest="interface", help="Interface to change its MAC address")
    parser.add_option("-m", "--mac", dest="new_mac", help="New MAC address")
    (options, arguments) = parser.parse_args()
    if not options.interface:
        parser.error("[-] Please specify an interface, use --help more info ")
    elif options.new_mac:
        parser.error("[-] Please specify a new mac, use --help more info")
    return options

def change_mac(interface, new_mac):
    print("[+] Changing MAC address for " + interface + " to " + new_mac)
    subprocess.call(["ifconfig", interface, "down"])
    subprocess.call(["ifconfig", interface, "hw", "ether", new_mac])
    subprocess.call(["ifconfig", interface, "up"])

options = get_arguments()
change_mac(options.interface, options.new_mac)

terminal

 sudo python3 mac_changer.py -i eth0 -m 00:11:22:54:77:88

Usage: mac_changer.py [options]

mac_changer.py: error: [-] Please specify a new mac, use --help more info

if not options.interface:
    parser.error("[-] Please specify an interface, use --help more info ")
elif options.new_mac:
    parser.error("[-] Please specify a new mac, use --help more info")
return options

Вы сначала проверяете, что не указана опция
-i и выводите ошибку в этом случае, а потом проверяете, что указана опция
-m и выводите ошибку в этом случае. А проверять нужно, что она тоже не указана:

if not options.interface:
    parser.error("[-] Please specify an interface, use --help more info ")
elif not options.new_mac:
    #^^^ проверяем, что НЕ указана опция
    parser.error("[-] Please specify a new mac, use --help more info")
return options


Почему не работает ajax в django?
Форма:

<form class="form" action="{% url 'articles:send_comment' article.id %}" method="post">
                    {% csrf_token %}
                    <textarea id="text-comment" name="text" required="" placeholder="Напишите свой комментарий..."  cols="30" rows="10"></textarea>
                    <div class="button-form"><button class="btn-form" id="send-comment" type="submit">Отправить</button></div>
                </form>

Ajax:

<script>
        var token = '{{csrf_token}}';
        $('#send-comment').click(function(){
        $.ajax({
          url: 'send_comment/',
          type: "POST",
          dataType: "text",
          data: {
            'comment-text': $('#text-comment').val(),
          },
          headers: {
            "X-Requested-With": "XMLHttpRequest",
            "X-CSRFToken": token,
          },
          success: function(data){
            console.log(1);
          },
          error: function(error){
            console.log(1);
          }
        });
        });

    </script>

Views:

def send_comment(request, article_id):
    if request.method == 'POST':
        comment_text = request.POST['comment-text']
        article = get_object_or_404(Article, id=article_id)
        article.comment_set.create(comment_text=comment_text)
        return HttpResponse("Success!")
    else:
        return HttpResponse("Request method is not a POST")

Urls:

app_name = 'articles'

urlpatterns = [
        path('<int:article_id>/', views.detail, name='detail'),  # Страница с новостью
        path('<int:article_id>/send_comment', views.send_comment, name='send_comment')
    ]

Ошибка:

KeyError: 'comment-text'
 comment_text = request.POST['comment-text']

В этой строке.
Я пытался уже всё сделать даже отправлять через json, но там он присылался пустым. В консоли не выводится 1.

Нужно поменять путь на
path('send_comment', views.send_comment, name='send_comment')
И соответственно в ajax тоже


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

from bs4 import BeautifulSoup

price_html = """
<table cellspacing="0" cellpadding="0" border="1">
  <tbody>
    <tr class="even_row">
      <th><p>№ п/п</p></th>
      <th class="armor"><p>Название</p></th>
      <th class="price"><p>Цена</p><p>рублей</p></th>
    </tr>
    <tr class="odd_row">
      <td><p>1.</p></td>
      <td class="armor"><p>Щит</p></td>
      <td class="price"><p>375</p></td>
    </tr>
    <tr class="even_row">
      <td><p>2.</p></td>
      <td class="armor"><p>Шлем</p></td>
      <td class="price"><p>297</p></td>
    </tr>
    <tr class="odd_row">
      <td><p>3.</p></td>
      <td class="armor"><p>Кольчуга</p></td>
      <td class="price"><p>565</p></td>
    </tr>
    <tr class="even_row">
      <td><p>4.</p></td>
      <td class="armor"><p>Булава</p></td>
      <td class="price"><p>1992</p></td>
    </tr>
    <!-- Сюда может добавиться неизвестное количество элементов экипировки.
      Их тоже нужно учитывать при расчёте средней цены. -->
  </tbody>
</table>
"""

soup = BeautifulSoup(price_html, 'lxml')

result = soup.find_all('td', attrs={'class': 'price'})
length = len(result)
y = []
y = list(map(int, y))
for i in result:
    y.append(i.text)

# print(result)
# print('Средняя цена богатырских доспехов: ', result, 'рублей')

Нашел такое решение:
<code>
soup = BeautifulSoup(price_html, 'lxml')

result = soup.find_all('td', attrs={'class': 'price'})
length = len(result)
y = []
for i in result:
    y.append(i.text)

y = [int(item) for item in y]
final = sum(y)/length
# print(sum(y))
print('Средняя цена богатырских доспехов: ', final, 'рублей')
</code>


Проблема с Series и последующем нахождении минимума и т.д
Не понял как правильно это задание делать и сделал как трети классник через цикл, что не есть хорошо.
Как тут вообще надо было правильно делать?
<code>
'''
Для каждого года вычислите среднегодовую температуру и общее количество
осадков. Запишите результаты в объекты Series.
8.1. Какой год можно считать самым теплым? Какой самым холодным?
8.2. В какой год выпало больше всего осадков? В какой меньше всего?
'''

years = set(df['year'])

dates = []

for y in years:
    tempa = 0
    osadki = 0
    count = 0
    artas = df.loc[df['year']==y]
    for index,row in artas.iterrows():
        if row['year']==y:
            count = count +1
            tempa = tempa + row['average_t']
            osadki = osadki+row['rainfall']
    #dates = pd.concat([dates,pd.Series([y,tempa/count,osadki/count],index=['a', 'b', 'c'])])
    dates.append(pd.Series([y,tempa/count,osadki/count],dtype='float64'))
    #print([y,tempa/count,osadki/count,count])
    #print(dates)

#print(dates)

tempMax = 0
tempMin = 1000
osadkiMax = 0
osadkiMin = 1000

for i in dates:
    if i[1]>tempMax:
        tempMax=i[1]
    #print(str(i[1])+' '+str(i[2]))
    if i[1]<tempMin:
        tempMin=i[1]

    if i[2]>osadkiMax:
        osadkiMax=i[2]

    if i[2]<osadkiMin:
        osadkiMin=i[2]

#print(tempMax)
#print(tempMin)
#print(osadkiMax)
#print(osadkiMin)

for i in dates:
    if i[1]==tempMax:
        print('Самый тёплый год это '+str(i[0]))
    if i[1]==tempMin:
        print('Самый холодный год это '+str(i[0]))
    if i[2]==osadkiMax:
        print('Самый дождливый год это '+str(i[0]))
    if i[2]==osadkiMin:
        print('Самый сухой год это '+str(i[0]))

</code>

Посмотрел датафрейм. Как я и говорил, нужно использовать
groupby. Например:

g = df[['year','average_t','rainfall']].groupby('year')
avg_t = g.mean()['average_t']
sum_rain = g.sum()['rainfall']
print(avg_t)
print(sum_rain)
print(pd.DataFrame(avg_t).sort_values('average_t').iloc[0])


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

def wealth_cust(accounts):
    largest_acc = 0
    for account in accounts:
        current_account = sum(account)
        if current_account > largest_acc:
            largest_acc = current_account

    return largest_acc

Вроде всё должно так работать, но LeetCode возвращает ошибку

NameError: global name 'Solution' is not defined
    ret = Solution().maximumWealth(param_1)
Line 29 in _driver (Solution.py)
    _driver()
Line 39 in <module> (Solution.py)

Впервые столкнулся с LeetCode, возможно пока что просто не совсем понимаю как с ним работать.

LeetСode даёт прототип функции, и нужно использовать именно его, а не свою функцию. Система проверки вызывает
Solution.maximumWealth с разными аргументами (я взял то, что нашлось на LC c таким именем, не факт, что вы имели в виду именно эту задачу)

class Solution:
    def maximumWealth(self, accounts: List[List[int]]) -> int:
        здесь пишете тело метода


Почему-то бот не считает my_salary? что я делаю не так
Ввожу по очереди, имя, 30, 30 и все. Код остановился. Ошибка NameError: name 'month' is not defined. Пробовал много разных вариантов, ошибки были в том числе с salary. также пишет что не определена. В одном из вариантов написания кода, бот запрашивал все данные и просто останавливался
<code>
import telebot

bot = telebot.TeleBot('5491821896:AAGlZ3lbVi',)

@bot.message_handler(commands=['start'])
def send_welcome(message):
    msg = bot.reply_to(message, """\
Hi there, I am Example bot.
What's your name?
""")
    bot.register_next_step_handler(msg, month_get)

def month_get(message):
    month = bot.send_message(message.chat.id, 'write 30')
    bot.register_next_step_handler(month, get2)

def get2(message):
    work = bot.send_message(message.chat.id, 'write 30')
    bot.register_next_step_handler(work, my_salary, work, month)

def my_salary (work, month):
    salary = 19000 / month * work
    bot.send_message(message.chat.id, f'your salary is {salary}')

bot.polling()
</code>

Ты что-то странное накодил
<code>
@bot.message_handler(commands=['start'])
def send_welcome(message):
    # не обязательно делать новую переменную месседж,
    # register_next_step_handler наплевать какой месседж ты ему дашь
    # и что за странный перенос строки?
    # msg = bot.reply_to(message, """\
    # Hi there, I am Example bot.
    # What's your name?
    # """)
    ## делай так
    bot.reply_to(message, "Hi there, I am Example bot.\n"
                          "What's your name?")
    # сюда кидай просто message
    # и назови функцию более понятно, ты же требуешь имя а не месяц
    bot.register_next_step_handler(message, get_name)

def get_name(message):
    bot.send_message(message.chat.id, 'write month')
    # ты наверное забыл имя
    bot.register_next_step_handler(message, get_month, message.text)

# проверка является ли чилсом float
def is_digit(string: str):
    try:
        float(string)
        return True
    except ValueError:
        return False

# доп аргумент name это message.text предыдущей функции
def get_month(message, name):
    if is_digit(message.text):
        bot.send_message(message.chat.id, 'write work')
        bot.register_next_step_handler(message, my_salary, name, float(message.text))
    else:
        bot.send_message(message.chat.id, 'write month')
        bot.register_next_step_handler(message, get_month, name)

def my_salary(message, name, month):
    if is_digit(message.text):
        work = float(message.text)
        salary = 19000 / month * work
        bot.send_message(message.chat.id, f'{name} your salary is {salary}')
    else:
        bot.send_message(message.chat.id, 'write work')
        bot.register_next_step_handler(message, my_salary, name, month)
</code>


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

objects = [1, 2, 3, 4, 5]
objects2 = objects

и я хочу чтобы второй не ссылался на первый

print(objects, objects2)
# вывод: [1, 2, 3, 4, 5] [1, 2, 3, 4, 5]

#изменение
objects2.remove(3)
print(objects, objects2)
# вывод:[1, 2, 4, 5] [1, 2, 4, 5]

#ид
print(id(objects), id(objects2))
# вывод: 1416642614272 1416642614272

Используйте
.copy()

objects2 = objects.copy()

Если объект вложенный/составной и нужна глубокая копия, то deepcopy


Функция в Python не вызывается
Всем здравствуйте! У меня не вызывается функция
attack_zone(). В чём моя ошибка?

from tkinter import *
from tkinter import messagebox
from threading import Thread
from playsound import playsound

kill_boss=False
robot_health = 100

def attack():
    global robot_health,kill_boss
    if robot_health==0:
        kill_boss=True
    else:
        robot_health-=1

kill = False

fight = Tk()
fight['bg']='black'
fight.geometry("400x400")
fight.title('Битва')
w = 500
h=500
Canvas = Canvas(bg='black')
Canvas.pack()

def kot(a):
    messagebox.showinfo('Заголовок',a)

global a1
global a2
global b1
global b2
global c1
global c2
global d1
global d2

a1= 15
a2=15
d1=25
d2=25
c1=a1
c2=d2
b1=d1
b2=d1

player = Canvas.create_rectangle(a1,a2,d1,d2,fill='red')

Button(fight,bg='red',comand=attack()).pack()

def down():
    global a1
    global a2
    global b1
    global b2
    global c1
    global c2
    global d1
    global d2
    Canvas.move(player,0,10)
    d2=+1
    c2=+1

def up():
    global a1
    global a2
    global b1
    global b2
    global c1
    global c2
    global d1
    global d2
    Canvas.move(player,0,-10)
    d2=-10
    c2-=10

def left():
    global a1
    global a2
    global b1
    global b2
    global c1
    global c2
    global d1
    global d2
    Canvas.move(player,-10,0)
    c1=-10
    d1-=10

def right():
    global a1
    global a2
    global b1
    global b2
    global c1
    global c2
    global d1
    global d2
    Canvas.move(player,10,0)
    c1=+10
    d1=+10

global x1
global x2
global y1
global y2

x1=0
x2=10
y1=1000
y2=100

def luch():
    Canvas.create_rectangle(x1,x2,y1,y2,fill='white')

luch()

photo = PhotoImage(file = "1 враг.gif")
label = Label(image = photo).pack()
fight.mainloop()

w.bind("<Up>", lambda event:up)
w.bind("<Left>", lambda event:left)
w.bind("<Right>", lambda event:right)
w.bind("<Down>", lambda event:down)

def attack_zone():
    kot('kjhkjkl')
    global a1
    global a2
    global b1
    global b2
    global c1
    global c2
    global d1
    global d2
    global x1
    global x2
    global y1
    global y2
    kot('kjhkjkl')
    gorizontal = False
    vertical = False
    if a2<x2 and d2>y2:
        gorizontal = True
    if a1<x1 and d1>y1:
        vertical = True
    if gorizontal and vertical:
        kot("game_over")

attack_zone()

#НЕ ПЛАГИАТИТЬ КОД

Думаю так заработает. Переставил mainloop в конец. Функции пока окно не закрыто после mainloop не будут работать
<code>
from tkinter import messagebox
from threading import Thread
from playsound import playsound
kill_boss=False
robot_health = 100

def attack():
    global robot_health,kill_boss
    if robot_health==0:
        kill_boss=True
    else:
        robot_health-=1

kill = False

fight = Tk()
fight['bg']='black'
fight.geometry("400x400")
fight.title('Битва')
w = 500
h=500
Canvas = Canvas(bg='black')
Canvas.pack()
def kot(a):
    messagebox.showinfo('Заголовок',a)
global a1
global a2
global b1
global b2
global c1
global c2
global d1
global d2
a1= 15
a2=15
d1=25
d2=25
c1=a1
c2=d2
b1=d1
b2=d1

player = Canvas.create_rectangle(a1,a2,d1,d2,fill='red')

Button(fight,bg='red',comand=attack()).pack()

def down():
    global a1
    global a2
    global b1
    global b2
    global c1
    global c2
    global d1
    global d2
    Canvas.move(player,0,10)
    d2=+1
    c2=+1
def up():
    global a1
    global a2
    global b1
    global b2
    global c1
    global c2
    global d1
    global d2
    Canvas.move(player,0,-10)
    d2=-10
    c2-=10
def left():
    global a1
    global a2
    global b1
    global b2
    global c1
    global c2
    global d1
    global d2
    Canvas.move(player,-10,0)
    c1=-10
    d1-=10
def right():
    global a1
    global a2
    global b1
    global b2
    global c1
    global c2
    global d1
    global d2
    Canvas.move(player,10,0)
    c1=+10
    d1=+10
global x1
global x2
global y1
global y2
x1=0
x2=10
y1=1000
y2=100
def luch():
    Canvas.create_rectangle(x1,x2,y1,y2,fill='white')

luch()

photo = PhotoImage(file = "1 враг.gif")
label = Label(image = photo).pack()

w.bind("<Up>", lambda event:up)
w.bind("<Left>", lambda event:left)
w.bind("<Right>", lambda event:right)
w.bind("<Down>", lambda event:down)

def attack_zone():
    kot('kjhkjkl')
    global a1
    global a2
    global b1
    global b2
    global c1fight.mainloop()fight.mainloop()
    global c2
    global d1
    global d2
    global x1
    global x2
    global y1
    global y2
    kot('kjhkjkl')
    gorizontal = False
    vertical = False
    if a2<x2 and d2>y2:
        gorizontal = True
    if a1<x1 and d1>y1:
        vertical = True
    if gorizontal and vertical:
        kot("game_over")

attack_zone()
fight.mainloop()
#НЕ ПЛАГИАТИТЬ КОД
</code>


Добавить скобки в массиве
Имеется функция:

def ts_key_bot(id):
        data = json.load(open('data_bot.json', 'r', encoding = 'utf=8'))
        for i in data["users"]["data"]:
            if i["id"] == int(id):
                c = []
                for b in i["user"]["user"]:
                    c.append([(str(b["num1"]) + " | " + str(b["num2"]) + " " + str(b["num3"]))])
                    c[-1].append("белый")
                print(c)

После выполнения получаем:

[['1 | test1 test2', 'белый'], ['2 | test1 test2', 'белый']]

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

[[('1 | test1 test2', 'белый')], [('2 | test1 test2', 'белый')]]

у вас список - превратите его в кортеж и заверните в список
<code>
arr = ['123', 456]

res = [tuple(arr)]
</code>


Как проверить является ли строка числом int/float
<code>
def check_flight_hours (message: types.Message):
    #если не число то повторный ввод
    if message.text.isdigit():
        night_hours = bot.send_message(message.chat.id, "Введите количество ночных часов:  " )
        bot.register_next_step_handler(night_hours, check_night_hours)

    # проверяем ввел ли число юзер
    else:
        flight_hours = bot.send_message(message.chat.id, "Введите количество летных часов:  ")
        bot.register_next_step_handler(flight_hours, check_flight_hours)
</code>

К примеру так
<code>
def is_number(stroka: str):
    try:
        float(stroka)
        return True
    except ValueError:
        return False

def check_flight_hours (message: types.Message):
    # если не число то повторный ввод
    if is_number(message.text):
        night_hours = bot.send_message(message.chat.id, "Введите количество ночных часов:  " )
        bot.register_next_step_handler(night_hours, check_night_hours)

    # проверяем ввел ли число юзер
    else:
        flight_hours = bot.send_message(message.chat.id, "Введите количество летных часов:  ")
        bot.register_next_step_handler(flight_hours, check_flight_hours)
</code>


Как сделать функцию, которая будет искать значения и красиво их "упаковывать"
Имеется json файл. Пример данных в нем:

 {
   "users": {
      "count": 3,
      "data": [
         {
            "nick": "123",
            "id": 566010585,
            "num": 1,
            "num_sheets": 2,
            "ts": {
               "count": 2,
               "ts1": {
                  "mark": "ЗАЗ",
                  "model": "968 «Запорожец»",
                  "type": "retro",
                  "number": "Н827СР78"
               },
               "ts2": {
                  "mark": "ГАЗ",
                  "model": "3110 «Волга»",
                  "type": "standart",
                  "number": "Т044ОК77"
               }
            }
         },

И имеется функция, которая ищет совпадение по ключу 'id' в это файле:

 def check_ts(id):
    data = json.load(open('data_bot.json', 'r', encoding = 'utf=8'))
    for i in data["users"]["data"]:
        if i["id"] == int(id):

Я новичок в программировании и не сильно разбираюсь в словарях и списках. Хочу усовершенствовать эту функцию, что бы она упаковывала данные из ключа 'ts' в такое сообщение:

Количество - 2
ЗАЗ 968 «Запорожец» | Н827СР78 | retro
ГАЗ 3110 «Волга» | Т044ОК77 | standart

Подскажите, как это можно было бы сделать? (Количество может быть до 6 единиц)

делайте в лоб - идёте по полям и нужные объединяете в строку

res = []
for obj in data["users"]["data"]:
    for key, elem in obj["ts"].items():
        if key[:2] == "ts": # нам нужны только структуры вида "ts***"
            res.append(' | '.join((elem['model'], str(elem['number']), elem['type'])))

или если вы любитель одной строки:

res = [' | '.join((elem['model'], str(elem['number']), elem['type'])) for obj in data["users"]["data"] for key, elem in obj["ts"].items() if key[:2] == "ts"]


Разложить целое число на простые множители. Вывести на экран все простые множители (в порядке возрастания) и их порядки. Но выдает то же самое число [дубликат]

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

Разложить число на простые множители

                                (5 ответов)

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

<code>
N=int(input('12'))
F = N
for i in range(2, F):
    if F%i==0:
        d=0
        for B in range(2, i):
            if i % B ==0:
                d+= 1
        if d ==0:
            por =0
            while N % i ==0:
                por +=1
                N=N//i
            print(i,por)
</code>

Александр, добрый день.
попробуйте вот так:
<code>
N=int(14)
F = N
for i in range(2, F):
    if F%i==0:
        d=0
        for B in range(2, i):
            if i % B ==0:
                d+= 1
        if d == 0:
            print(i)
</code>
небольшой совет, т.к. в питоне важны отступы, то код в вопросе нужно писать с отстутпами.


ChromeDriverManager в фоновом режиме
<code>
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

browser = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
</code>
Возможно ли сюда как то передать  options.add_argument("--headless") для фонового запуска. Если делать по старинки options = webdriver.ChromeOptions() выскакивает ошибка DeprecationWarning: executable_path has been deprecated, please pass in a Service object
browser = webdriver.Chrome( Может у кого есть готовое решение

Исходя из вашего вопроса, у вас не получается использовать опции с библиотекой
from webdriver_manager.chrome import ChromeDriverManager.
Если это так, то вот решение:

options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)


Python: Внесение списка в список JSON
Имею такой
json

{
    "chats_contex": [
        {
            "60": [
                {
                    "can_use_admins": "True",
                    "kick_on_link": "False"
                }
            ]
        }
    ]
}

Как добавить в
chats_contex новый список (название не имеет значение), чтобы получилось так:

{
    "chats_contex": [
        {
            "60": [
                {
                    "can_use_admins": True,
                    "kick_on_link": False
                }
            ],
            "example": [
                {
                    "can_use_admins": True,
                    "kick_on_link": False
                }
            ]
        }
    ]
}

Прошу ответить на вопрос с кодом. Заранее спасибо!

Фигурные скобки - это словари, квадратные скобки - это списки. К словарям обращаемся по ключу, к спискам - по номеру элемента. Таким образом, получается:
<code>
data = {
    "chats_contex": [
        {
            "60": [
                {
                    "can_use_admins": "True",
                    "kick_on_link": "False"
                }
            ]
        }
    ]
}

data["chats_contex"][0]["example"] = \
            [
                {
                    "can_use_admins": True,
                    "kick_on_link": False
                }
            ]
</code>


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

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ,12]

Нужно получить три таких:

a1 = [1, 4, 7, 10]
a2 = [2, 5, 8, 11]
a3 = [3, 6, 9, 12]

Как это можно реализовать?


Не могу решить задание
Я участвую в школьной олимпиаде, и совсем не могу решить последнее задание.
Вот условие задачи:
Чтобы легче передавать информацию устно, они называют последовательность символов A, G, T, C «читаемой», если рядом ни с одной согласной нет другой согласной, а рядом ни с одной гласной — другой гласной, и предпочитают работать только с такими последовательностями.
Дано число N. Сколько различных читаемых последовательностей длины N существует? Так как ответ может быть очень большим, выведите остаток от его деления на 10^9 + 7.
Но также есть ограничение на время исполнения(1 секунда)
вот одна из моих попыток написать что-то
<code>
import string
import random, re
N=10
words= [random.choice(string.ascii_uppercase) for i in range(N)]
st_r = ""
word=(str_r.join(words))
glasniye = len(re.findall(r'[AEIOUY]', word))
soglasniye = len(re.findall(r'[BCDFGHJKLMNPQRSTVWXYZ]', word))
</code>
До этой олимпиады никогда не писал на питоне.

Давайте выведем формулу для чётной длины.
Если строка начинается с
"A", то она имеет вид
A*A*A*A*, где вместо звёздочек стоят любые из символов
"G","C","T".
При длине
N в строке
N//2 мест для этих согласных.
Для каждого места есть три варианта, итого таких строк
3**N//2.
Аналогично для случая, когда строка начинается с согласной
*A*A*A*A. Итого
2*3**N//2 вариантов.
Осталось сделать подобные вычисления для нечётной длины - строки вида
А*A*A*A и
*A*A*A*


Сравнения почтовых адресов
Имеется база данных эл. почт (txt формат). Пользователь отправляет свой адрес в функцию (например [email protected]). В базе содерится похожий (но не идентичный) ящик, с именем [email protected]. Пользовательского ящика в базе нет! Программа должна вернуть false, т.к. ящики разные. Я написал простую функцию для проверки вхождения:
<code>
def check(email):
    with open("emails.txt", "r") as f:
        emails = f.read()
        if email in emails:
            return True
        else:
            return False
</code>
Проблема в том, что хотя адрес на совпадает, программа будет возвращать значение True, если адрес имя ящика совпадет с концовкой имени другого. Как можно этого избежать?

Предполагаю, что файл emails имеет вид:

[email protected]:Вася
[email protected]:Петя

тогда проверка будет примерно так, кстати, она соответсвует Вашему коду (без принтов, конечно)

def chek(email):
    with open("emails.txt") as f:
        return email in (s.split(':')[0] for s in f)


Ускорение кода Python с помощью NumPy
Всем привет! Очень медленно работает программа с этими 4 циклами. Можно ли как-то ускорить ее используя модуль NumPy?
(1 ≤ N,M,D ≤ 1000) (1 ≤ A ≤ N, 1 ≤ B ≤ M).
В игре «Heroes of Wizardry and Sorcery» игровой мир представляет собой таблицу N × M с квадратными полями, длина сторон которых равна 1. Поля обозначаются (i,j), где i — номер строки, а j — номер столбца. Каждому полю соответствует магическая защита Di,j.
Ваш замок находится на поле (A,B). Вы можете построить защитную ограду в форме прямоугольника, стороны которого проходят по линиям таблицы, при этом замок должен находиться внутри ограды. Пусть верхнее левое поле забора (p,q), правое нижнее (r,s), а длина забора равна l. Тогда защитная сила забора равна Dp,q + Dr,s + l.
Требуется построить забор с максимальной защитной силой.
Система оценки
Всего в задаче 20 тестов (не считая примеров). Каждый тест оценивается в 10 баллов.
В 15% тестов N, M ≤ 50, в 25% тестов Di,j ≤ 50, в 35% тестов N, M ≤ 400.
Пояснения к примерам
В первом тесте из примера наиболее выгодно выбрать (p, q) и (r, s) равные (1, 1) и (3, 3), тогда получим защитную силу забора 8 + 7 + 12 = 27.
Во втором примере можно выбрать левое верхнее поле забора совпадающим с правым нижним, а именно поле замка (2, 1), тогда защитная сила забора будет равна 9 + 9 + 4 = 22
В третьем примере хочется по аналогии со вторым взять поле со значением 50, чтобы получить защитную силу забора 50 + 50 + 4 = 104, однако, в таком случае замок окажется снаружи, что противоречит условию, соответственно, наибольшая возможная защитная сила забора будет 1 + 50 + 6 = 57.
<code>

n, m, a, b = map(int, input().split())
arr = [list(map(int, input().split())) for t in range(n)]
res = 0
for i in range(a):
    for j in range(b):
        for i2 in range(a - 1,n):
            for j2 in range(b - 1, m):
                L = np.multiply(2,(np.add(np.subtract(i2, i), 1))) + np.multiply(2,(np.add(np.subtract(j2,j),1)))
                D = arr[i][j] + arr[i2][j2] + L
                res = max(res, D)

print(res)
</code>

Сложность этого полного перебора -
O(N^2*M^2), что для размеров 1000 даёт 10^12 циклов, время неприемлемое.
Однако задачу можно решить за
O(NM).
Пройдём по матрице, добавляя к каждому
D[i][j] из  правого нижнего сегмента удвоенную сумму индексов
Fij=2*(i+j), и отнимая соответствующую величину для левого верхнего сегмента. Заметим, что добавки выглядят так:

0  2* 4  6
2  4  6  8
4  6  8  10
6  8  10 12*

И их разность для двух ячеек как раз равна периметру прямоугольника (длине забора). Например, для помеченных
12-2=10 = 2*3+2*2
При проходе по матрице просто запоминаем максимальные значения
Dij-Fij и
Dij+Fij соответственно левее-выше и правее-ниже поля
A, B, и лучший результат - сумма этих максимумов плюс 4 (т.к. у вас от точки 1,1 до точки 3,3 периметр считается 12, а не 8).
Примерно так:

maxl, maxr = -3000, -1
for i in range(a):
    for j in range(b):
        maxl = max(maxl, arr[i][j] - 2 * (i + j))

for i in range(a-1, n):
    for j in range(b-1, m):
        maxr = max(maxr, arr[i][j] + 2 * (i + j))

print(maxl + maxr + 4)


Как разделить переменную на отдельные части
Допустим у меня есть переменная, которая обозначает цвет
И как мне отделить их на три разные, по типу R, G, B
<code>
GG = 100,20,230
R =
G =
B =
</code>

Так как
GG это
tuple:

R = GG[0]
G = GG[1]
B = GG[2]


Заполнение массива в соответствии с условиями

Есть массив x*y (строка, столбец)
Данный массив заполняется циклом отдельно по одной ячейке в строке значениями 1 или 0.
Условия:

Значения заполняются рандомно, но в итоге все должно заполниться 1.
Если по х (в строке) все 0, берется первое значение. Если уже были попытки заполнения, то берется ячейка, с самой первой попыткой заполнения.
Переход к заполнению ячеек в новой строке происходит, только если в
предыдущей строке есть не менее 2-х ячеек со значением 1.
Ячейки новой строки заполняются только для ячеек, у которых в
предыдущей строке стоит 1, и это не может быть столбец, куда
вносилась 1 предыдущей итерации.

Подскажите какой использовать алгоритм, или к каким алгоритмам присмотреться. Просто не хватает немного знаний в этой области.
Реализация будет на python3

В принципе задача решается если к заполняемым данным добавить временные метки, например: (1, 29.09.2022_12:20)
Действие алгоритма на примере: есть матрица 3*3, все значения none

none,none,none
none,none,none
none,none,none

Запускаем цикл. Каждая итерация цикла должна проходить по новой строке, но у нас условие, переход на новую строку, как только в строке появятся две единицы, иначе мы проходим по всем none, а потом и по всем 0, пока не будет выполнено наше условие, получаем

1, 0, 1
none,none,none
none,none,none

Теперь проходим ко второй строчке, но только в первый столбец, т.к. там мы раньше всех получили 1. Следующей итерацией переходим в первую строку в столбец 2(в 3 не переходим, т.к. не выполняется условие, 2 единицы), и там тоже получаем единицу, получаем:

1, 1, 1
1, none, none
none,none,none

Теперь переходим ко второй строчке в столбец 3, т.к. там в предыдущей ячейке получили раьше всех единицу. Если получаем там едицицу, то идём к третей строке столбец один. И каждая следующая итеррация прыгает между этими строками. Как только заполнится вторая строка, цикл работает между оставшимися ячейками третьей строки.
Это упрощенная модель, по факту матрица будет больше, и данные будут отбрасываться назад (если после единицы мы получаем 0, то ячейка с единицей этого столбца получает тоже ноль)


Не знаю как сделать так чтобы бот сохранял в файл txt определенные сообщения
Хочу сделать так чтобы бот телеграмм сохранял определенные сообщения в файл txt.К примеру участник группы написал свою дату рождения и надо чтобы это автомотически сохранилось в файл и потом я ввёл команду и из этого файла взялись дни рождения и желательно написались в чате. Сам как сделать догадаться не могу. Прошу момочь если это возможно.

Я бы сделал вот как:
Скажем, есть команда /birthday, человек вводит свой ДР в формате: день/месяц, и это сохраняется в txt вместе с именем пользователя.
Код:
<code>
@dp.message_handler(commands=['birthday']) #Добавление дней рождений (/birthday {дата})
async def birthday(message: types.Message):
    arg=message.get_args()
    with open('birthday.txt', 'a+') as file: #добавляем в файл в формате: {Имя} | {дата}
        file.write(f'{message.from_user.first_name} | {arg}') # (имя берется из телеграма)
    await message.answer('Готово!')

@dp.message_handler(commands=['get']) #Выгрузка списка дней рождений (/get)
async def getbd(message: types.Message):
    await bot.send_document(types.InputFile('birthday.txt'))
</code>


Поставить временной лимит на итерацию в цикле while (Python)
Мой скрипт выполняет некую работу в цикле
while. Я бы хотел прервать итерацию и начать заново, в случае превышения временного лимита. Как это можно сделать?

while True:
    (work time > 15 sec) -> continue

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

import time
import multiprocessing

TIMEOUT = 6 # время которое есть у жертвы чтобы скрыться
# TIMEOUT = 5 # за это время жертва может быть убита

def function(arg1, arg2):
    time.sleep(5) # тут наша функция жертва что-то делает
    print(f' {arg1} {arg2} ')   # все сделано, она в безопасности за границей

def killer(function):
    # даем жерве задание и возможность скрыться
    p = multiprocessing.Process(target=function, args=('все', 'хорошо'))
    p.start()
    time.sleep(TIMEOUT) # киллер ждет определенное время
    if p.is_alive():    # если жертва еще что-то делает
      p.terminate()     # киллер ее убивает
      print(' жертва убита ')   # и делает фото в качестве доказательтва

if __name__ == "__main__":
    # находим киллера и даем ему функцию жертву которую он уничтожит
    # после TIMEOUT

    # это 2 основные строчки для запуска их можно запускать столько раз сколько нужно
    # они не блокируют программу и код ниже может исполняться
    pk = multiprocessing.Process(target=killer, args=([function]))
    pk.start() # отправляем киллера

    # занимаемся повседневными делами
    i = 0
    while(pk.is_alive()): # пока киллер не убил жертву или не упустил ее
      i += 1
      time.sleep(1)
      print(i)

При TIMEOUT = 5:

1
2
3
4
5
 жертва убита
6

При TIMEOUT = 6:

1
2
3
4
5
 все хорошо
6
7


Не могу выполнить задание
Условие: есть случайное слово длинной до 10^5. Мне нужно найти 2 одинаковых символа(особую подстроку) в этом слове, и посчитать сколько символов между этими двумя
Но если в строке несколько разных повторяющихся символов, например
string="ETERNITY", то мне нужно найти самую длинную подстроку
Но также есть ограничение на выполнение кода - 1 секунда
Вот сам текст задания: Входные данные содержат одну строку, состоящую из заглавных латинских букв от 'A' до 'Z'. Строка не пустая и имеет длину, не превосходящую 10^5.
Выведите одно число - длину самой длинной подстроки, являющейся особой строкой
Вот одна из моих попыток написать это

text = "ETERNITY"
arr = []
for sym in text:
    arr.append(sym)
def ix(arr):
    n=len(arr)
    res=[]
    for i in range(n-1):
        for j in range(i+1,n):
            if arr[i]==arr[j]:
                res.append((i,j))
    return res
print(ix(arr))

Линейный алгоритм. Собираем позиции одинаковых символов в множества. Из всех множеств выбираем то у которого "размах" максимальный:

text = "ETERNITY"

d = {}
for i, c in enumerate(text):
    d.setdefault(c, set()).add(i)
print(1 + max(max(v) - min(v) for v in d.values()))

P.S. Не самое оптимальное решение (храним множества, а можно было бы хранить только минимум и максимум), но в ограничения укладывается и мало кода.
Без множеств (хранятся только первая и последняя позиции символа):

text = "ETERNITY"

d = {}
for i, c in enumerate(text):
    d.setdefault(c, [i, i])[1] = i
print(1 + max(v[1] - v[0] for v in d.values()))

Можно хранить только первые позиции символов и обновлять максимум на лету:

text = "ETERNITY"

max_dist = 1
first = {}
for i in range(len(text)):
    c = text[i]
    if c in first:
        dist = i - first[c]
        if dist > max_dist:
            max_dist = dist
    else:
        first[c] = i
print(1 + max_dist)


Как посчитать разницу двух дат на питоне? [закрыт]

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

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

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

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

Конечно легко это сделать, импортируя календарь используя тайм сплит и др.
А как это сделать без всяких импортировок и вводов?
То есть:

Формат входных данных
Даны два дня в формате: день, месяц и год. Года в обеих датах не превышают 105 и гарантируется, что первый день строго раньше второго дня.
Формат результата
Выведите количество прошедших лет.
Например:
ввод
1 9 2011
10 9 2012
вывод
1

и др?

Выведите количество прошедших лет.

если вопрос стоит именно так, то задача упрощается - просто вычитаем из одного года другой, ну и уменьшаем на единицу если год не полный:
<code>
d1,m1,y1 = map(int,input().split())
d2,m2,y2 = map(int,input().split())

res = y2-y1-(m1>m2 or m1==m2 and d1>d2)
</code>


Помогите понять формулировку
Я столкнулся с задачей где вообще не понимаю формулировку. Вот оно:

Структурные лингвисты называют особыми строки, начинающиеся и заканчивающиеся одним и тем же символом. Вам дана строка, состоящая из заглавных латинских букв, ваша задача - определить самую длинную её подстроку, являющуюся особой строкой, и вывести её длину.
Напоминаем, что подстрока определяется как строка, составленная из элементов строки, начиная с i-го и заканчивая j-м. Если i<j, то подстрока пустая. Если i==j, подстрока состоит из одного символа. Если i совпадает с началом строки, а j - с концом, то подстрока совпадает с самой строкой.

Буду рад помощи с объяснением.

Примеры особых строк (из заглавных латинских букв):

ARIA
ROTATOR
DEFINED
XABCDEFGX

Примеры строк, которые не являются особыми, но содержат особую подстроку:

ZENARIAH
UNROTATOR (содержит тоже другие особые подстроки, напр. UNROTATOR)
PREDEFINEDTERM (тоже содержит и другие особые строки)
YZXABCDEFGXKLM

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

для ZENARIAH:
ARIA
для UNROTATOR:
ROTATOR
для PREDEFINEDTERM:
REDEFINEDTER
для YZXABCDEFGXKLM:
XABCDEFGX

Как в Питоне найти такую подстроку?
Подстрока данной строки — начиная с i-го и заканчивая j-м символом — в Питоне записывается так:

original[i:j+1]

Один метод состоит в проверке всех таких подстрок, т.е. для всех пар
(i, j) для
i <= j, в диапазоне от
(0, 0) до
(длина_строки - 1, длина_строки - 1).
Такая подстрока является особой, когда
original[i] == original[j].


Практика ведения историчных таблиц в web приложении [закрыт]

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

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

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

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

Всем привет!
Разрабатываю web-приложения на Django. Заказчик хочет вести историю изменения таблиц в отдельных таблицах с постфиксом _HIST.
Допустим есть таблица CARS с полями CAR_ID, CAR_NAME. Допустим в ней была запись:

CAR_ID = 1, CAR_NAME = 'BMW'

. На запись сделали DELETE where CAR_ID = 1. И в _HIST должна появиться запись:

CAR_ID = 1, CAR_NAME = 'BMW', EFF_FROM_DT = 1900-01-01, EFF_TO_DT =
current_date

.
Планирую реализовать это через триггеры Postgres.
Вопрос: Раньше в приложениях не видел практики ведения таких таблиц, может есть какие-то глобальные причины использования такого подхода?

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


Какое добавить условие, чтобы код работал?

from itertools import product

counter = 0

for i in product("АЛЕКСЙ", repeat = 6):
    if i.count("Й") <= 1 and i[0] != "Й" and i[-1] != "Й" and i.index("Й") != i.index("А") + 1 and i.index("Й") != i.index("А") - 1:
        counter += 1
print(counter)

Ошибка

Traceback (most recent call last):
  File "D:\PyProjects\main.py", line 6, in <module>
    if i.count("Й") <= 1 and i[0] != "Й" and i[-1] != "Й" and i.index("Й") != i.index("А") + 1 and i.index("Й") != i.index("А") - 1:
ValueError: tuple.index(x): x not in tuple

Я понимаю, что делает эта ошибка, но как прописать так, чтобы оно работало, я не знаю.

Чтобы избежать данной ошибки, можно проверить наличие искомых символов в комбинации на каждой итерации:

counter = 0
for i in product("АЛЕКСЙ", repeat=6):
    if ({'А', 'Й'}.issubset(i) and
        i.count("Й") <= 1 and i[0] != "Й" and i[-1] != "Й" and i.index("Й") != i.index("А") + 1 and i.index("Й") != i.index("А") - 1):
            counter += 1
print(counter)

Либо обработав ошибку с помощью
try/except:

counter = 0
for i in product("АЛЕКСЙ", repeat=6):
    try:
        if i.count("Й") <= 1 and i[0] != "Й" and i[-1] != "Й" and i.index("Й") != i.index("А") + 1 and i.index("Й") != i.index("А") - 1:
            counter += 1
    except:
        pass
print(counter)

Результат:

5083


Как обратиться к inline кнопкам которые находятся в функции
У меня есть функция в которой созданы 2 кнопки.

def buy_menu(is_url=True, url='', bill=''):
    qiwi_menu = InlineKeyboardMarkup(row_width=2)
    if is_url:
        btn_url_qiwi = InlineKeyboardButton(text="Ссылка на оплату", url=url)
        qiwi_menu.insert(btn_url_qiwi)

    btn_check_qiwi_ = InlineKeyboardButton(text="какой-то текст", callback_data="check_" + bill)
    qiwi_menu.insert(btn_check_qiwi_)
    return qiwi_menu

Как мне отловить нажатие этих кнопок в коде?
Я знаю как работать с кнопками вне функции (то бишь кнопка просто создана и находится вне функции)
Допустим если инлайн кнопка создана не в функции, ее нажатие можно отследить, например так:
Так создана кнопка:

btn_pay = InlineKeyboardButton(text='=какой-то текст', callback_data='pay')

Так я отслеживаю ее нажатие:

@dp.callback_query_handler(lambda c: c.data == 'pay')
async def process_callback_button_pay(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)

В общем сейчас я не понимаю как сделать тоже самое, но для инлайн кнопок которые находятся в def
Если что плохо объяснил/написал спрашивайте. Я только учусь так что я гриб на данном этапе
Использую aiogram

Приветик! Я так понимаю, нужно проверить статус чека? Я бы сделал отдельный хендлер и в нем проверял бы статус чека.
Как-то так:

    from pyqiwip2p import QiwiP2P
    p2p = QiwiP2P(auth_key='ТОКЕН КИВИ')

    def buy_menu(url:str, bill_id:str) -> types.InlineKeyboardMarkup:
        qiwi_menu = InlineKeyboardMarkup(row_width=2)
        if url:
            btn_url_qiwi = InlineKeyboardButton(text="Ссылка на оплату", url=url)
            qiwi_menu.insert(btn_url_qiwi)

        btn_check_qiwi_ = InlineKeyboardButton(text="какой-то текст", callback_data="check_" + bill_id)
        qiwi_menu.insert(btn_check_qiwi_)
        return qiwi_menu

    @dp.callback_query_handler(text_startswith='check_')
    async def checkpayment(call: types.CallbackQuery):
        bill_id=call.data.split('_')[1] #БЕРЕМ ID ЧЕКА
        bill=p2p.check(bill_id)
        if bill.status == 'PAID':
            billinfo=int(float(bill.amount))
        else:
            billinfo=False

        if billinfo == False:
            await call.answer('Оплата еще не получена!', True)
        else:
            await bot.send_message(call.message.chat.id, 'Мы получили оплату')
            #делаем действие

Решение рассчитано на:
aiogram+
pyqiwip2p
Данные для
buy_menu можно создать так:

    bill=p2p.bill(amount='цена', lifetime='жизнь ссылки', comment='коммент')
    keyboard=buy_menu(bill.pay_url, bill.bill_id) #цена и жизнь - числа


Почему ошибка в sql запросе sqllite3
<code>
def users_exist(self, user_id):
        with self.connection:
            result = self.cursor.execute("SELECT * FROM 'users' WHERE 'user_id = ?'", (user_id, )).fetchall()
            return bool(len(result))
</code>
Вот текст ошибки: Incorrect number of bindings supplied. The current statement uses 0, and there are 1 supplied.
Пытался пофиксить сам, но не получилось

Должно быть так
<code>
def users_exist(self, user_id):
        with self.connection:
            result = self.cursor.execute("SELECT * FROM users WHERE user_id = ?", (user_id)).fetchall()
            return bool(len(result))
</code>
Таблицы и поля выделять кавычками нельзя. В кавычки заключаются только строковые значения. Если строковое значение является строкой, оборачивать ? в запросе не надо, это сделает библиотека базы данных.
Текст запроса должен быть точно такой же, как если бы он выполняется в самой БД. Для проверки, сначала пишите запрос в БД, потом переносите его в код.