можно ли применять на один шаблон 2 или более моделей в Джанго
Можно ли применять на один шаблон 2 или более моделей.
вот код моделей

class Goods(models.Model):
    description_text = models.CharField(max_length=200)
    price_text = models.CharField(max_length=200)

    def __str__(self):
        return self.description_text

    def __str__(self):
        return self.price_text

class Number(models.Model):
    number1_text = models.CharField(max_length=200)
    number2_text = models.CharField(max_length=200)

    def __str__(self):
        return self.number1_text

    def __str__(self):
        return self.number2_text

они должны применятся на шаблон index.html
для этого я добавил ещё один класс к views.py с одним и тём же шаблоном как у IndexView, я подумал что эти классы по дельности будут отображать свою модель но при этом на один шаблон index.html, однако не удивительно что ничего не работает). Прошу помочь, и не судить строго так как я новичок в Джанго и ещё не особо понимаю как работает этот фреймворк, если какие-то неувязочки в формулировании вопроса так же извиняюсь.

class IndexView(generic.ListView):
    template_name = 'Homepage/index.html'
    model = Goods
    context_object_name = 'goods'

    def description(self):
        return self.description_text

    def price(self):
        return self.price_text

class NumbersView(generic.ListView):
    template_name = 'Homepage/index.html'
    model = Number
    context_object_name = 'numbers'

    def number1(self):
        return self.number1_text

    def number2(self):
        return self.number2_text

URLS.PY

path('index_page', IndexView.as_view(), name='index'),

VIEWS.PY

class IndexView(View):
    model1 = Goods
    model2 = Number
    template = 'Homepage/index.html'
    context = {}

    def get(self, *args, **kwargs):
        self.context = {
            'goods': self.model1.objects.all()
            'numbers': self.model2.objects.all()
        }
        return(render(request, self.template, self.context))

INDEX.HTML

{% for good in goods %}
    <p>{{ good.нужное поле или метод }}</p>
{% endfor %}

{% for number in numbers %}
    <p>{{ number.нужное поле или метод }}</p>
{% endfor %}

Могут быть грамматические ошибки, так что лучше не копипастить.


TypeError: Input() missing 1 required keyword-only argument
В массиве A найти разность сумм элементов с чётными и нечётными индексами. Элементы массива: aі (a итое) = i!
<code>
n = int(input("Enter n: "))
a = []

def factorial(i):
  if (i == 0): return 1
  elif(i == 1): return 1
  return i*factorial(i-1)

def Input(*a, n):
  for i in range(0, n):
    a[i] = factorial(i)

def Output(*a, n):
  for i in range(0, n):
    print(a[i], " ")
  print("\n")

print("Array A:")
Input(a, n)
Output(a, n)
D = 0
N = 0
def Summa(D, N):
  for i in range(n):
    if (i % 2 == 0): D += a[i]
    elif(i % 2 != 0): N += a[i]
Summa(D, N)
S = D - N
print("Subtraction:", S)
</code>
Ошибка:
line 19, in
Input(a, n)
TypeError: Input() missing 1 required keyword-only argument: 'n'.
Не понимаю, как решить эту проблему

по идее ваш код должен выглядеть так:

n = int(input("Enter n: "))

def factorial(i):
    return 1 if i < 2 else i * factorial(i - 1)

def Input(n):
    return [factorial(i) for i in range(n)]

def Output(a, n):
    print(*a, "\n", sep=" ")

print("Array A:")
a = Input(n)
Output(a, n)

def Summa():
    D = 0
    N = 0

    for i in range(n):
        if i % 2 == 0:
            D += a[i]
        else:
            N += a[i]

    return (D, N)

D, N = Summa()
S = D - N
print("Subtraction:", S)

Ошибки у вас:

так массив не заполнить

 for i in range(0, n):
     a[i] = factorial(i)

ведь вы объявили массив как
a = [], т.е. элементов в нем нет, поэтому вы и обращаться к ним не можете, минимум вы должны были бы сделать так:

    for i in range(0, n):
        a.append(factorial(i))

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

вы использовали конструкцию

def Input(*a, n):

это ошибка, кроме того вы все равно не можете заполнить глобальную переменную
a из функции в таком виде

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

в таком коде

def Summa(D, N):
  for i in range(n):
    if (i % 2 == 0): D += a[i]
    elif(i % 2 != 0): N += a[i]

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

не ошибка, а просто неаккуратность - есть у вас условие бинарное (четное или нечетное), то зачем нужно
elif и вторая проверка?

у вас

if (i % 2 == 0): D += a[i]
elif(i % 2 != 0): N += a[i]

но это избыточно и достаточно

if i % 2 == 0: D += a[i]
else: N += a[i]


как можно заменить try/except
нужно сделать так чтобы код работал без try/except и при этом не давал вводить буквы и отрицательные числа
<code>
while True:
    try:
        a = float(input('Введите число ').replace(",", ".")[:3])
    except ValueError:
        print("Пожалуйста введите число")
        continue
    break
print(a)
</code>

def formDict():
    Dictionary_data = []
    for i in range(65, 92):
        Dictionary_data.append(chr(i))
    for i in range(97, 123):
        Dictionary_data.append(chr(i))
    for i in range(1040, 1104):
        Dictionary_data.append(chr(i))
    return Dictionary_data

dict_letter = formDict()
flag = False
while True:
    var = input('Введите число=')
    if var:
        flag = True
    for element in var:
        if element in dict_letter:
            flag = False
            print('Пожалуйста, введите число')
            break
    if flag:
        var = float(var.replace(",", "."))
        if var<0:
            flag = False
            print('Число не должно быть отрицательным!')
    if flag:
        break
print(var)

Либо более короткая запись, но тогда числа c запятой не пройдут:

flag = False
while True:
    var = input('Введите число=')
    if var:
        if var.isdigit():
            var = float(var.replace(",", "."))
        else:
            print('Пожалуйста, введите число')
        if flag:
            break
print(var)

@min_4enko, Ну или другой подход 1го варианта. Думаю самый подходящий:

dict_number = [str(i) for i in range(10)]
dict_number.extend([',','.'])
flag = False
while True:
    var = input('Введите число=')
    if var:
        flag = True
        for element in var:
            if element in dict_number:
                continue
            else:
                flag = False
                print('Пожалуйста, введите число')
                break
        if flag:
            var = float(var.replace(",", "."))
            break
print(var)


Минимальное количество операций из 0 в N
Здраствуйте, я только начал свой путь в олимпиадном программировании.
Нужно из
0 получить
N добавляя два или три. Какое минимальное количество операций потребуется?

Если непременно нужно решать с помощью ДП (см. комментарий от
splash58), то нетрудно записать рекурсивную функцию

F(0,N) = min(F(2,N), F(3,N))

На её основе можно сделать мемоизацию - ДП с запоминанием промежуточных результатов.
Но здесь лучше создать массив длиной N+1 и заполнять его снизу, для каждого элемента проверяя -

DP[i] = 1 + min(DP[i-2], DP[i-3])

DP[N] будет содержать количество шагов.


Как найти сумму значений для каждой строки каждого объекта?
У меня есть список некоторых значений. Мне нужно дополнить этот список разностью значения с предыдущим, а также и суммой этих разностей. При этом, для разных названий сумму нужно обнулять.
Т.к. не могу особо понятно сформулировать, в комментариях к списку написал, чем нужно дополнить каждое значение:
<code>
import pandas as pd

data = [
    ['10:00', 'a', 110],  # += [0,  0]
    ['11:00', 'a', 130],  # += [20, 20]
    ['12:00', 'a', 145],  # += [15, 35]
    ['13:00', 'a', 165],  # += [20, 55]

    ['10:00', 'b', 110],  # += [0,   0]
    ['11:00', 'b', 230],  # += [120, 120]
    ['12:00', 'b', 345],  # += [115, 235]
    ['13:00', 'b', 465],  # += [120, 355]

    ['10:00', 'c', 10],  # += [0,  0]
    ['11:00', 'c', 20],  # += [10, 10]
    ['12:00', 'c', 30],  # += [10, 20]
    ['13:00', 'c', 35],  # += [5,  25]

    ['10:00', 'd', 1],  # += [0, 0]
    ['11:00', 'd', 2],  # += [1, 1]
    ['12:00', 'd', 3],  # += [1, 2]
    ['13:00', 'd', 4],  # += [1, 3]
]

df = pd.DataFrame(data, columns=['time', 'name', 'value'])
df.loc[df.name != df.name.shift(), 'diff_value'] = 0
df.loc[df.name == df.name.shift(), 'diff_value'] = df.value.diff()

print(df)
</code>
Дополнить разностью несложно, но как найти сумму этих разностей?


Discord бот не добавляет пользователей в бд
Я пишу discord бота (discord.py) на python, в котором будет рейтинговая система. Когда пользователь присоединяется к серверу, бот должен автоматически записывать его в бд (sqlite3), а если я отмечаю его сообщения реакцией (например ✅), бот должен прибавлять пользователю 500 очков в бд. Но когда я со 2 аккаунта присоединяюсь к серверу, бот не добавляет меня в бд, при вызове команды /top не отображает меня в списке пользователей, а команда /points выдаёт такую ошибку:

Ignoring exception in command points:
Traceback (most recent call last):
  File "C:\Users\belog\hat_dispenser\venv\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "C:\Users\belog\hat_dispenser\main.py", line 75, in points
    xp = cursor.execute(f"""SELECT points FROM users WHERE id = {ctx.author.id}""").fetchone()[0]
TypeError: 'NoneType' object is not subscriptable

Вот код:

import re
import sqlite3

import discord
from discord.ext import commands
from discord_components import DiscordComponents, Button, ButtonStyle
from config import settings

bot = commands.Bot(command_prefix=settings['prefix'], intents=discord.Intents.default())

connect = sqlite3.connect("server.dp")
cursor = connect.cursor()

@bot.event
async def on_ready():
    DiscordComponents(bot)
    cursor.execute("""CREATE TABLE IF NOT EXISTS users (
        name TEXT,
        id INT,
        points INT
    )""")
    for guild in bot.guilds:
        for member in guild.members:
            if cursor.execute(f"SELECT id FROM users WHERE id = {member.id}").fetchone() is None:
                cursor.execute(f"INSERT INTO users VALUES ('{member}', {member.id}, 0)")
            else:
                pass
    connect.commit()
    print("Bot connected!")

@bot.event
async def on_member_join(member):
    if cursor.execute(f"SELECT id from users WHERE id = {member.id}").fetchone() is None:
        cursor.execute(f"INSERT INTO users VALUES ('{member}', {member.id}, 0)")
        connect.commit()

@bot.event
async def on_raw_reaction_add(payload):
    channel = bot.get_channel(payload.channel_id)
    message = await channel.fetch_message(payload.message_id)
    guild = bot.get_guild(payload.guild_id)
    reaction = discord.utils.get(message.reactions, emoji=payload.emoji.name)
    if payload.member.id == bot.user.id:
        pass
    elif payload.member.id == 633717285474795557 and str(reaction.emoji) == '✅':
        cursor.execute(f"UPDATE users SET points = points + 500 WHERE id = {payload.member.id}")
        connect.commit()

@bot.command()
async def points(ctx, member: discord.Member = None):
    if member:
        xp = cursor.execute(f"""SELECT points FROM users WHERE id = {ctx.author.id}""").fetchone()[0]
        await ctx.send(f"У пользователя **{member.mention} {xp}XP**")
    else:
        xp = cursor.execute(f"""SELECT points FROM users WHERE id = {ctx.author.id}""").fetchone()[0]
        await ctx.send(f"У вас **{xp}XP**")

@bot.command()
async def top(ctx):
    users = []
    user_xp = list(cursor.execute(f"SELECT points FROM users").fetchall())
    top_users = {}
    for user in [user for user in list(cursor.execute("SELECT name FROM users").fetchall())]:
        users.append(re.sub("[)|(,']", "", str(user)))
    top_users = dict(zip(users, user_xp))
    sorted_values = sorted(top_users.values())
    sorted_top_users = {}
    for val in sorted_values:
        for key in top_users.keys():
            if top_users[key] == val:
                sorted_top_users[key] = top_users[key]
                break
    top_str = ""
    counter = 0
    for name, xp in sorted(list(sorted_top_users.items())):
        counter += 1
        top_str += f"{counter} - {name}: {list(xp)[0]}XP\n"
    emb = discord.Embed(title="Топ участников по колличеству XP:", colour=discord.Colour.green(),
                        description=f"**{top_str}**")
    await ctx.send(embed=emb)

bot.run(settings['token'])

Возможно ваше событие
on_member_join не срабатывает из-за того, что у Вас
intents=discord.Intents.default(). Потому что (выдержка из документации)

A factory method that creates a :class:
Intents
with everything enabled except :attr:
presences and :attr:
members.

Intents.presences
Whether guild presence related events are enabled.
This corresponds to the following events:

on_member_update() (activities, status)

This also corresponds to the
following attributes and classes in terms of cache:

Member.activities
Member.status
Member.raw_status

Intents.members
Whether guild member related events are enabled.
This corresponds to the following events:

on_member_join()
on_member_remove()
on_member_update() (nickname, roles)
on_user_update()

This also corresponds to the following
attributes and classes in terms of cache:

Client.get_all_members()
Guild.chunk()
Guild.fetch_members()
Guild.get_member()
Guild.members
Member.roles
Member.nick
Member.premium_since
User.name User.avatar (User.avatar_url and User.avatar_url_as())
User.discriminator

Это означает, что события просто не вызывается!
В документации в разделе
A Primer to Gateway Intents решение Вашей проблемы описано: ссылка

from discord.ext import commands
import discord

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

bot = commands.Bot(command_prefix='!', intents=intents)


Ошибка " 'int' object is not subscriptable"
Задача:
Нарисовать рисунок по тексту. Я пробовал все что мог. Пробовал на цикле While, пробовал изменить от цифра к строку, пытался ГУГЛИТЬ но все равно. Это не помогало мне. Помогите пж!
##################### - диапазон ошибки
ПРИМЕРЫ 'a' текста:
12345
21234
32123
43212
54321
12345
51234
45123
34512
23451
Это часть кода:

weight = len(text[0])
heigh = len(text)
def circling(a):
    pen.pu()
    pen.goto(-weight // 2,-heigh//2)
    pen.pd()
    for i in range(1,heigh):
        for j in range(1,weight):
            print(text[i - 1][j - 1])
#########################################################################################
            a = abs(weight * i + j)
            if int(a[i][j]) == 1:
                pen.color("blue")
            elif int(a[i][j]) == 2:
                pen.color("cyan")
            elif int(a[i][j]) == 3:
                pen.color("green")
            elif int(a[i][j]) == 4:
                pen.color("yellow")
            elif int(a[i][j]) == 5:
                pen.color("orange")
            elif int(a[i][j]) == 6:
                pen.color("red")
            elif int(a[i][j]) == 7:
                pen.color("brown")
            elif int(a[i][j]) == 8:
                pen.color("black")
############################################################################################
            pen.fd(10)
        pen.pu()
        pen.goto(0,j * 10)
        pen.pd()

Полный код:

import turtle as tr
pen = tr.Turtle()
pen.speed(0)
pen.width(10)
tr.tracer(10)
text = [
"11111",
"11111",
"11211",
"11111",
"11111",
]

weight = len(text[0])
heigh = len(text)
def circling(a):
    pen.pu()
    pen.goto(-weight // 2,-heigh//2)
    pen.pd()
    for i in range(1,heigh):
        for j in range(1,weight):
            print(text[i - 1][j - 1])
            a = abs(weight * i + j)

            if int(a[i][j]) == 1:
                pen.color("blue")
            elif int(a[i][j]) == 2:
                pen.color("cyan")
            elif int(a[i][j]) == 3:
                pen.color("green")
            elif int(a[i][j]) == 4:
                pen.color("yellow")
            elif int(a[i][j]) == 5:
                pen.color("orange")
            elif int(a[i][j]) == 6:
                pen.color("red")
            elif int(a[i][j]) == 7:
                pen.color("brown")
            elif int(a[i][j]) == 8:
                pen.color("black")

            pen.fd(10)
        pen.pu()
        pen.goto(0,j * 10)
        pen.pd()
circling(text)
tr.mainloop()

вот ваш код

for i in range(1,heigh):
    for j in range(1,weight):
        print(text[i - 1][j - 1])
        a = abs(weight * i + j)

        if int(a[i][j]) == 1:

в котором

a = abs(weight * i + j)

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

if int(a[i][j]) == 1:

подозреваю, что в данном коде должна была использоваться переменная
text

if int(text[i][j]) == 1:


Как развернуть 2 приложения на 1 Ip-адресе?
Проект: Ubuntu + Nginx + Flask + Gunicorn + wsgi.
Логика такая:

1ое приложения - рабочее
2ое приложение - тестовое(другая БД, другие ссылки c префиксами)

Оба слушают 1 IP-адрес, но разные ссылки на нем.
Создал другую БД, добавил префикс к ссылкам для 2го приложения, но не запускаются сразу 2 приложения. Сначала запускается 1, потом когда отрубишь его - запускается другое. Сразу оба не работают. Как сделать чтобы работали сразу оба?
Файл wsgi.py:
<code>
from myproject import MyApp as app
from test_project import Test_App as test_app
import threading

if __name__ == "__main__":
    aps1 = threading.Thread(target=app.run(port=5000, debug=False)).start()
    aps2 = threading.Thread(target=test_app.run(port=5001, debug=False)).start()
</code>

Вы же сразу функцию вызываете в основном потоке
app.run(port=5000, debug=False). А в поток в качестве
target передаёте результат этой функции. Вот оно и ждёт завершения функции
app.run() прежде чем аналогично будет позвана
test_app.run().
Попробуйте так:

    aps1 = threading.Thread(target=lambda: app.run(port=5000, debug=False)).start()
    aps2 = threading.Thread(target=lambda: test_app.run(port=5001, debug=False)).start()


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

вам вот это что ли надо? А то вопрос очень размывчатый, вы бы пример привели бы

width = 10
height = 7
symbols = '=+o'

print((symbols * width)[:width])

index = width
for i in range(1, height):
    char1 = symbols[index % len(symbols)]
    index += 1
    char2 = symbols[index % len(symbols)]
    index += 1
    print(f'{char1}{" " * (width - 2)}{char2}')

print((symbols * width)[index % len(symbols):width + index % len(symbols)])

если нужно чередовать в разных направлениях

width = 12
height = 7
symbols = '12345'

print((symbols * width)[:width])

for i in range(1, height):
    char1 = (symbols * height * width)[i % len(symbols)]
    char2 = (symbols * height * width)[(width + i - 1) % len(symbols)]
    print(f'{char1}{" " * (width - 2)}{char2}')

print((symbols * width * height)[height:width + height])

сделал также склейку с 3 углами


Громоздкий код. Подскажите, как я могу исправить эту ситуацию
Программа работает. При проверке программа выдаёт уравнение изображений согласно примеру из аргументов 1 и 2. В итоге мы показываем пласт уравнений согласно последней линии
<code>
argument1 = [[1, 1, 1],
             [1, 0, 0]]

argument2 = [[0, 0, 0],
             [1, 1, 1]]

template = [argument1, argument2]

n = 1

for data in template:
    size = len(data[0])
    for i in range(len(data)):
        for j in range(len(data[i])):
            for delta in range(1, size - (i + j)):
                for m in range(len(data)):
                    print('Изображение номер - ', m + 1, sep="")
                    for func in range(len(data)):
                        print(f'{int(func == m)} = R{func + 1} = {data[m][i]} * A1({func + 1}) + {data[m][i + j + delta]} * A2({func + 1})')
</code>

Если задача состоит в том, чтобы просто сделать код менее громоздким, то можно просто несколько циклов обернуть в не громоздкие функции (старый добрый Роберт Мартин)
<code>
def main():
    argument1 = [[1, 1, 1],
                 [1, 0, 0]]
    argument2 = [[0, 0, 0],
                 [1, 1, 1]]
    template = [argument1, argument2]

    n = 1
    for data in template:
        print_data(data)

def print_data(data):
    for i in range(len(data)):
        for j in range(len(data[i])):
            print_images_foreach_delta(data, i, j)

def print_images_foreach_delta(data, i, j):
    size = len(data[0])
    for delta in range(1, size - (i + j)):
        for image_index in range(len(data)):
            print_image(data, image_index, i, j, delta)

def print_image(data, image_index, i, j, delta):
    print('Изображение номер - ', image_index + 1, sep="")
    for func in range(len(data)):
        print(f'{int(func == image_index)} = R{func + 1} = {data[image_index][i]} * A1({func + 1}) + {data[image_index][i + j + delta]} * A2({func + 1})')

if __name__ == "__main__":
    main()
</code>
Если бы я знал, что именно должна делать программа, возможно, я дал бы именам функций и переменным более подходящие названия, да и в принципе написал бы эффективнее.


Пропускает всю функцию, вывод пустой [закрыт]

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

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

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

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

По сути он "пропускает" всю функцию, вывод пустой, но при этом ни ошибки, ничего нет. Предупреждения также отсутствуют.
<code>
b = int(input())
g = 0
h = 0
n = 0

def check():
    hn = False
    hu = False
    global b
    global g
    global h
    global n

    while b != 0:
        if b > g and hu is False:
            h += b
            hu = True
        if b < g and hn is False:
            n += b
            hn = True
        g = 0
        g += b
        b = int(input())

    return h, n, n - h
</code>

Потому что Вы ее не вызвали. Напишите:

print(check())

А лучше от глобальных переменных отказаться, если они нужны только в этой ф-ции:

def check(b, g=0, h=0, n=0):
    hn = False
    hu = False

    while b != 0:
        if b > g and hu is False:
            h += b
            hu = True
        if b < g and hn is False:
            n += b
            hn = True
        g = 0
        g += b
        b = int(input())
    return h, n, n - h

print(check(int(input())))


Зачем указывать запуск проекта 2 раза?
В процессе настройки проекта заметил одну особенность: проект запускается 2 раза (часть кода опущена)
ФАЙЛ wsgi.py:

from myproject import MyApp as app
if __name__ == "__main__":
    app.run()

ФАЙЛ myproject.py:

MyApp = Flask(__name__)
if __name__ == "__main__":
    MyApp.run()

Теперь вопрос: зачем 2 раза его запускать? Это такая особенность или можно запуск убрать из myproject.py?

Точно. Перепроверил. Внутри файла myproject.py можно убрать код:
<code>
if __name__ == "__main__":
    MyApp.run()
</code>
И запускать через wsgi.py проект


Помощь в решении задачи Ним-3 v2.0
Игра ним для двух игроков с тремя кучами и без ограничения на количество забираемых камней.
Напишите программу с «искусственным интеллектом» (ИИ), которая играет против пользователя и выигрывает, если может. Исходное количество камней в кучах задаёт пользователь, программа всегда ходит первой. Выигрывает забравший последний камень, и при окончании игры нужно объявить победителя.
Алгоритм игры выглядит следующим образом:
Сначала пользователь вводит количества камней в кучах (натуральные числа, каждое на новой строке).
Затем первый ход делает программа и выводит через пробел пять чисел: из какой кучи взяты камни; сколько камней взято; сколько камней осталось в кучах, сначала в первой, затем во второй, а потом и в третьей
Затем ход делает пользователь: вводит на отдельных строках номер кучи и количество камней, которые он хочет взять.
Если ход некорректный, например, пользователь пытается взять камней больше, чем есть в куче, программа должна вывести: Некорректный ход: <куча> <кол-во камней> и ожидать нового ввода пользователя.
После каждого корректного хода игрока или ИИ нужно выводить пять чисел, как и после первого хода ИИ.
Если выигрывает игрок, то надо вывести фразу: Вы выиграли!, а если ИИ – фразу: ИИ выиграл!
Все сообщения программы должны строго соответствовать условию.
Формат ввода
Для старта игры вводятся три натуральных числа.
Пример диалога игры:
2
2
2
1 2 0 2 2
1
2
Некорректный ход: 1 2
1
0
Некорректный ход: 1 0
2
1
2 1 0 1 2
3 1 0 1 1
2
1
2 1 0 0 1
3 1 0 0 0
ИИ выиграл!
я написал вот такой код:
<code>
    def take(what, amount):
    pile[what] -= amount
    print(what, amount, pile[1], pile[2], pile[3])

pile = {1: int(input()),
        2: int(input()),
        3: int(input())}

while True:
    if pile[1] > 0:
        take(1, pile[1])
    elif pile[2] > pile[3]:
        take(2, pile[2] - pile[3])
    elif pile[2] < pile[3]:
        take(3, pile[3] - pile[2])
    else:
        take(3, 1)

    if pile[1] == 0 and pile[2] == 0 and pile[3] == 0:
        print("ИИ выиграл!")
        break

    while True:
        p = int(input())
        n = int(input())
        if (p == 1 or p == 2 or p == 3) and 0 < n <= pile[p]:
            break
        print("Некорректный ход:", p, n)

    take(p, n)
    if pile[1] == 0 and pile[2] == 0 and pile[3] == 0:
        print("Вы выиграли!")
        break
</code>
но в каком-то случае проверка пишет что "ИИ должен был выиграть, а проиграл"

А разве логика игры НИМ не такая:

nim = pile[1] ^ pile[2] ^ pile[3]

index = 0
value = 0
for i in pile:
    if pile[i] >= nim and pile[i] > value:
        value = pile[i]
        index = i

take(index, value)

Ну или если хочется покороче:

nim = pile[1] ^ pile[2] ^ pile[3]

move = max((pile[i], i) for i in pile if pile[i] >= nim)

take(move[1], move[0])


Как сделать и обработать ссылку формата t.me/mybot?start=KEY в aiogram python?
Как сделать и обработать ссылку формата t.me/mybot?start=KEY в aiogram python?
mybot - название бота, KEY - ключ, который и нужно обработать(записать в переменную).
Пояснение:

Бот генерирует такую ссылку и 1 человек пересылает ее 2 человеку.
2 человек переходит по ней и его перебрасывает в телеграм бота, он нажимает кнопку Старт в боте и у него происходит какое-то событие(например, пишется ключ который был в ссылке).

Очень просто, в обработчике Вашей /start команды нужно отлавливать получение аргументов.
<code>
from aiogram.dispatcher.filters import CommandStart
from aiogram.types import Message

@dp.message_handler(CommandStart())
async def cmd_start(message: Message):
    args = message.get_args()

    if args:
        key = args[1]
        print(key)

        # Do something...

    ...
</code>


Как указать ожидаемое значение?
Есть функция, которая принимает на вход только -1, 0 и 1. Как мне указать это?
Так не работает:
<code>
from typing import Union

def do_anything(var: Union[-1, 0, 1]) -> dict:
    ...
</code>

Попробуйте использовать
typing.Literal
tc.py:

from typing import Literal

def do_anything(var: Literal[-1, 0, 1]) -> dict:
    return dict()

do_anything(2)

mypy tc.py

tc.py:6: error: Argument 1 to "do_anything" has incompatible type "Literal[2]"; expected "Union[Literal[-1], Literal[0], Literal[1]]"
Found 1 error in 1 file (checked 1 source file)

from typing import Literal

def do_anything(var: Literal[-1, 0, 1]) -> dict:
    return dict()

do_anything(1)

mypy tc.py

Success: no issues found in 1 source file


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

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

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

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

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

Допустим дан список [4, 3, 7, 'dfg'] нужно отсортировать этот список в порядке другого списка [1, 2, 3, 4], а если значения не совпадают поместить их в конец. То есть должно получится [3, 4, 7, 'dfg']

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

l1 = [4, 3, 7, 'dfg']
l2 = [1, 2, 3, 4]

# отображает значения на индексы
keys = {v: i for i, v in enumerate(l2)}

# индекс для значений вне списка
last_key = len(l2)

# сортирует по индексам, ненайденные значения скапливаются в конце
print(sorted(l1, key=lambda v: keys.get(v, last_key)))

[3, 4, 7, 'dfg']


Какая разница между 'is' и '==' в Python? [дубликат]

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

Оператор is в python

                                (2 ответа)

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

В чём разница между 'is' и '==' в if, и есть ли она вообще?

Я рискну привести такое - краткое, но зато очень простое объяснение:
оператор
== проверяет равенство значений двух объектов
оператор
is проверяет идентичность самих объектов. Его используют, чтобы удостовериться, что переменные указывают на один и тот же объект в памяти
Обратной стороной краткости ответа является то, что есть собенность: для экономии памяти, булевы типы, числа и строки могут кешироваться. Это означает, что при заведении двух разных, но равных между собой строк и
str1==str2 и
str1 is str2 будут
True.


Как перезапустить бота кодом, при нажатии inline кнопки(pytelegrambotapi)?
Есть Telegram бот, код:

import telebot
from telebot import types

bot = telebot.TeleBot("*****")

@bot.message_handler(commands=["start"])
def send_welcome(message):
  global markup, DELETEuserName, DELETEuserName1 #делаю переменную глобальной, чтобы она была видна в остальных функциях. Переменные с приставкой DELETE нужны для того, чтобы удалить сообщения от бота
  markup = types.InlineKeyboardMarkup()
  resetDataKey = types.InlineKeyboardButton("Сбросить", callback_data="resetData")
  markup.add(resetDataKey)
  userName = bot.send_message(message.chat.id, "Здравствуйте, введите имя")
  DELETEuserName = userName.chat.id
  DELETEuserName1 = userName.message_id
  bot.register_next_step_handler(userName, userSurNameFUNC)
def userSurNameFUNC(message):
  userName1 = message.text
  global userName, DELETEuserSurName, DELETEuserSurName1 #проделываю эту махинацию, чтобы сообщения превращались в тип String и конкатенировались
  userName = userName1
  userSurName = bot.send_message(message.chat.id, "Теперь введите фамилию", reply_markup=markup)
  DELETEuserSurName = userSurName.chat.id
  DELETEuserSurName1 = userSurName.message_id
  bot.delete_message(message.chat.id, message.message_id)
  bot.delete_message(DELETEuserName, DELETEuserName1)
  bot.register_next_step_handler(userSurName, endProgrammFUNC)
def endProgrammFUNC(message):
  userSurName1 = message.text
  global userSurName, DELETEendProgramm, DELETEendProgramm1
  userSurName = userSurName1
  endProgramm = bot.send_message(message.chat.id, "Вас зовут " + userName + " " + userSurName)
  DELETEendProgramm  = endProgramm.chat.id
  DELETEendProgramm1 = endProgramm.message_id
  bot.delete_message(message.chat.id, message.message_id)
  bot.delete_message(DELETEuserSurName, DELETEuserSurName1)
@bot.callback_query_handler(func=lambda call: True)
def inline_handler(call):
  if call.data == "resetData":
    bot.delete_message(call.message.chat.id, call.message.message_id)
    userName = bot.send_message(call.message.chat.id, "Здравствуйте, введите имя")
    DELETEuserName = userName.chat.id
    DELETEuserName1 = userName.message_id
    try:
      try:
        pass
      except:
        try:
          bot.delete_message(DELETEuserSurName, DELETEuserSurName1)
        except:
          bot.delete_message(DELETEendProgramm, DELETEendProgramm1)
    except:
      pass
    bot.register_next_step_handler(userName, userSurNameFUNC)
bot.infinity_polling()

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

2021-10-31 21:53:34,798 (__init__.py:663 MainThread) ERROR - TeleBot: "A request
 to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request
: message to delete not found"

Как можно при нажатии inline кнопки сбросить работу программы, перезапустить бота и начать сначала? Чтобы при каждом нажатии на inline кнопку, скрипт будто закрыли и открыли заново. Не знаю как сделать это кодом, чтобы бот работал без остановки 24/7.

Можно повторно вызывать функцию
send_welcome прямо из
inline_handler, которая ловит нажатие кнопки сброса.
А в самой функции
send_welcome сбрасывать все зарегистрированные обработчики с помощью вызова
bot.clear_step_handler(message).
Тогда если
send_welcome вызвана первый раз, никаких обработчиков еще не установлено и ничего не произойдет, а если повторно - они будут сброшены, как и требуется.
Вот пример рабочего кода:

@bot.message_handler(commands=["start"])
def send_welcome(message):
    global DELETEuserName1
    bot.clear_step_handler(message)
    userName = bot.send_message(message.chat.id, "Здравствуйте, введите имя")
    DELETEuserName1 = userName.message_id
    bot.register_next_step_handler(userName, userSurNameFUNC)

def userSurNameFUNC(message):
    global userName, DELETEuserSurName, DELETEuserSurName1
    userName = message.text
    markup = types.InlineKeyboardMarkup()
    resetDataKey = types.InlineKeyboardButton("Сбросить", callback_data="resetData")
    markup.add(resetDataKey)
    userSurName = bot.send_message(message.chat.id, "Теперь введите фамилию", reply_markup=markup)
    DELETEuserSurName = userSurName.chat.id
    DELETEuserSurName1 = userSurName.message_id
    bot.delete_message(message.chat.id, message.message_id)
    bot.delete_message(message.chat.id, DELETEuserName1)
    bot.register_next_step_handler(userSurName, endProgrammFUNC)

def endProgrammFUNC(message):
    global userSurName, DELETEendProgramm, DELETEendProgramm1
    userSurName = message.text
    endProgramm = bot.send_message(message.chat.id, "Вас зовут " + userName + " " + userSurName)
    DELETEendProgramm = endProgramm.chat.id
    DELETEendProgramm1 = endProgramm.message_id
    bot.delete_message(message.chat.id, message.message_id)
    bot.delete_message(DELETEuserSurName, DELETEuserSurName1)

@bot.callback_query_handler(func=lambda call: True)
def inline_handler(call):
    if call.data == "resetData":
        bot.delete_message(call.message.chat.id, call.message.message_id)
        send_welcome(call.message)

bot.infinity_polling()


Как заполнить матрицу вертикально, python? [закрыт]

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

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

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

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

Дано матрицу n x m. Нужно заполнить вертикально в питоне.
Пример: n = 3; m = 2
<code>
14
25
36
</code>

вы бы хотя бы свое решение приложили бы
<code>
m = 5
n = 6

matrix = [[(1 + i + j * m) for j in range(n)] for i in range(m)]

print(*matrix, sep='\n')
</code>


Как вывести данные из БД помощью дискорд бота?
Данной командой пользователь может сохранить данные о себе в БД.
<code>
@slash.subcommand(base='note', name='add', description='Adds a user id with a note to the database.', guild_ids=guild_ids)
async def add(ctx, user_id: str, user_name: str, note: str, friend_code: str, sex: str):
    database = sqlite3.connect('user_notes.db')
    c = database.cursor()
    c.execute(f"INSERT INTO user_notes VALUES ('{user_id}', '{user_name}', '{note}', '{friend_code}', '{sex}')")
    database.commit()
    database.close()
    await ctx.send('User and note successfully added!', hidden=True)
</code>
как сделать команду, которая будет выводить данные пользователя по его ID?
Например

/note show @user1

connection = sqlite3.connect('user_notes.db')
cursor = connection.cursor()
cursor.execute("""CREATE TABLE IF NOT EXISTS user_notes (
    user_id INT,
    user_name TEXT,
    note TEXT,
    friend_code INT,
    sex TEXT
)""")
for guild in self.client.guilds:
    for member in guild.members:
        if cursor.execute(f"SELECT id FROM user_notes WHERE id = {member.id}").fetchone() is None:
            cursor.execute(f"INSERT INTO users VALUES ('{user_id}', '{user_name}', '{note}', '{friend_code}', '{sex}')")
            connection.commit()
        else:
            pass
connection.commit()


Названия столбцов как числа Pandas
Как сделать названия столбцов в CSV-файле при
pandas.read_csv() float-числами, а не строкой?
(В моем случае, название столбца = значение температуры. И все время
float'ить() – достаточно стремно).

Ну вообще это ещё проще делается на самом деле, чем в уже данном ответе. Довольно стандартным для
Pandas "векторным" образом:

df.columns = df.columns.astype(float)

Хотя если нужно обрабатывать какие-то особые случаи, то, вероятно, тогда лучше парсить строки по отдельности.


Как отсортировать словарь по значениям от большего к меньшему?
Как отсортировать словарь по значениям от большего к меньшему в Python?

словарь сам по себе не сортируется, потому что это зависит от того как именно обрабатывается ключ
однако вы можете перевести словарь в список и отсортировать уже список
<code>
my_list = sorted(list(my_dict.items()))
</code>


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

-15 19 16 8 15 10 -14 -15 17 -17 -7 -13 -11 4 1 16 -9 13 6 13 -17 -19 9 11 5 -19 3 -20 3 16 -18 11 8 6 14 15 14 -1

Вывод:

34 3

Тут симметрии несколько, одна симметрия начинается с числа под индексом 17 и длина этой симметрии 3, но из-за того, что у второй симметрии(симметрия начинается с числа под индексом 34) начальное число больше, выводит его
Вот сам код:

data = list(map(int, input().split()))

pos_min = 0
size_max = 0

for pos in range(len(data)):
    for size in range(2, len(data) - pos + 1):
        if data[pos:pos+size] == list(reversed(data[pos:pos+size])) and size > size_max:
            size_max = size
            pos_min = pos

if size_max == 0:
    print(data.index(max(data)), 1)
else:
    print(pos_min, size_max)

Вариант №1
Хранить все симметричные последовательности в списке с их размерами, первыми элементами и позициями. Потом список отсортировать и вывести максимальные элемент.

#data = list(map(int, input().split()))
data = list(map(int, "-15 19 16 8 15 10 -14 -15 17 -17 -7 -13 -11 4 1 16 -9 13 6 13 -17 -19 9 11 5 -19 3 -20 3 16 -18 11 8 6 14 15 14 -1".split()))

symmetric = []
for pos in range(len(data)):
    for size in range(2, len(data) - pos + 1):
        if data[pos:pos+size] == list(reversed(data[pos:pos+size])):
            symmetric.append((size, data[pos], pos))

if symmetric:
    symmetric.sort()
    print(symmetric[-1][2], symmetric[-1][0])
else:
    print(data.index(max(data)), 1)

Вариант №2
Хранить длину максимальной последовательности и её позицию, но обновлять их только если:

новая последовательность длиннее; или
она по длине такая же, но её первый член больше, чем у предыдущей найденной последовательности такой же длины

#data = list(map(int, input().split()))
data = list(map(int, "-15 19 16 8 15 10 -14 -15 17 -17 -7 -13 -11 4 1 16 -9 13 6 13 -17 -19 9 11 5 -19 3 -20 3 16 -18 11 8 6 14 15 14 -1".split()))

size_max = 0
pos_max  = 0
for pos in range(len(data)):
    for size in range(2, len(data) - pos + 1):
        if data[pos:pos+size] == list(reversed(data[pos:pos+size])):
            if (size > size_max) or (size == size_max and data[pos] > data[pos_max]):
                size_max = size
                pos_max = pos

if size_max:
    print(pos_max, size_max)
else:
    print(data.index(max(data)), 1)

Вариант №3 (оптимизированный)
Похож на вариант №2. Только сразу ищем последовательности в порядке уменьшения их длины. Что позволяет избежать лишнего сканирования последовательности на наличие более коротких симметрий если уже найдена более длинная.

#data = list(map(int, input().split()))
data = list(map(int, "-15 19 16 8 15 10 -14 -15 17 -17 -7 -13 -11 4 1 16 -9 13 6 13 -17 -19 9 11 5 -19 3 -20 3 16 -18 11 8 6 14 15 14 -1".split()))

pos_max = None
for size in range(len(data), 0, -1):
    for pos in range(0, len(data) - size + 1):
        if data[pos:pos+size] == list(reversed(data[pos:pos+size])):
            if pos_max is None or data[pos] > data[pos_max]:
                pos_max = pos

    if pos_max is not None:
        break

print(pos_max, size)


Не получается сгенерировать словарь [закрыт]

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

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

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

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

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

users = []
    user_xp = list(cursor.execute(f"SELECT points FROM users").fetchall())
    top_users = {}
    for user in [user for user in list(cursor.execute("SELECT name FROM users").fetchall())]:
        users.append(re.sub("[)|(,']", "", str(user)))
    for user in users:
        for xp in user_xp:
            top_users[user] = list(xp)[0]
    print(top_users)

Но в результате я получаю вот такой словарь:

{'MERFAID#': 1000, 'Brainstorm1451#': 1000}

Хотя должен был получится такой:

{'MERFAID#': 0, 'Brainstorm1451#': 1000}

Помогите плиз.

Не очень понятно, что у вас за входные данные. И почему бы не сделать один запрос к БД сразу обоих полей и не создать словарь сразу.
Но в общем случае, если вам надо склеить 2 списка в словарь, то это делается так:

user_xp = [1,2,3]
users = ["Вася", "Петя", "Маша"]
top_users = dict(zip(users, user_xp))

{'Вася': 1, 'Маша': 3, 'Петя': 2}

А то что сейчас у вас написано - вы каждому
top_users[user] присваиваете последний элемент списка
user_xp.


ошибка as_view() в urls.py Django
Пытаюсь добавить возможно редактирования таблицы, но выдает ошибку:
Generic detail view GroupUpdateView must be called with either an object pk or a slug in the URLconf.
HTML code:

{% extends 'main/doki.html' %}
{% load static %}

{% block content %}

    <div class="groupcont">
            <div class="disian-camp">
                <a href="{% url 'create2' %}"><li><button class="btn btn-info"><i class "fas fa-plus-circle"><i> Добавить новую таблицу</button></li></a>
                    <table class="disian-campe">
                        <thead>
                            <tr>
                                <th>id</th>
                                <th>Номер группы</th>
                                <th>ФИО Куратора</th>
                                <th>Редактирование</th>
                                <th>Удаление</th>
                            </tr>
                        </thead>
                        <tbody>
                            {% for el in groups %}
                                <tr>
                                    <td>{{ el.titleid }}</td>
                                    <td>{{ el.titlegroup1 }}</td>
                                    <td>{{ el.titlecurator }}</td>
                                    <td><a href="{% url 'create2' %}">Редактировать</a></td>
                                    <td><a href="">Удалить</a></td>
                                </tr>
                            {% endfor %}
                        </tbody>
                    </table>
            </div>

{% endblock %}

second HTML code:

{% extends 'main/doki.html' %}
{% load static %}

{% block title %} Страница добавления таблиц {% endblock %}

{% block content %}
    <div class="createtable2">
        <style>
        form {
            margin-left: 32%;
            width: 500px;
            text-align: center;
        }
        </style>
            <form method="post">
                {% csrf_token %}
                {{ form.titleid }} <br>
                {{ form.titlegroup1 }} <br>
                {{ form.titlecurator }} <br>
                <button class "btn btn-success" type="submit">Добавить таблицу</button>
            </form>
    </div>

{% endblock %}

urls.py code:

from django.urls import path
from .import views

urlpatterns = [
    path('', views.registration, name='home'),
    path('group', views.about, name='group'),
    path('students', views.students, name='students'),
    path('create', views.create, name='create'),
    path('create2', views.create2, name='create2'),
    path('group/update', views.GroupUpdateView.as_view(), name='group/update'),
    path('student/update', views.StudentUpdateView.as_view(), name='student/update')
]

views.py code:

from django.shortcuts import render, redirect
from .models import group
from .models import studentes
from .forms import studentForm
from .forms import groupForm
from django.views.generic import DetailView, UpdateView

def registration(request):
    return render(request, 'main/registration.html')

def about(request):
    groups = group.objects.all()
    return render(request, 'main/group.html', {'groups':groups})

def students(request):
    studentss = studentes.objects.all()
    return render(request, 'main/students.html', {'studentss':studentss})

def create(request):
    error = ''
    if request.method == 'POST':
        form = studentForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('student')
        else:
            error = 'Ошибка формы. Пожалуйста, проверьте правильность веденных данных'

    form = studentForm()

    data = {
        'form': form,
        'error': error
    }

    return render(request, 'main/create.html', data)

def create2(request):
    error = ''
    if request.method == 'POST':
        form = groupForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('group')
        else:
            error = 'Ошибка формы. Пожалуйста, проверьте правильность веденных данных'

    form = groupForm()

    data = {
        'form': form,
        'error': error
    }

    return render(request, 'main/create2.html', data)

class StudentUpdateView(UpdateView):
    model = studentes
    template_name = 'main/create.html'

    fields = ('titleid2', 'titlegroup2', 'titlestudent', 'titlephone', 'titleemail')

class GroupUpdateView(UpdateView):
    model = group
    template_name = 'main/create2.html'

    fields = ('titleid', 'titlegroup1', 'titlecurator')

Проблема заключается в том, что Вы не передаете идентификатор группы в urls.py
Должно быть так:
<code>
path('group/<int:pk>/update/', views.GroupUpdateView.as_view(), name='group/update'),
</code>
По умолчанию UpdateView ищет конкретный объект по полю PK.


Как сделать, чтобы бот забанил участника везде, где есть бот? Discord.py
Я делаю бота в дискорде на языке python и мне нужно сделать так, чтобы если забанили пользователя на одном дискорд сервере, то бот автоматически банил на других дискорд серверах где есть этот же бот и сам пользователь. Посмотрел куча видео, но там везде пишут на 1 дискорд сервер.
Код:
<code>
@bot.command()
@commands.check(moderator)
async def бан(ctx, member : discord.Member, *, reason = None):
    await ctx.send(f'Участник под ником <@{member.id}> был забанен')
    await member.ban(reason=reason)
</code>
Ну стандартный код на бан. Так же прочитал документацию по discord.py, но не понял, наверное я глупый.

Если вы хотите, чтобы только вы могли использовать эту команду (именно создатель бота) и банился только участник, который ЕСТЬ на том сервера, то вот:

def dev(ctx):
    return ctx.message.author.id == 'ваше id'

@bot.command() # Создаём команду
@commands.check(dev) # Даём разрешение только использовать её создателю бота
async def guilds_ban(ctx, user_id: int, reason = 'решение администрации'):
    for guild in bot.guilds: # Перебираем все сервера, где есть бот
        for member in guild.members: # Берём всех участников сервера
            try:
                if user_id == member.id: # Проверка: если user_id равно member.id (с сервера), то...
                    await member.ban(reason = reason) # Баним этого пользователя
            except:
                print('Произошла ошибка!')

А если хотите чтобы на ВСЕХ серверах, даже если его НЕТ, то вот:

def dev(ctx):
    return ctx.message.author.id == 'ваше id'

@bot.command() # Создаём команду
@commands.check(dev) # Даём разрешение только использовать её создателю бота
async def guilds_ban(ctx, user_id: int, reason = 'решение администрации'):
    for guild in bot.guilds: # Перебираем все сервера, где есть бот
        try:
            user = await bot.fetch_user(user_id)
            await user.ban(reason = reason) # Баним этого пользователя
        except:
            print('Ошибка!')

Проверяйте, если не будет работать, то напишите ниже!


Вывести преобладающее число из списка python [закрыт]

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

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

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

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

Как вывести преобладающее число из списка в python?
Например, у меня есть список = [1, 7, 2, 2, 5, 7, 7, 0]
Ответ 7.
Если ни одно число не преобладает (количество каждого числа одинаковое), вывести -1. Если есть несколько чисел с одним числом повтора, выбрать наименьший.
Числа в списке положительные.

например можно решить так

from collections import Counter

data = [1, 7, 2, 2, 5, 7, 7, 0,]

counts = Counter(data)

counts_min = (-1, len(data))
counts_max = (-1, 0)

for i in counts:
    counts_min = (i, counts[i]) if counts[i] < counts_min[1] else counts_min
    counts_max = (i, counts[i]) if counts[i] > counts_max[1] else counts_max

print(-1 if counts_min[1] == counts_max[1] else counts_max[0])

можно не использовать
Counter, тогда надо самому сформировать словарь:

data = [1, 7, 2, 2, 5, 7, 7, 0,]

counts = dict()

for i in data:
    counts[i] = counts.get(i, 0) + 1

for i in counts:
    counts_min = (i, counts[i]) if counts[i] < counts_min[1] else counts_min
    counts_max = (i, counts[i]) if counts[i] > counts_max[1] else counts_max

print(-1 if counts_min[1] == counts_max[1] else counts_max[0])

Вот более короткий код (в одну строку)

data = [1, 7, 2, 2, 5, 7, 7, 0,]

counts = dict()

for i in data:
    counts[i] = counts.get(i, 0) + 1

res = sorted(counts.items(), key=lambda obj: obj[1])

print(-1 if res[0][1] == res[-1][1] else res[-1][0])

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

from collections import Counter

data = [1, 7, 2, 2, 5, 7, 7, 0,]

res = sorted(Counter(data).items(), key=lambda obj: obj[1])

print(-1 if res[0][1] == res[-1][1] else res[-1][0])


Рекурсивный обход папок c генерацией пути встреченных файлов
Есть один класс gen_files_path.
Туда передается название искомой папки и путь. Если путь не указан, то корневой диск.
Процесс: обход указанного каталога, если элемент файл, генерировать путь к нему. Если папка, то то внутри неё обойти, генерируя пути файлов, если в ней пака... т.д.
При нахождении искомой папки,  печатать её путь и строку 'найдено' и завершать обход.
Вопрос следующий: не могу понять как дописать туда рекурсивный обход папок.
код:
<code>
import os
from _collections_abc import Iterable

def gen_files_path(folder: str, path=None) ->Iterable[str]:
    if path is None:
        path = os.path.abspath(os.path.join(os.path.sep))
    for i_elem in os.listdir(path):
        temp = os.path.abspath(os.path.join(path, i_elem))
        if os.path.isdir(temp) and i_elem != folder:
            continue
        yield temp
        if i_elem == folder:
            return
</code>

Вместо continue вызываете себя же (
gen_files_path), в качестве аргумента
path использовав
temp (как я понимаю, абсолютный путь, содержащий ещё и папку, в которой нужно пошариться)


Как правильно реализовать логику для решения?
Задача:
Есть несколько уровней сложности судоку, мы можем оценить сложность судоку, основываясь на том, сколько ячеек дано из 81 ячейки игры.
Простые судоку обычно имеют более 32 заданий.
Судоку среднего размера имеет около 30–32 ответов.
В сложном судоку около 28–30 ответов.
Очень сложная судоку имеет менее 28 заданий
Примечание: минимальное количество данных, необходимых для создания уникальной (без множественных решений) игры судоку, составляет 17.
Сложная игра-судоку означает, что в начале ни в одной ячейке не будет ни одного кандидата, что требует угадывания и проб и ошибок. У очень жесткого будет несколько слоев из нескольких кандидатов на любую пустую ячейку.
Задача:
Напишите функцию, которая решает головоломки судоку любой сложности. Функция принимает сетку судоку и должна возвращать массив 9x9 с правильным ответом на головоломку.
Или это должно вызывать ошибку в случаях: недопустимая сетка (не 9x9, ячейка со значениями не в диапазоне 1 ~ 9); несколько решений для одной и той же головоломки или головоломка неразрешима.
В общем я набросал код, и как я и думал, на моменте, когда я рассчитал кандидатов для каждой ячейки начались проблемы. Не приходит в голову мысль, как перебрать различные варианты подстановок имеющихся вариантов.
Код:
<code>
solution = [[3, 4, 6, 1, 2, 7, 9, 5, 8],
            [7, 8, 5, 6, 9, 4, 1, 3, 2],
            [2, 1, 9, 3, 8, 5, 4, 6, 7],
            [4, 6, 2, 5, 3, 1, 8, 7, 9],
            [9, 3, 1, 2, 7, 8, 6, 4, 5],
            [8, 5, 7, 9, 4, 6, 2, 1, 3],
            [5, 9, 8, 4, 1, 3, 7, 2, 6],
            [6, 2, 4, 7, 5, 9, 3, 8, 1],
            [1, 7, 3, 8, 6, 2, 5, 9, 4]]

puzzle = [[0, 0, 6, 1, 0, 0, 0, 0, 8],
          [0, 8, 0, 0, 9, 0, 0, 3, 0],
          [2, 0, 0, 0, 0, 5, 4, 0, 0],
          [4, 0, 0, 0, 0, 1, 8, 0, 0],
          [0, 3, 0, 0, 7, 0, 0, 4, 0],
          [0, 0, 7, 9, 0, 0, 0, 0, 3],
          [0, 0, 8, 4, 0, 0, 0, 0, 6],
          [0, 2, 0, 0, 5, 0, 0, 8, 0],
          [1, 0, 0, 0, 0, 2, 5, 0, 0]]

def solver():
    transposed = [list(i) for i in zip(*puzzle)]
    candidates = dict()
    keys = [(0, 3), (3, 6), (6, 9)]
    row_point = None
    col_point = None

    for x in range(len(puzzle)):
        for y in range(len(puzzle[0])):
            candidates['canFor{}_{}'.format(x, y)] = list()

    for x in range(len(puzzle)):
        if x < 3:
            row_point = keys[0]
        elif x < 6:
            row_point = keys[1]
        elif x < 9:
            row_point = keys[2]
        for y in range(len(puzzle[0])):
            if y < 3:
                col_point = keys[0]
            elif y < 6:
                col_point = keys[1]
            elif y < 9:
                col_point = keys[2]
            if puzzle[x][y] == 0:
                for z in range(1, 10):
                    if z not in puzzle[x] and z not in transposed[y] \
                            and z not in [puzzle[row][col] for col in range(*col_point) for row in range(*row_point)]:
                        candidates['canFor{}_{}'.format(x, y)].append(z)
    print(candidates)

solver()
</code>


Отправка фото в анонимный чат телеграм
Пишу анонимный чат в телеграм, отправка голоса и эмодзи работает,но отправка фото не работает.Подскажите пожалуйста как реализовать отправку фото. Ниже код которым я пытаюсь это реализовать.
<code>
    @bot.message_handler(content_types='photo')
    def bot_photo(message):
        if message.chat.type == 'private':
            chat_info = db.get_active_chat(message.chat.id)
            if chat_info != False:
                bot.send_photo(chat_info[1], message.photo.file_id)
            else:
                bot.send_message(message.chat.id, '❌ Вы не начали диалог!')
</code>


При выводе кода появляется ошибка ValueError: invalid literal for int() with base 10:
Прошу помочь. На экран должно выводится либо
Zabud pro stypendiiu,либо
Zvychaina, либо
Pidvyshchena, но ничего из перечисленного не происходит.
Задача: код должен определять, какого уровня должна быть стипендия, смотря на оценки ("Zvychaina" - обычная стипендия,"Pidvyshchena" - Повышенная)

a=[]
a=int(input())
if int(n) >=1 and int(n)<=7:
    for i in a:
        if int(i) < 51:
            print("Zabud pro stypendiiu")
            break
        elif int(i) <90 and int(i) >50 :
             print("Zvychaina")
             break
        elif int(i) >=90:
            print("Pidvyshchena")
            break```

for i in a:

так это не работает, надо писать

for i in range(a):

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

a = int(input())
if int(n) >= 1 and int(n) <= 7:
    if a < 51:
        print("Zabud pro stypendiiu")
    elif a < 90 and a > 50:
        print("Zvychaina")
    elif a >=90:
        print("Pidvyshchena")

Если же вы вводите несколько значений (на что указывает
a=[] и последующий цикл, то вы неправильно получаете список), можно было бы сделать так:

a = list(map(int, input().split()))

if int(n) >= 1 and int(n) <= 7:
    for i in a:
        if i < 51:
            print("Zabud pro stypendiiu")
        elif i < 90 and i > 50:
            print("Zvychaina")
        elif i >= 90:
            print("Pidvyshchena")

Кстати такие конструкции:

i < 90 and i > 50:

питон позволяет писать более компактно:

50 < i < 90

P.S.
и непонятно в вашем коде, что такое
n:

int(n) >= 1 and int(n) <= 7:


Discord бот не видит реакции на сообщениях от пользователя
Я пишу discord (discord.py) бота, который будет распределять роли и начислять поинты пользователям, если я оставляю реакцию (:white_check_mark:) на их сообщениях. Функция для начисления поинтов должна будет записывать их в бд (sqlite3):
<code>
@bot.event
async def add_points(payload):
    channel = bot.get_channel(payload.channel_id)
    message = await channel.fetch_message(payload.message_id)
    guild = bot.get_guild(payload.guild_id)
    reaction = discord.utils.get(message.reactions, emoji=payload.emoji.name)
    if payload.member.id == bot.user.id:
        pass
    elif payload.member.id == 63371... and str(reaction.emoji) == '✅':
        cursor.execute(f"UPDATE users SET points = points + {500} WHERE id = {payload.member.id}")
        connect.commit()
</code>
Когда я ставлю реакцию на сообщение, бот её не видит. Помогите плиз.

Вы можете называть своими именами команды бота, помеченные декоратором
@bot.command().
Но это не касается событий бота
@bot.event. Чтобы отлавливать сообщения, функция должна называться конкретно -
on_message(message), чтобы создать функцию, которая будет вызвана при запуске бота, она тоже может называться только
on_ready() и больше никак.
Это же касается и события добавления реакции. Вы назвали функцию
add_points(payload):, поэтому библиотека
discord-py не может найти подходящее событие для функции с таким названием.
Правильно будет назвать функцию
on_raw_reaction_add(payload)


Проблема с дискорд ботом
Всем привет! Пишу на python бота для дискорда, бот должен одновременно и выполнять команды пример -
!mute и работать как чат бот, то есть если в чат к примеру написали
привет он должен что то ответить.
Код функций для теста:

@bot.command()
async def test (payloag):
    await payloag.send("It's command for tests.")

@bot.event
async def on_message(message):
    if (message.content == "hi"):
        await message.channel.send("Hello!")

Все бы хорошо, вот только вместе функции
@bot.event и
@bot.command() работать не хотят, по отдельности все работает как надо, но если их запустить вместе то работает только
@bot.event. Пробовал сделать код в два параллельных потока но ничего не изменилось.
Можете подсказать как это починить? Может кто сталкивался с такой проблемой?

Попробуйте это:
<code>
@bot.command()
async def test (payloag):
    await payloag.send("It's command for tests.")

@bot.event
async def on_message(message):
    if (message.content == "hi"):
        await message.channel.send("Hello!")
    await bot.process_commands(message)
</code>


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

я
ок
чел
челты
лох
лол
лолlь
трол
клоуниха

как это сделать, просто слов много, а я уже устал :(

file = open("slowa.txt")
data = file.read().replace(',','\n')
file.close()
file = open("slowa.txt","w")
file.write(data)


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

@botm.event
async def on_guild_join(guild):
    invite = await guild.create_invite(unique=True)
    print(f"Bot invited to server **{guild.name}** invite url ||{invite}||")

но оно выводит ошибку

AttributeError: 'Guild' object has no attribute 'create_invite'

<code>
channel = discord.utils.get(guild.text_channels, id='айди текстового канала')
await channel.create_invite(args)
</code>
Источник


Просмотр библиотек Python (.pyd)
Пытаюсь открыть и посмотреть что внутри библиотек Python. Находил библиотеку с расширением
.pyd, но когда её открываю, не могу ничего понять, видимо другая кодировка или что-то неправильно делаю.
Заранее спасибо за ответ.

.pyd - это DLL скомпилированная из С-шного исходника. Разумеется, там внутри нет ничего удобочитаемого. Если вы хотите прочитать
pyd, то нужно искать исходник.
Возьмём к примеру
\python\DLLs\_uuid.pyd. Инструкция в
setup.py сообщает, что этот модуль собирается из исходного файла
_uuidmodule.c. Это код на языке Си, в
_uuid.pyd только скомпилированный машинный код.
Однако ж подавляющее большинство пакетов python написаны на языке python. Соответственно, у файлов расширение
.py. О том, как устроены пакеты, написано в документации.


Как узнать координаты x y по sin и cos
Пытался сделать стрелочные часы, но столкнулся с проблемой. Кто поможет?
Пример кода:
<code>
for i in range(0, 360, 60):
        pygame.draw.line(sc, (255, 255, 255), (x, y), (int(x - 100 * math.cos(i)), int(y - 100 * math.sin(i))))
</code>
Делал по формуле x = x0 + D * cos(a) y = y0 + D * sin(a)

во первых кто сказал, что у вас в синусы и косинусы надо передавать градусы, а не радианы ;-)

math.cos(x) Return the cosine of x radians.

так что свой
i из градусов в радианы переведите


Программа не выходит из стейта VKBottle

from vkbottle.bot import Message
from vkbottle import Keyboard, KeyboardButtonColor, \
                        Text, OpenLink, Bot
from jetorm.utils import hash

from connect import db
from keyboards import admin_keyboard, mailing_keyboard
from states import MailingData, ctx

bp = Bot(token=token)
bp.labeler.vbml_ignore_case = True

@bp.on.private_message(text="/admin")
async def admin_commands_handler(message: Message):
    if db.find_one('users', '`isAdmin` = 1 AND `user_id` = ?', str(message.from_id)):
        admin_name = db.read_one('users', ('first_name',), '`user_id` = ?', str(message.from_id))[0][0]
        await message.answer(f"Здравствуйте, {admin_name}! Вот ваша админ-панель:", keyboard=admin_keyboard)
    else:
        await message.answer("Вы не администратор!")

@bp.on.private_message(payload={"cmd": "create_mailing"})
async def mailing_handler(message: Message):
    if db.find_one('users', '`isAdmin` = 1 AND `user_id` = ?', str(message.from_id)):
        await bp.state_dispenser.set(message.peer_id, MailingData.TEXT)
        return "Введите текст для рассылки:"
    else:
        await message.answer("Вы не администратор!")

@bp.on.private_message(state=MailingData.TEXT)
async def text_handler(message: Message):
    ctx.set("text", message.text)
    await bp.state_dispenser.set(message.peer_id, MailingData.IMAGE)
    await message.answer("Загрузите картинку (необязательно):")

@bp.on.private_message(state=MailingData.IMAGE)
async def image_handler(message: Message):
    ctx.set("image", "")
    try:
        ctx.set("image", message.attachments[0].photo.sizes[-5].url)
    except Exception:
        ctx.delete("image")

    text = ctx.get("text")
    image = ctx.get("image")
    post_id = hash(str(message.from_id))[:10]

    db.insert('mailing', {
            'text': text,
            'image_url': image,
            'user_id': message.from_id,
            'post_id': post_id
        })

    return f"Рассылка готова! ID: {post_id}\nНапишите /post <id>"

@bp.on.private_message(text=["/post <item>", "/post"])
async def post_handler(message: Message, item=None):
    print("="*50)
    print(db.find_one('mailing', '`post_id` = ?', item))
    print("="*50)
    await message.answer(f"{item}")

Проблема в стейтах, когда мне прилетает сообщение, что рассылка готова, я пишу
/post id (где id идентификационный номер поста выдаваемый в конце стейта) и стейт снова пишет, что рассылка готова. Вопрос: как выйти из стейта?. Я написал
return везде в стейтах.
файл
states.py

from vkbottle_types import BaseStateGroup
from vkbottle import CtxStorage

ctx = CtxStorage()

class MailingData(BaseStateGroup):
    TEXT = 0
    IMAGE = 1

У вас в
image_handler обрабатывается, когда
state=MailingData.IMAGE, а внутри вы
state не меняете. И он снова обрабатывается, поскольку
state остался прежним и стоит раньше
post_handler.
Есть два решения:

Изменять
state внутри
image_handler.
Изменить порядок хендлеров.

Можно использовать одновременно оба решения.


Django-модель User создает поле user_ptr_id
Пытаюсь обновить Django c 2 на 3.2.
У меня своя модель User-а:

class Agent(User):

    objects = AgentManager()

    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        editable=False,
        related_name='agent',
        on_delete=models.CASCADE,
        parent_link=True,
    )

Django-модель User-а делает его swappable:

class User(AbstractUser):
    """
    Users within the Django authentication system are represented by this
    model.

    Username and password are required. Other fields are optional.
    """
    class Meta(AbstractUser.Meta):
        swappable = 'AUTH_USER_MODEL'

Запускаю тесты с пустой базой и получаю ошибку:

django.db.utils.IntegrityError: null value in column "user_ptr_id" of relation "staff_agent" violates not-null constraint
DETAIL:  Failing row contains (null, null, 1, null, null, null, null, null, null).

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

Я разобрался сам. Если Django не находит onetoone-поле к User с параметром
parent_link=True, то он решает создать свое поле. Потом я увидел, что, хоть в поле и проставлен
parent_link=True, в миграции его нет, видимо кто-то проставил тут и забыл пересоздать миграции.
Проставил для миграции это поле и всё, Django перестал создавать свое поле.


Почему появляется ошибка если отправлять боту эмодзи?
Написал бота, работает правильно, но при вводе смайлика в консоли появляется вот такая ошибка

> No error handlers are registered, logging exception.
 Traceback (most recent call last):
  File "C:\Users\os\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\ext\dispatcher.py", line 555, in process_update
    handler.handle_update(update, self, check, context)
  File "C:\Users\os\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\ext\handler.py", line 198, in handle_update
    return self.callback(update, context)
  File "C:\Users\os\tb\bot.py", line 16, in on_message
    text2 = text[ :: -1 ]
TypeError: 'NoneType' object is not subscriptable

Ниже программа бота

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

ii = 1

def on_start( update, context ):
  global ii
  ii = 1
  chat = update.effective_chat
  context.bot.send_message( chat_id = chat.id, text = \
    "Привет, Андрей, как у тебя дела, мой любимый ребёнок ? :)" )

def on_message( update, context ):
  global ii
  chat = update.effective_chat
  text = update.message.text
  text2 = text[ :: -1 ]
  if ii == 1 :
    ii = 2
    context.bot.send_message( chat_id=chat.id, text = \
      "Ты моя буся сладкая. Поиграем в зеркало, ты мне что-то напиши, а я это переверну" )
  else :
    context.bot.send_message( chat_id=chat.id, text = text2 )

print( "Бот запущен. Нажмите Ctrl+C для завершения" )
token = ''
updater = Updater( token, use_context = True )
dispatcher = updater.dispatcher
dispatcher.add_handler( CommandHandler( "start", on_start ) )
dispatcher.add_handler( MessageHandler( Filters.all, on_message ) )
updater.start_polling()
updater.idle()

Я понял в чём была проблема. Проблема в том, что телеграм не всегда возвращает для бота текст. Например, если ввести какой-то анимированный смайлик, которых очень много в телеграмме, то в качесте текста возвращается отсутствие значения или
None. Значит просто добавляем проверку на значение
None ( или так
text == None )

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

ii = 1

def on_start( update, context ):
  global ii
  ii = 1
  chat = update.effective_chat
  context.bot.send_message( chat_id = chat.id, text = \
    "Привет, Андрей, как у тебя дела, мой любимый ребёнок ? :)" )

def on_message( update, context ):
  global ii
  chat = update.effective_chat
  text = update.message.text

  if text == None :  # Я сам себе предлагаю вот такое решение
    text = ':)'        # Проверяем на отсутствие значения
                     # ( в случае ввода эмодзи или гифки )

  text2 = text[ :: -1 ]
  if ii == 1 :
    ii = 2
    context.bot.send_message( chat_id=chat.id, text = \
      "Ты моя буся сладкая. Поиграем в зеркало, ты мне что-то напиши, а я это переверну" )
  else :
    context.bot.send_message( chat_id=chat.id, text = text2 )

print( "Бот запущен. Нажмите Ctrl+C для завершения" )
token = ''
updater = Updater( token, use_context = True )
dispatcher = updater.dispatcher
dispatcher.add_handler( CommandHandler( "start", on_start ) )
dispatcher.add_handler( MessageHandler( Filters.all, on_message ) )
updater.start_polling()
updater.idle()


Удалить все числа из текста, кроме тех, которые в названии
Необходимо удалить из текса все числа (включая те, которые пишутся через запятую или точку, например 3,14 или 3.14), но оставить те, которые используются внутри слова, например T-34, 2ГИС и тд.
Пыталась использовать такую конструкцию, но она удаляет абсолютно все цифры, даже из названий.
<code>
b = re.sub(r"[^\w\s]+|[\d]+", r'', a).strip()
</code>
Пример входных данных:
a = "по навигатору в 2ГИС мне добираться до дома 35,6 километра, что займет 10 часов"
На выходе надо получить:
b  = "по навигатору в 2ГИС мне добираться до дома километра, что займет часов"

Вот такая регулярка:

import re
a = "На Т-34 с серийным номером AB45F6Z1 по навигатору в 2ГИС мне добираться до дома 35,6 километра, что займет 10 часов"
b = re.sub(r"(^|\s+)(\d+([\.,]\d+)?)(?=\s|$)", "", a)

Даст такой результат:

На Т-34 с серийным номером AB45F6Z1 по навигатору в 2ГИС мне добираться до дома километра, что займет часов


Работа с аудиофайлами в питон
Ищу библиотеку для преобразования аудиофайла в байт-код и последующей работой с ним.
Я пробовал librosa. Но после дня работы с этой библиотекой, ничего не вышло.
Насколько я понял, эта библиотека требует установленную и настроенную анаконду или опытного наставника.
Ни того ни другого у меня нет.
Так код:
<code>
print('1')

import librosa

filename = 'Techno - Tetris (Remix).wav'

print(filename)

y, sr = librosa.load(filename)

print('3')

tempo, beat_frame = librosa.beat.beat_track(y=y, sr=sr)

print('tempo: {:.2f}'.format(tempo))

</code>
печатает: 1
И я не понимаю, почему...
Имеется также библиотека FMOD. Но качество её документации оставляет желать лучшего. Также она сильно уступает librosa.

Можно с pygame.mixer.sound работать. Тут про него много написано (russianblogs.ru)


Альтернатива методу setSortingEnabled(True)
У меня есть таблица
QTableWidget основанная на этой базе данных, созданная с помощью PyQT5.
Мне нужно как-то отсортировывать столбцы, но при использовании
self.tableWidget.setSortingEnabled(True), при сортировки
чисел выходит такое:

1, 10, 100, 1000, 10000, ...

Как сделать так, чтобы все сортировалось нормально, по возрастанию/убыванию.
UI-файл, нужный для загрузки интерфейса:

import sqlite3
import sys
# from time import sleep
from PyQt5.QtCore import Qt
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QMainWindow, QTableWidgetItem

class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi("Project_main.ui", self)
        #self.dialog_delete = uic.loadUi("Project_Delete.ui")
        #self.dialog_add = uic.loadUi("Project_Add.ui")
        self.setFixedSize(self.size())
        self.clearButton.clicked.connect(self.clear_bd)
        self.AlphabetSortButton.clicked.connect(self.alphabet_sort)
        self.AntiAlphabetSortButton.clicked.connect(self.anti_alphabet_sort)
        self.returnButton.clicked.connect(self.main_bd)
        self.deleteButton.clicked.connect(self.delete_record)
        self.addButton.clicked.connect(self.add_record)
        self.SerchPushButton.clicked.connect(self.update_result)
        self.con = sqlite3.connect("films_db.sqlite")
        self.tableWidget.itemChanged.connect(self.item_changed)
        self.modified = {}
        self.titles = None
        self.main_bd()
        self.tableWidget.setSortingEnabled(True)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Enter:
            self.update_result()

    def anti_alphabet_sort(self):
        self.QTableWidget.sortItems(self.QtCore.Qt.AscendingOrder, 0)

    def alphabet_sort(self):
        self.QTableWidget.sortItems(0, self.QtCore.Qt.AscendingOrder)

    def add_record(self):
        # self.dialog_add.show()
        pass

    def delete_record(self):
        # self.dialog_delete.show()
        pass

    def clear_bd(self):
        self.tableWidget.setRowCount(0)
        self.tableWidget.setColumnCount(0)

    def main_bd(self):
        cur = self.con.cursor()
        result = cur.execute("select * from films").fetchall()
        self.tableWidget.setRowCount(len(result))
        self.tableWidget.setColumnCount(len(result[0]))
        self.titles = [description[0] for description in cur.description]
        for i, elem in enumerate(result):
            for j, val in enumerate(elem):
                self.tableWidget.setItem(i, j, QTableWidgetItem(str(val)))

    def update_result(self):
        cur = self.con.cursor()
        # Получили результат запроса, который ввели в текстовое поле
        result = cur.execute("SELECT * FROM films WHERE title like '%" +
                             (item_title := self.lineEdit_search.text()) + "%'", ).fetchall()
        # Заполнили размеры таблицы
        self.tableWidget.setRowCount(len(result))
        # Если запись не нашлась, то не будем ничего делать
        if not result:
            self.statusBar().showMessage('Ничего не нашлось')
            self.tableWidget.setRowCount(0)
            self.tableWidget.setColumnCount(0)
            return
        else:
            self.statusBar().showMessage(f"Нашлась запись с названием - {item_title}")
        self.tableWidget.setColumnCount(len(result[0]))
        self.titles = [description[0] for description in cur.description]
        # Заполнили таблицу полученными элементами
        for i, elem in enumerate(result):
            for j, val in enumerate(elem):
                self.tableWidget.setItem(i, j, QTableWidgetItem(str(val)))
        self.modified = {}

    def item_changed(self, item):
        self.modified[self.titles[item.column()]] = item.text()

    def save_results(self):
        if self.modified:
            cur = self.con.cursor()
            que = "UPDATE films SET\n"
            que += ", ".join([f"{key}='{self.modified.get(key)}'"
                              for key in self.modified.keys()])
            que += "WHERE title = ?"
            print(que)
            cur.execute(que, (self.SearchPushButton.text(),))
            self.con.commit()
            self.modified.clear()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyWidget()
    ex.show()
    sys.exit(app.exec())

Ваша проблема в том, что вы устанавливаете в качестве данных строку, а не число.
Qt довольно умный фреймворк, и в большинстве случаев хранит данные в виде QVariant, а соответственно сам знает как с ними работать.
Приведу пример как заполнить таблицу, чтобы ваш столбец сортировался как числа (и плюсом работа с датой)
<code>
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QWidget, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import QSize, Qt, QDate

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setMinimumSize(QSize(400, 400))
        central_widget = QWidget(self)
        self.setCentralWidget(central_widget)
        grid_layout = QGridLayout()
        central_widget.setLayout(grid_layout)

        table = QTableWidget(self)
        table.setColumnCount(4)
        table.setRowCount(100)
        table.setHorizontalHeaderLabels(["text", "text1", "text2", "date"])
        table.setSortingEnabled(True)

        for i in range(0, 100):
            table.setItem(i, 0, QTableWidgetItem(str(i))) # Когда добавляете так, данные имеют тип строка
            item = QTableWidgetItem()
            item.setData(Qt.EditRole, str(i)) # так опять будет строка
            table.setItem(i,1,item)
            item = QTableWidgetItem()
            item.setData(Qt.EditRole, i) # а так будет число
            table.setItem(i,2,item)
            # И то же касается других типов. на пример даты
            item = QTableWidgetItem()
            item.setData(Qt.EditRole, QDate.currentDate().addDays(i))
            table.setItem(i,3,item)

        table.resizeColumnsToContents()
        grid_layout.addWidget(table, 0, 0)   # Добавляем таблицу в сетку

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())
</code>


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

12 -16 -7 -18 -5 -3 2 8 9 -14 -18 -9 11 -7 -3 4 -10 4 -3 -7 11 -12 -14 5 -11 -7 7 13 2 19 12 11

вывод:

12 9

второй пример,
ввод:

-4 -12 17 18 -8 7

вывод:

3 1

третий пример:

2 2 2 2 2 2 2 2

вывод:

0 8

как-то так:

data = [12, -16, -7, -18, -5, -3, 2, 8, 9, -14, -18, -9, 11, -7, -3, 4, -10, 4, -3, -7, 11, -12, -14, 5, -11, -7, 7, 13, 2, 19, 12, 11]

pos_min = 0
size_max = 0

for pos in range(len(data)):
    for size in range(2, len(data) - pos + 1):
        if data[pos:pos+size] == list(reversed(data[pos:pos+size])) and size > size_max:
            size_max = size
            pos_min = pos

if size_max == 0:
    print(max(data), data.index(max(data)), 1)
else:
    print(pos_min, size_max)

но тему надо закрыть ибо нефиг школьные задачи спрашивать без приведения своего кода ;-)
P.S.
ну и для любителей однострочного разврата:

res = [(j, i) for i in range(len(data)) for j in range(2, len(data)-i+1) if data[i:i+j] == list(reversed(data[i:i+j]))]

if len(res) == 0:
    print(max(data), data.index(max(data)), 1)
else:
    print(max(res)[1], max(res)[0])

P.P.S.
А вообще к черту эти
reversed! Мы что не на питоне что ли кодим?!!!

res = [(j, i) for i in range(len(data)) for j in range(2, len(data)-i+1) if data[i:i+j] == data[i:i+j][::-1]]

еще -10 буковок к коду :)


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

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

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

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

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

<code>
class Cars:
    model = ""
    number = ""
    DOC = ""

    def __init__(self, model, num, doc):
        self.model = model
        self.number = num
        self.DOC = doc

    def pAll(self):
        print('Марка авто: ', self.model, '\nНомер авто: ', self.number, '\nГод производства: ', self.DOC)

CarsAll = []

Usin = input("'да', если хотите заполнить анкету \n'нет', если прекратить опрос\n")
if Usin == "да":
    i = input("Введите название марки авто: ")
    CarsAll.append = i
    x = input("Введите ГОС номер авто: ")
    y = input("Введите год выпуска авто: ")
    z = CarsAll[-1]
    z = Cars(z, x, y)
else:
    print('Ну vse тогда')
</code>

CarsAll.append = i
Тут ошибка
Ты должен
CarsAll.append(i)
Если это не сработает попробуй вот так
i.append(CarsAll)
Если  оба варианта не сработает то
Попробуй в Faq в Сайте Python.org найти свою проблему


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

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

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

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

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

Пытаюсь сделать проверку ключа на валидность
Вот код:

def start(message):
    keys = message.text

    key = re.sub(r"[/check ]", "", keys)

    print(key)

    if key == "test":
        bot.send_message(message.chat.id,  "okay"  )

        a = 1

        idi(a)

    else:
        bot.send_message(message.chat.id,  "ne okay"  )

        a = 0

        idi(a)

def idi(a, message):
    if a == 1:

        bot.send_message(message.chat.id,  "Пожалуйста подождите..."  )

Получаю вот такую ошибку:

TypeError: idi() missing 1 required positional argument: 'message'

Вы описали функцию
idi с двумя параметрами:

def idi(a, message):
    if a == 1:
        bot.send_message(message.chat.id, \
            "Пожалуйста подождите..."  )

def start(message):
    keys = message.text
    key = re.sub(r"[/check ]", "", keys)
    print(key)
    if key == "test":
        bot.send_message(message.chat.id,  "okay"  )
        a = 1
        idi( a, '' ) # необходимо передать второй параметр
    else:
        bot.send_message(message.chat.id,  "ne okay"  )
        a = 0
        idi( a, '' ) # и тут необходимо передать второй параметр


Объединение 2х бесконечных циклов в python telethon
У меня есть 2 скрипта по автоматической отправке сообщений от моего имени в канал. Запускаю при помощи параллельного выполнения скриптов. Не очень удобно запускать по 2 сессии. Пытался использовать threading и multiprocessing если просто печатать в консоль то все идеально работает, но при отправке в ТГ у меня то await вне асинхронной функции то они выполняются по очереди то вообще зависает. Будьте добры объясните мне как возможно реализовать объединение этих 2х скриптов под одну сессию

from telethon import TelegramClient
import time

api_id = api_id
api_hash = 'api_hash'

with TelegramClient('me', api_id, api_hash) as client:
    client.loop.run_until_complete(client.send_message('me', 'Go'))

async def message()
        while True:
            await client.send_message(chat_id, 'test')
            time.sleep(500)
            await client.send_message(chat_id, 'test2')
            time.sleep(60)

with client:
       client.loop.run_until_complete(message())

И

from telethon import TelegramClient
import time

api_id = api_id
api_hash = 'api_hash'

with TelegramClient('me2', api_id, api_hash) as client:
    client.loop.run_until_complete(client.send_message('me', 'Go2'))

async def message2()
    while True:
        await client.send_message(chat_id, 'test3')
        time.sleep(3600)

with client:
    client.loop.run_until_complete(message2())

Буду очень признателен за любую помощь!
UPD: Для страдальцев подобных мне

from telethon import TelegramClient
import time

api_id = api_id
api_hash = 'api_hash'

client = TelegramClient('me', api_id, api_hash)
    client.start()

async def message()
        while True:
            await client.send_message(chat_id, 'test')
            await asyncio.sleep(500)
            await client.send_message(chat_id, 'test2')
            await asyncio.sleep(60)

async def message2()
        while True:
            await client.send_message(chat_id, 'test3')
            await asyncio.sleep(500)

client.loop.create_task(message())
client.loop.create_task(message2())
client.loop.run_forever()

Спасибо Eri!

with в этом коде стоит заминить на присваивание и передать аргументом, а то не понятно в каком контектексте будет колбэк при асинхронном запуске.
Убрать блокирующие функции из кода необходимо.
time.sleep(3600)
на
await asyncio.sleep(3600). Если будет ещё что-то такое - запускать в экзекуторах.
2 таска асинхронно стартуют через:

loop.create_task(message(client1))
loop.create_task(message2(client2))
loop.run_forever()


Ошибка при вызове функции: SyntaxError: can't assign to function call [закрыт]

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

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

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

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

Алгоритм вычисления значения функции F(n), где n – целое неотрицательное число, задан следующими соотношениями:

F(n) = F(n/2), если n > 0 и при этом n чётно;
F(n) = 1 + F(n – 1), если n нечётно.
Сколько существует таких чисел n, что 1 ≤ n ≤ 500 и F(n) = 8?

Выдаёт ошибку в строке F(n)=F(n-1)+1.

def F(n):
    if n==0:
        return 0
    elif n>0 and n%2==0:
        F(n)= F(n/2)
    elif n%2!=0:
        F(n)=F(n-1)+1

for n in range(1,500):
    if F(n) == 8:
      print('Ответ:', n)
      break```

ты пытаешься присвоить значение вызову функции то есть

print(22222222)=76

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

def a():
   return []
a().append('null')


Как присвоить ключу значения списка, полученных из цикла python
Пишу программу, в которой из текстового файла слова из текста - это ключи, а номера строк в которых они находятся - это значения ключей.
dic = {}

with open('text.txt', 'w') as kennedy:
kennedy.write('we observe \n today we \n are victory \n are part')

with open('text.txt', 'r') as kenn:
count = 0

    for line in kenn:
        count += 1
        clean_line = line.replace('\n', ' ')
        split_line = clean_line.split()

        for word in split_line:
            if word not in dic:
                lis = []
                lis.append(count)
                dic[word] = lis
            else:
                dic[word].append(count)

print(dic)

Возникло два вопроса:

Долго не могла понять как добавить списку значение при следующих итерациях, а
lis.append(count) дает не правильные цифры. Интуитивно просто написала
dic[word].append(count)
, но не могу понять, dic[word] это ключ словаря, почему append работает? Из - за того, что я присвоила ранее
dic[word] = lis и ключ стал листом? Тут я запуталась
Как по другому можно более грамотно и красиво решить эту задачу, не используя ennumirate и подобное. Чисто как у меня, используя самые банальные инструменты, списки и словари?

Прежде всего обрати внимание на встроеный модуль fileinput, что касается кода
<code>
    for line in kenn:
        count += 1
        clean_line = line.replace('\n', ' ') # нужно юзать line.strip(), так как формат окончания строк различен у винды и линукса
        split_line = clean_line.split()

with open('text.txt', 'w') as kennedy:
    kennedy.write('we observe \n today we \n are victory \n are part')
    dic={}
    count = 0
    for line in kenn:
        count += 1
        split_line=line.strip().split(' ') #strip здесь удаляет перенос строк
        for word in split_line:
            if word not in dic:
                dic[word] = count
             else:
                if isinstance(dic[word],list):
                      dic[word].append(count)
                else:
#суть условия эльсе в том, что изначально у нас в качестве значения строки, следовательно следует преобразовать строку в список с одним элементом и добавить новое значение, то есть нижеследющий код обрабатывает добавление второго элемента в список
                      dic[word]=list(dic[word])
                      dic[word].append(count)
                      #dic[word]=list(dic[word],count)

print(dic)
#{'we': 1, 'observe': 1, 'today': 2, 'are': 3, 'victory': 3, 'part': 4}
</code>
остальной код не понял зачем, мб не разобрался в вопросе


Добавьте еще две кнопки – одну для рисования круга, другую для очистки полотна
Есть программа которая выводит треугольник и прямоугольник. Но нужно еще добавить функцию вывода круга и очистки полотна.
Я писала примерно такой код, но сильно теряюсь, как реализовать поставленную задачу.
<code>
from tkinter import *
def triangle():
 canvas.coords(r, (0, 0, 0, 0))
 canvas.itemconfig(t, fill='yellow', outline='white')
 canvas.coords(t, (50, 200, 340, 200, 110, 60))
 text.delete(1.0, END)
 text.insert(1.0, 'Зображення трикутника')
 text.tag_add('title', '1.0', '1.end')
 text.tag_config('title', font=('Times', 14),
foreground='blue')
def rectangle():
 canvas.coords(t, (0, 0, 0, 0, 0, 0))
 canvas.itemconfig(r, fill='blue', outline='white')
 canvas.coords(r, (80, 50, 320, 200))
 text.delete(1.0, END)
 text.insert(1.0, 'Зображення прямокутника')
 text.tag_add('title', '1.0', '1.end')
 text.tag_config('title', font=('Times', 14), foreground='black')
def oval():
 canvas.coords(t, (0, 0, 0, 0, 0, 0))
 canvas.itemconfig(r, fill='blue', outline='white')
 canvas.coords(r, (80, 50, 320, 200))
 text.delete(1.0, END)
 text.insert(1.0, 'Зображення круга')
 text.tag_add('title', '1.0', '1.end')
 text.tag_config('title', font=('Times', 14), foreground='black')
win = Tk()
b_triangle = Button(text="Трикутник", width=15, command=triangle)
b_rectangle = Button(text="Прямокутник", width=15, command=rectangle)
b_oval = Button(text="Круг", width=15, command=oval)
canvas = Canvas(width=400, height=300, bg='#fff')
text = Text(width=55, height=5, bg='#fff', wrap=WORD)
t = canvas.create_polygon(0, 0, 0, 0, 0, 0)
r = canvas.create_rectangle(0, 0, 0, 0)
y = canvas.create_oval(50, 10, 150, 110)
b_triangle.grid(row=0, column=0)
b_rectangle.grid(row=1, column=0)
b_oval.grid(row=1, column=0)
canvas.grid(row=0, column=1, rowspan=10)
text.grid(row=11, column=1, rowspan=3)
win.mainloop()

</code>

Я написал для вас программу (реализовал все что надо). Если что, фигуры можно удалять методом
canvas.itemconfig(ФИГУРА, state='hidden'). Чтобы показать элемент снова
state='normal'. Дам вам совет: делайте отступы между строками кода (делите программу на блоки), такой код читать будет в разы легче. Также не забывайте про такой полезный инструмент программиста как коментарии (в Python их можно писать после символа "#"). Удачи вам в изучении Python.

from tkinter import *

def triangle():
 canvas.itemconfig(r, state='hidden')
 canvas.itemconfig(y, state='hidden')

 canvas.itemconfig(t, fill='yellow', outline='white', state='normal')
 canvas.coords(t, (50, 200, 340, 200, 110, 60))
 text.delete(1.0, END)
 text.insert(1.0, 'Зображення трикутника')
 text.tag_add('title', '1.0', '1.end')
 text.tag_config('title', font=('Times', 14),
foreground='blue')

def rectangle():
 canvas.itemconfig(t, state='hidden')
 canvas.itemconfig(y, state='hidden')

 canvas.itemconfig(r, fill='blue', outline='white', state='normal')
 canvas.coords(r, (80, 50, 320, 200))
 text.delete(1.0, END)
 text.insert(1.0, 'Зображення прямокутника')
 text.tag_add('title', '1.0', '1.end')
 text.tag_config('title', font=('Times', 14), foreground='black')

def oval():
 canvas.itemconfig(t, state='hidden')
 canvas.itemconfig(r, state='hidden')

 canvas.itemconfig(y, fill='green', outline='white', state='normal')
 canvas.coords(y, (80, 50, 280, 250))
 text.delete(1.0, END)
 text.insert(1.0, 'Зображення кола')
 text.tag_add('title', '1.0', '1.end')
 text.tag_config('title', font=('Times', 14), foreground='black')

def clear():
 canvas.itemconfig(t, state='hidden')
 canvas.itemconfig(y, state='hidden')
 canvas.itemconfig(r, state='hidden')
 text.delete(1.0, END)

win = Tk()

b_triangle = Button(text="Трикутник", width=15, command=triangle)
b_rectangle = Button(text="Прямокутник", width=15, command=rectangle)
b_oval = Button(text="Коло", width=15, command=oval)
b_clear = Button(text="Очистити", width=15, command=clear)

canvas = Canvas(width=400, height=300, bg='#fff')
text = Text(width=55, height=5, bg='#fff', wrap=WORD)

t = canvas.create_polygon(0, 0, 0, 0, 0, 0)
r = canvas.create_rectangle(0, 0, 0, 0)
y = canvas.create_oval(0, 0, 0, 0)

b_triangle.grid(row=0, column=0)
b_rectangle.grid(row=1, column=0)
b_oval.grid(row=2, column=0)
b_clear.grid(row=3, column=0)

canvas.grid(row=0, column=1, rowspan=10)
text.grid(row=11, column=1, rowspan=3)
win.mainloop()


Как объединить фреймы, чтобы они следовали друг за другом?
Как объединить 3-4 фрейма так, чтобы они следовали друг за другом? То есть, сначала шел первый, за ним в новые столбцы склеивался второй, потом третий и т.д.
Пример:
Вход:
df1

a b c
1 3 7
2 3 4
3 3 7

df2

k d h
0 3 1
2 0 4
3 3 7

df3

o p r
0 3 1
1 0 1
1 3 1

Выход: df4

a b c k d h o p r
1 3 7 0 3 1 0 3 1
2 3 4 2 0 4 1 0 1
3 3 7 3 3 7 1 3 1

Опробованные функции объединяют как бы сверху вниз.

Воспользуйтесь pd.concat([df1, df2, df3], axis=1). Параметр
axis указывает по какой оси вы хотите объединять данные - вертикально или горизонтально.

df4 = pd.concat([df1, df2, df3], axis=1)

In [167]: df4
Out[167]:
   a  b  c  k  d  h  o  p  r
0  1  3  7  0  3  1  0  3  1
1  2  3  4  2  0  4  1  0  1
2  3  3  7  3  3  7  1  3  1


Как сделать сортировку списка по определенным символам?
Есть список со названиями интерфейсов. Подскажите, как сделать сделать сортировку по номеру интерфейса?
Например, interface Tunnel 0, interface Tunnel 1, interface Tunnel 2 и так далее..

some_list = ['interface Tunnel 0' , 'interface Tunnel 10', 'interface Tunnel 5' , 'interface Tunnel 3', 'interface Tunnel 7' , 'interface Tunnel 23']

Просто сортировка через sort() выдает мне не тот результат:

['interface Tunnel 0', 'interface Tunnel 10', 'interface Tunnel 23', 'interface Tunnel 3', 'interface Tunnel 5', 'interface Tunnel 7']

some_list = ['interface Tunnel 0' , 'interface Tunnel 10', 'interface Tunnel 5' , 'interface Tunnel 3', 'interface Tunnel 7' , 'interface Tunnel 23']
res = sorted(some_list, key=lambda x: int(x.split()[-1]))

Результат:

['interface Tunnel 0',
 'interface Tunnel 3',
 'interface Tunnel 5',
 'interface Tunnel 7',
 'interface Tunnel 10',
 'interface Tunnel 23']


Ошибка при импорте CSV файла в DataFrame из ZIP
Я пытаюсь импортировать CSV файл в DataFrame, но сам CSV файл находиться в zip (помимо нужного файла в zip находиться много других CSV файлов).
Я сначала использую
zipfile, потом
pd.read_csv:

import zipfile
import pandas as pd
archive = zipfile.ZipFile('C:\Python\Controller-gsm_radio-R4V12.20.20-20211027165128-41.zip', 'r')
txtdata = archive.read('GExternalGsmCell.csv')
asd = pd.read_csv(txtdata, sep=',')
print(asd)

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

Expected file path name or file-like object, got <class 'bytes'> type

Оберните
txtdata в
io.BytesIO, чтобы получить ожидаемый Pandas
file-like object:

import io

asd = pd.read_csv(io.BytesIO(txtdata), sep=',')

или без создания дополнительной переменной:

asd = pd.read_csv(io.BytesIO(archive.read('GExternalGsmCell.csv')))


Получить значение кубика
<code>
@dp.message_handler(commands="dice")
async def Dice(m: types.Message):
await m.reply_dice()
</code>
Мне надо получить значение кубика (dice), который бросил мой бот в ответ на сообщение.

Я уже нашел ответ:
<code>
@dp.message_handler(commands="dice")
async def Dice(m: types.Message):
msg=await m.reply_dice()
print(msg.dice.value)
</code>
msg.dice.value-значение результата