Составить словарь и списка кортежей
Есть список кортежей, (где идут id покупателя, количество товаров, сумма покупки)

orders = [
      (111, 3, 1200), (118, 9, 8000),
      (111, 10, 1000000), (119, 9, 13300),
      (156, 10, 11000), (123, 9, 11200),
      (178, 20, 3200), (178, 5, 8900),
      (156, 9, 8000), (123, 4, 3500),
      (101, 9, 8000), (101, 8, 1000),]

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

discount_system {101: {'discount': 0, 'total_sum': 9000},
            111: {'discount': 15, 'total_sum': 1001200},
            118: {'discount': 0, 'total_sum': 8000},
            119: {'discount': 5, 'total_sum': 13300},
            123: {'discount': 5, 'total_sum': 14700},
            156: {'discount': 10, 'total_sum': 19000},
            178: {'discount': 5, 'total_sum': 12100}}

То есть надо если id совпадает, то складывать сумму (например id 111 встречается два раза и надо в итоговый словарь положить, сумму для id 111 10000+1200) и т.д.
Пока придумалось такое:

for i in orders:
    discount_system.update({i[0]:{'discount':0, 'total_sum':i[2]}})
print(discount_system)

И получаю словарь со словарями внутри, НО вот как применить условие, что если ID уже есть в словаре, то делай сумму не пойму...


Как найти индексы элементов одного списка внутри другого?
У меня есть 2 списка.
Вот пример:

ls1 = [12,3,1,4,2,3,4,5,6,7,8,1]
ls2 = [3,4,5]

И в первом и во втором списке элементы не уникальные - они могу повторяться.
Мне надо найти пересечение двух списков (учитывая порядок элементов) и вернуть индексы элементов пересечения в первом списке.
Должно быть что-то вроде:

[5, 7]

где

5 - начальный индекс пересечения в первом списке

7 - последний индекс пересечения в первом списке
Как я могу это сделать?

Брать в цикле срез
[i:i+len(ls2)] в первом списке и сравнивать его со вторым. Если одинаково, то искомые индексы будут
[i:i+len(ls2)-1].


Сравнение дат\времени в Python [закрыт]

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

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

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

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

Я с API получаю случайное время в формате ISO8601 (2021-01-29T21:33:04.836603Z)
Как с помощью Python проверить, значение полученного времени позже или раньше от времени в настоящий момент минус 2 недели. Другими словами, мне нужно только то время, которое входит в промежуток от сегодня, до двух недель назад.

Если вы получаете время в формате ISO8601, c использованием UTC смещения, то и работать дальше неверное захотите в этом формате. Поэтому:

dt1=datetime.datetime.strptime('2021-01-29T21:33:04.836603Z', "%Y-%m-%dT%H:%M:%S.%fZ")
dt3=datetime.datetime.now().utcnow()
dt4=dt3-datetime.timedelta(days=14)
print(dt1,dt4)
if dt4>dt1:
    print('Вышли за диапазон')
else:
    print('Остались в  диапазоне')

Результат:

2021-01-29 21:33:04.836603 2022-01-21 10:38:34.406008
Вышли за диапазон

Если задать

dt1=datetime.datetime.strptime('2022-01-29T21:33:04.836603Z', "%Y-%m-%dT%H:%M:%S.%fZ")

то результат получим:

2022-01-29 21:33:04.836603 2022-01-21 10:41:59.984071
Остались в  диапазоне

Если же захотите сначала перейти к датам без UTC смещения, то все делается по аналогии, но вместо метода .utcnow() используете метод .now().


TypeError: url() got an unexpected keyword argument 'name'
Прохожу гайд по книге Эрика Метиза по работе с фреймворком Django, в ходе работы возникла ошибка, не могу решить проблему, начав поиск в интернете, наткнулся на статью.
learning_log\urls.py

from django.conf.urls import include
from django.contrib import admin
from django.template.defaulttags import url
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'', include('learning_logs.urls')),
]

learning_logs\urls.py

from django.template.defaulttags import url
from . import views

app_name = 'learning_logs'
urlpatterns = {
    # Домашняя страница
    url(r'^$', views.index, name='index'),
}

views.py

from django.shortcuts import rende

def index(request):
    """Домашняя страница для learning_logs"""
    return render(request, 'learning_logs/index.html')

При запуске сервера с помощью команды
python manage.py runserver получаю следующую ошибку:

    url(r'^$', views.index, name='index'),
TypeError: url() got an unexpected keyword argument 'name'

В виртуальном окружении я использую:

Django 4.0.1

Python 3.9

P.S.: Я так полагаю, что проблема в разнице версий, но я совсем новичок и не понимаю, что от меня просят.

Исправил самостоятельно
leagrning_logs\urls.py

from django.urls import path

from . import views

urlpatterns = [
    # Домашняя страница
    path('', views.index, name='index'),
]

По книге идёт старая версия Django с версии 3.0 как я понял рекомендуется использовать path
learning_log\urls.py

from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('learning_logs.urls')),
]


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

def digit_checking():
        data_list=[]
        user_input=''
        while user_input!='exit':
                user_input=(input('Please enter digit and press enter,or use exit for Exit-> '))
                data_list.append(user_input)

        data_list.remove('exit')
        print(data_list)
        data_count=sum(data_list)/len(data_list)
        print(data_count)

digit_checking()

Методом научного тыка выяснил что проблема в sum(data_list). Но никак не могу понять почему оно воспринимает то что в списке есть строка, ведь я ее уже удалил
data_list.remove('exit')
Если сделать

user_input=int(input('Please enter digit and press enter,or use exit for Exit-> '))

Получаю

ValueError: invalid literal for int() with base 10: 'exit'

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

Вам нужно убедиться, что введенное значение может быть конвертировано в int. В противном случае(если это не exit) - сообщить об этом пользователю:
<code>
while True:
    user_input=(input('Please enter digit and press enter,or use exit for Exit-> '))
    if user_input == 'exit':
        break
    elif user_input.isnumeric():
        data_list.append(int(user_input))
    else:
        print(f"{user_input} is not a digit. Please try again.")
</code>


Парсинг без библиотек на Python [закрыт]

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

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

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

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

У меня есть вот такая строка и её нужно распарсить без использования библиотек только средствами самого python 3:

command s1 s2 (l1 l2) [lp 990] (l [li p]) "entity j [90 90]" <ping 90> *9 9* lol

Нужно получить:

['command', 's1', 's2', {'strings': ['l1', 'l2'], type: 'round_brackets'}, {'strings': ['lp', '990'], type: 'square_brackets'}, {'strings': ['l', {'strings': ['li', 'p'], type: 'square_brackets'}], type: 'round_brackets'}, {'strings': 'entity j [90 90]', type: 'quotes'}, {'strings': ['ping', '90'], type: 'command'}, {'integers': ['9', '9'], type: 'nums'}, 'lol']

Правила парсинга:

скобки и кавычки и звёзды могут быть вложенными
в кавычках не работает парсинг.
в звёздах вместо string integer.
в полученном массиве в его словарях будет само содержание и тип.

Это всё нужно сделать, кто может сделайте пожалуйста :).
И я НЕ смог написать парсер с помощью словарей в списках.

def f(s):
    start = 0
    bracket = None
    array = []
    for i in range(len(s)):
        if bracket:
            if s[i] == ")]>*\""[bracket[1]]:
                array.append(s[start:i + 1].strip())
                start = i + 1
                bracket = None
            continue
        if s[i] in "([<*\"":
            if s[start:i].strip():
                array.extend(s[start:i].split())
            start = i
            bracket = s[i], "([<*\"".index(s[i])

    if s[start:].strip():
        array.extend(s[start:].strip().split())

    result = []
    for el in array:
        if el[0] not in "([<*\"":
            result.append(el)
        elif el[0] == "\"":
            result.append({
                "strings": el[1:-1],
                "type": "quotes",
            })
        elif el[0] == "*":
            result.append({
                "integers": list(map(int, f(el[1:-1]))),
                "type": "nums",
            })
        else:
            type_ = {
                "(": "round_brackets",
                "[": "square_brackets",
                "<": "command",
            }[el[0]]

            result.append({
                "strings": f(el[1:-1]),
                "type": type_,
            })

    return result

s = '''command s1 s2 (l1 l2) [lp 990] (l [li p]) "entity j [90 90]" <ping 90> *9 9* lol'''
print(f(s))


Массивы Python. Сумма расстояний от первой точки до остальных точек
Условие: X и Y представляют координаты одной из n точек на плоскости. Найти
число точек, у которых ордината Y больше абсциссы X, и сумму расстояний
от первой точки до остальных точек. Ввод кол-ва точек и сами координаты идет с клавиатуры.
Не могу найти сумму расстояний от первой точки до остальных, помогите пж!
Вот код:
<code>
n = int(input('введите кол-во точек: '))

items = []
c = 0 # счетчик номеров точек
for i in range(n):
    c += 1
    x = int(input(f'введите x точки {c}: '))
    y = int(input(f'введите y точки {c}: '))

    items.append([x, y])

k = 0 # счетчик точек у которых Y больше чем X
for i in items:
    if i[1] > i[0]:
        k += 1

print(items)
print(k)
</code>

Не понял вопроса.
"Не могу найти сумму расстояний от первой точки до остальных",  -  вы еще не учили на уроках геометрии формулу расстояния между двумя точками на плоскости? Или вы не знаете, как эту формулу запрограммировать на Python?
Если первое -  то подсказываю: корень квадратный из суммы квадратов покоординатных расстояний. А если второе, то например вот так:

import math
for i in items[1:]:
    print(math.sqrt((items[0][0]-i[0])**2+(items[0][1]-i[1])**2))


Подсчет гласных и согласных в строке
Есть код, который запрашивает кол-во строк для ввода стихотворения, а затем считает общее кол-во гласных и согласных.
<code>
quest = int(input('Сколько будет строк? '))
gls = 0
sgl = 0
vse_gls = ["а", "е", "ё", "и", "о", "у", "ы", "э", "ю", "я"]
count = 0
while quest > count:
    poem = input()
    for i in poem:
        if i.isalpha():
            if i in vse_gls:
                gls += 1
            else:
                sgl += 1
    count += 1

print('Кол-во гласных:', gls)
print('Кол-во согласных:', sgl)
</code>
Подскажите, как сделать, чтобы он считал гласные и согласные еще и отдельно для каждой строки?

Немного избыточен ваш код.
Первое, не зачем считать количество строк. Для
while необходимо определить условие выхода и все. Причина в том, что у вас не определяется поведение если будет расхождение когда вы определеяете количество строк, а потом когда вводите эти строки. Здесь в легую можно ошибиться. И даже если программа введет себя корректно, то, что будет если я введу количество строк в пару миллиардов. Шутников много, поэтому не стоит давать им шанс). Конечно, если это только не условие задачи...
Второе, для каждой строки считать количество гласных и согласных и помещять в списки. В конце суммировать и будет общий результат.
Третье, строку можно очистить от всего ненужного и привести к строчным буквам

gls = "аеиоуюя"
gls_each_line = []
sgl_each_line = []

while True:
    line = input()
    if line:
        f = filter(str.isalpha, line)
        clear_letter_low = "".join(f).lower()
        gls_count = 0
        for letter in gls:
            gls_count += clear_letter_low.count(letter)
        sgl_each_line.append(len(clear_letter_low) - gls_count)
        gls_each_line.append(gls_count)
    else:
        break

for i in range(len(sgl_each_line)):
    s = f"В строке номер {i+1}: гласных {gls_each_line[i]}, с согласных {sgl_each_line[i]}"
    print(s)

print(f"В тексте {sum(gls_each_line)} гласных и {sum(sgl_each_line)} согласных")

Несколько комментариев по коду.

gls_each_line и
sgl_each_line переменные будут копить количество гласных и согласных для каждой строки

while будет запрашивать строку до тех пор пока, не получит пустую строку, т.е. нажмите Enter и программа завершится
Для того чтобы очистить строку применяю фильтр только по буквам, результат работы фильтра привожу к строчным буквам и кладу в переменную
clear_letter_low

f = filter(str.isalpha, line)
clear_letter_low = "".join(f).lower()

Пример, как это работает

line = "Не важно какаЯ СТРОКа 78900 и ЧТОБЫ она не сОДЕРжала"
f = filter(str.isalpha, line)
clear_letter_low = "".join(f).lower()
print(clear_letter_low)

# out
# неважнокакаястрокаичтобыонанесодержала

на выходе имеем только буквы в нужном регистре.

Считаем гласные -> помещяем в накопитель
gls_each_line. Из длины чистой строки вычитаем количество гласных и результат помещяем в
sgl_each_line
Чтобы вывести количество гласных/согласных из всего текста, просто применяем метод для суммирования элементов списка
sum()

Проверяем

# входные данные
Затем генератор распаковывается в готовую
вляются неизменяемыми объектами, поэтому
все вышеуказаные методы убирает символы
з данной строки и возвращает новую, они не меняют состояние

# выходные данные
В строке номер 1: гласных 16, с согласных 21
В строке номер 2: гласных 16, с согласных 20
В строке номер 3: гласных 14, с согласных 21
В строке номер 4: гласных 23, с согласных 26
В тексте 69 гласных и 88 согласных


Map() в Python, или Почему итератор составленный мапом из введенных данных, работает в мапе но не в фильтре?
Решаю учебную задачу, и заметил, что, когда я создаю итератор из inputов следующим образом:

words = map(lambda x: input().lower(), range(int(input())))

, то список из этого итератора становится пустым, но если преобразовать все это с помощью функции list() на этапе присваивания, все работает. При этом, итератор без преобразования работает в другом map(), но не работает в filter(). С чем это может быть связано и как это исправить?
Код:

words = map(lambda x: input().lower(), range(int(input())))
anagrams = set(map(lambda x: tuple(sorted(list(x))), words))
word_groups = map(lambda x: list(filter(lambda w: tuple(sorted(list(w))) == x, list(words))), anagrams)
suitable = sorted(filter(lambda x: len(x) > 1, word_groups))
for s in suitable:
    print(" ".join(s))

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

Потому, что результат функции
map() - это итератор. И пройдя по нему один раз - он закончится, и второй раз пройтись по нему не выйдет.
К примеру, для следующего кода:

m = map(int, ["0", "1", "2"])
print(list(m))
print(list(m))

Выведется:

[0, 1, 2]
[]


Не могу вписать 0 в Json файл и ошибка в коде Discord.py
Всем привет!
У меня возникла ошибка в коде.
У меня не записывается 0 в json файл.
Вот сам код:

@client.command()
async def рег(ctx, Id, *, name):
    message = ctx.message
    if not message.author.bot:
        with open('player.json','r') as f:
            users = json.load(f)
        a = 0

        await update_data(ctx, users, message.author,message.guild, Id, name, a)

        with open('player.json','w') as f:
            json.dump(users, f)
    await client.process_commands(message)

async def update_data(ctx, users, user,server, Id, name, a):
    if not str(server.id) in users:
        users[str(server.id)] = {}
        if not str(user.id) in users[str(server.id)]:
            users[str(server.id)][str(user.id)] = {}
            users[str(server.id)][str(user.id)]['Id'] = Id
            users[str(server.id)][str(user.id)]['name'] = name
            users[str(server.id)][str(user.id)]['elo'] = 300
            users[str(server.id)][str(user.id)]['o_elo'] = 300
            users[str(server.id)][str(user.id)]['match'] = 0
            users[str(server.id)][str(user.id)]['win']  = 0
            users[str(server.id)][str(user.id)]['lose'] = 0
            users[str(server.id)][str(user.id)]['win_rate'] = users[str(server.id)][str(user.id)]['win'] / users[str(server.id)][str(user.id)]['lose']
            role = user.guild.get_role(937373473242771516)
            await user.add_roles(role)
            embed = discord.Embed(title = 'Info', description = f'твоё ID: ' + Id + "\nТвой ник: " + name + '\nЕсли есть ошибка напиши администрации (vila#1390)!\nПриятной игры на нашем Faceit!' ,color = discord.Color.green())
            embed.set_author(name = ctx.author, icon_url = ctx.author.avatar_url)
            await ctx.send(embed = embed)
    elif not str(user.id) in users[str(server.id)]:
            users[str(server.id)][str(user.id)] = {}
            users[str(server.id)][str(user.id)]['Id'] = Id
            users[str(server.id)][str(user.id)]['name'] = name
            users[str(server.id)][str(user.id)]['elo'] = 300
            users[str(server.id)][str(user.id)]['o_elo'] = 300
            users[str(server.id)][str(user.id)]['match'] = 0
            users[str(server.id)][str(user.id)]['win']  = 0
            users[str(server.id)][str(user.id)]['lose'] = 0
            users[str(server.id)][str(user.id)]['win_rate'] = users[str(server.id)][str(user.id)]['win'] / users[str(server.id)][str(user.id)]['lose']
            role = user.guild.get_role(937373473242771516)
            await user.add_roles(role)
            embed = discord.Embed(title = 'Info', description = f'твоё ID: ' + Id + "\nТвой ник: " + name + '\nЕсли есть ошибка напиши администрации (vila#1390)!\nПриятной игры на нашем Faceit!' ,color = discord.Color.green())
            embed.set_author(name = ctx.author, icon_url = ctx.author.avatar_url)
            await ctx.send(embed = embed)

Когда участник пишет F-рег (свой ID) (свой ник) то в json файл добавляется его профиль с такими значениями как ID NAME ELO OLD_ELO MATCH WIN LOSE WIN_RATE. Но в MATCH WIN LOSE WIN_RATE должно изначально иметь значение 0.
Но появляется ошибка: **discord.ext.commands.errors.CommandInvokeError: Command raised an exception: ZeroDivisionError: division by zero
**
Кто может помочь, скажите или как сделать что-бы F-рег засунуть в on_message(message) или другое решение проблемы.
и еще, почему в

@client.event
async def on_voice_state_update(member, before, after):

def check(x,y,z) работают по очереди и как это исправить.
Вот весь код:

TOKEN = settings['TOKEN']

intents = discord.Intents().all()
client = discord.Client(intents=intents)

filename = 'player.json'

client = commands.Bot(command_prefix = settings['PREFIX'], intents=intents)
client.remove_command( 'help' )

channelID = 938114259601219644
channelID1 = 938138361342885948
channelID2 = 938138361342885948

members = []
################################################################################################

@client.event # Означает для выполнения евента после запуска.
async def on_ready():
    print(" Бот подключён ") #Выводит в консоль то что бот запустился с верменем
    await client.change_presence( status = discord.Status.idle, activity=discord.Activity( type=discord.ActivityType.playing, name = "v1la Faceit bot | moderator") )

@client.event
async def on_raw_reaction_add(payload):
    channel = client.get_channel(payload.channel_id)
    message = await channel.fetch_message(payload.message_id)
    guild = client.get_guild(payload.guild_id)
    reaction = discord.utils.get(message.reactions, emoji=payload.emoji.name)

    # only work if it is the client
    if payload.member.id == client.user.id:
        return

    if payload.message_id == 937307086197518336 and reaction.emoji == '🇷🇺':
        role = discord.utils.get(guild.roles, name="RU")
        await payload.member.add_roles(role)
        role1 = discord.utils.get(guild.roles, name='EU')
        await payload.member.remove_roles(role1)
        await reaction.remove(payload.member)
    if payload.message_id == 937307086197518336 and reaction.emoji == '🇺🇲':
        role = discord.utils.get(guild.roles, name='EU')
        await payload.member.add_roles(role)
        role1 = discord.utils.get(guild.roles, name='RU')
        await payload.member.remove_roles(role1)
        await reaction.remove(payload.member)

@client.command()
async def рег(ctx, Id, *, name):
    message = ctx.message
    if not message.author.bot:
        with open('player.json','r') as f:
            users = json.load(f)
        a = 0

        await update_data(ctx, users, message.author,message.guild, Id, name, a)

        with open('player.json','w') as f:
            json.dump(users, f)
    await client.process_commands(message)

async def update_data(ctx, users, user,server, Id, name, a):
    if not str(server.id) in users:
        users[str(server.id)] = {}
        if not str(user.id) in users[str(server.id)]:
            users[str(server.id)][str(user.id)] = {}
            users[str(server.id)][str(user.id)]['Id'] = Id
            users[str(server.id)][str(user.id)]['name'] = name
            users[str(server.id)][str(user.id)]['elo'] = 300
            users[str(server.id)][str(user.id)]['o_elo'] = 300
            users[str(server.id)][str(user.id)]['match'] = 0
            users[str(server.id)][str(user.id)]['win']  = 0
            users[str(server.id)][str(user.id)]['lose'] = 0
            users[str(server.id)][str(user.id)]['win_rate'] = users[str(server.id)][str(user.id)]['win'] / users[str(server.id)][str(user.id)]['lose']
            role = user.guild.get_role(937373473242771516)
            await user.add_roles(role)
            embed = discord.Embed(title = 'Info', description = f'твоё ID: ' + Id + "\nТвой ник: " + name + '\nЕсли есть ошибка напиши администрации (vila#1390)!\nПриятной игры на нашем Faceit!' ,color = discord.Color.green())
            embed.set_author(name = ctx.author, icon_url = ctx.author.avatar_url)
            await ctx.send(embed = embed)
    elif not str(user.id) in users[str(server.id)]:
            users[str(server.id)][str(user.id)] = {}
            users[str(server.id)][str(user.id)]['Id'] = Id
            users[str(server.id)][str(user.id)]['name'] = name
            users[str(server.id)][str(user.id)]['elo'] = 300
            users[str(server.id)][str(user.id)]['o_elo'] = 300
            users[str(server.id)][str(user.id)]['match'] = 0
            users[str(server.id)][str(user.id)]['win']  = 0
            users[str(server.id)][str(user.id)]['lose'] = 0
            users[str(server.id)][str(user.id)]['win_rate'] = users[str(server.id)][str(user.id)]['win'] / users[str(server.id)][str(user.id)]['lose']
            role = user.guild.get_role(937373473242771516)
            await user.add_roles(role)
            embed = discord.Embed(title = 'Info', description = f'твоё ID: ' + Id + "\nТвой ник: " + name + '\nЕсли есть ошибка напиши администрации (vila#1390)!\nПриятной игры на нашем Faceit!' ,color = discord.Color.green())
            embed.set_author(name = ctx.author, icon_url = ctx.author.avatar_url)
            await ctx.send(embed = embed)

@client.command()
async def profile(ctx,member: discord.Member):
    user = member
    with open('player.json','r') as f:
        users = json.load(f)
    lvl = users[str(ctx.guild.id)][str(user.id)]['Id']
    exp = users[str(ctx.guild.id)][str(user.id)]['name']
    elo = users[str(ctx.guild.id)][str(user.id)]['elo']
    o_elo = users[str(ctx.guild.id)][str(user.id)]['o_elo']
    match = users[str(ctx.guild.id)][str(user.id)]['match']
    win = users[str(ctx.guild.id)][str(user.id)]['win']
    lose = users[str(ctx.guild.id)][str(user.id)]['lose']
    win_rate = users[str(ctx.guild.id)][str(user.id)]['win_rate']

    embed = discord.Embed(title = "", description = "" ,color = discord.Color.green())
    embed.add_field(name=f"Info", value="Name: {}\nID: {}".format(exp, lvl,) , inline=False)
    embed.add_field(name=f"Elo", value="elo: {}\nold_elo: {}".format(elo, o_elo) , inline=False)
    embed.add_field(name=f"Matchs", value="all match: {}\nwins: {}\nlose: {}".format(match, win, lose) , inline=False)
    embed.add_field(name=f"win rate", value="{}".format(win_rate), inline=False)
    embed.set_author(name = ctx.author, icon_url = ctx.author.avatar_url)
    await ctx.send(embed = embed)

@client.event
async def on_voice_state_update(member, before, after):
    if after.channel != None:
        if after.channel.id == 937716652047466606:
            category = after.channel.category

            channel2 = await member.guild.create_voice_channel(
                name = f'Поиск матча',
                user_limit=10,
                category = category,
            )

            role = member.guild.get_role(role_id = 937717442111746098)
            role3 = member.guild.get_role(role_id = 937373489768304731)
            await member.add_roles(role)

            await channel2.set_permissions(member, connect = True)
            await member.move_to(channel2)

            def check(x, y, z): return len(channel2.members) <= 2

            await client.wait_for('voice_state_update', check = check)
            await channel2.edit(name = "Поиск матча")
            await channel2.set_permissions(discord.utils.get(member.guild.roles, id=937029793864622100), connect = True)
            voice_channel_list1 = member.guild.voice_channels
            guild = member.guild
            for member in guild.members:
                members.append(member)
            for k in members:
                await k.remove_roles(role)
                await k.remove_roles(role3)
                #list the members if there are any in the voice channel
            #getting the members in the voice channel
            for voice_channels in voice_channel_list:

                if len(voice_channels.members) >= 0:
                    if len(voice_channels.members) >= 3:
                        for i in voice_channels.members:
                            await i.add_roles(role3)
                    else:
                        for i in voice_channels.members:
                            await i.add_roles(role)

            def check(x, y, z): return len(channel2.members) == 3

            await client.wait_for('voice_state_update', check = check)
            await channel2.edit(name = "Игроки набраны, идет матч")
            await channel2.set_permissions(discord.utils.get(member.guild.roles, id=937029793864622100), connect = False)
            voice_channel_list2 = member.guild.voice_channels
            guild = member.guild
            for member in guild.members:
                members.append(member)
            for k in members:
                await k.remove_roles(role)
                await k.remove_roles(role3)
                #list the members if there are any in the voice channel
            #getting the members in the voice channel
            for voice_channels in voice_channel_list:

                if len(voice_channels.members) >= 0:
                    if len(voice_channels.members) >= 3:
                        for i in voice_channels.members:
                            await i.add_roles(role3)
                    else:
                        for i in voice_channels.members:
                            await i.add_roles(role)

            def check(x, y, z): return len(channel2.members) == 0

            await client.wait_for('voice_state_update', check = check)
            voice_channel_list = member.guild.voice_channels
            await channel2.delete()
            guild = member.guild
            for member in guild.members:
                members.append(member)
            for k in members:
                await k.remove_roles(role)
                await k.remove_roles(role3)
                #list the members if there are any in the voice channel
            #getting the members in the voice channel
            for voice_channels in voice_channel_list:

                if len(voice_channels.members) >= 0:
                    if len(voice_channels.members) >= 3:
                        for i in voice_channels.members:
                            await i.add_roles(role3)
                    else:
                        for i in voice_channels.members:
                            await i.add_roles(role)

@client.event
async def on_message(message):
    user = message.author
    if message.channel.id == channelID:
        if not message.author.bot:

            print('function load')
            with open('player.json','r') as f:
                users = json.load(f)
                print('file load')
            await add_experience(users, message.author, 1702, message.guild)
            await level_up(users, message.author,message.channel, message.guild)
            with open('player.json','w') as f:
                json.dump(users, f)
        await client.process_commands(message)
        role55 = message.guild.get_role(role_id = 938114033624682528)
        await user.remove_roles(role55)

    if message.channel.id == channelID1:
        if not message.author.bot:
            print('function load')
            with open('player.json','r') as f:
                users = json.load(f)
                print('file load')
            await r_experience(users, message.author, 20, message.guild)
            await level_up(users, message.author,message.channel, message.guild)
            with open('player.json','w') as f:
                json.dump(users, f)
        await client.process_commands(message)
        role55 = message.guild.get_role(role_id = 938138248981655572)
        await user.remove_roles(role55)
    else:
        await client.process_commands(message)

async def add_experience(users, user, exp, server):
  users[str(user.guild.id)][str(user.id)]['o_elo'] = users[str(user.guild.id)][str(user.id)]['elo']
  users[str(user.guild.id)][str(user.id)]['elo'] += exp
async def r_experience(users, user, exp, server):
  users[str(user.guild.id)][str(user.id)]['o_elo'] = users[str(user.guild.id)][str(user.id)]['elo']
  users[str(user.guild.id)][str(user.id)]['elo'] -= exp

async def level_up(users, user, channel, server):
  experience = users[str(user.guild.id)][str(user.id)]['elo']
  lvl_start = users[str(user.guild.id)][str(user.id)]['o_elo']
  lvl_end = users[str(user.guild.id)][str(user.id)]['elo']
  if str(user.guild.id) != '757383943116030074':

    if lvl_end <= 800:
        role1 = user.guild.get_role(938343282742820874)
        await user.add_roles(role1)

    if lvl_end <= 950:
            role1 = user.guild.get_role(938343282742820874)
            role2 = user.guild.get_role(938343343274987530)
            await user.remove_roles(role1)
            await user.add_roles(role2)

    if lvl_end <= 1100:
            role1 = user.guild.get_role(938343282742820874)
            role2 = user.guild.get_role(938343343274987530)
            role3 = user.guild.get_role(938343399843561532)
            await user.remove_roles(role1)
            await user.remove_roles(role2)
            await user.add_roles(role3)

    if lvl_end <= 1250:
            role1 = user.guild.get_role(938343282742820874)
            role2 = user.guild.get_role(938343343274987530)
            role3 = user.guild.get_role(938343399843561532)
            role4 = user.guild.get_role(938343518294925323)
            await user.remove_roles(role1)
            await user.remove_roles(role2)
            await user.remove_roles(role3)
            await user.add_roles(role4)

    if lvl_end <= 1400:
            role1 = user.guild.get_role(938343282742820874)
            role2 = user.guild.get_role(938343343274987530)
            role3 = user.guild.get_role(938343399843561532)
            role4 = user.guild.get_role(938343518294925323)
            role5 = user.guild.get_role(938343561504653332)
            await user.remove_roles(role1)
            await user.remove_roles(role2)
            await user.remove_roles(role3)
            await user.remove_roles(role4)
            await user.add_roles(role5)

    if lvl_end <= 1550:
            role1 = user.guild.get_role(938343282742820874)
            role2 = user.guild.get_role(938343343274987530)
            role3 = user.guild.get_role(938343399843561532)
            role4 = user.guild.get_role(938343518294925323)
            role5 = user.guild.get_role(938343561504653332)
            role6 = user.guild.get_role(938343570694352897)
            await user.remove_roles(role1)
            await user.remove_roles(role2)
            await user.remove_roles(role3)
            await user.remove_roles(role4)
            await user.remove_roles(role5)
            await user.add_roles(role6)

    if lvl_end <= 1700:
            role1 = user.guild.get_role(938343282742820874)
            role2 = user.guild.get_role(938343343274987530)
            role3 = user.guild.get_role(938343399843561532)
            role4 = user.guild.get_role(938343518294925323)
            role5 = user.guild.get_role(938343561504653332)
            role6 = user.guild.get_role(938343570694352897)
            role7 = user.guild.get_role(938343682791317515)
            await user.remove_roles(role1)
            await user.remove_roles(role2)
            await user.remove_roles(role3)
            await user.remove_roles(role4)
            await user.remove_roles(role5)
            await user.remove_roles(role6)
            await user.add_roles(role7)

    if lvl_end <= 1850:
            role1 = user.guild.get_role(938343282742820874)
            role2 = user.guild.get_role(938343343274987530)
            role3 = user.guild.get_role(938343399843561532)
            role4 = user.guild.get_role(938343518294925323)
            role5 = user.guild.get_role(938343561504653332)
            role6 = user.guild.get_role(938343570694352897)
            role7 = user.guild.get_role(938343682791317515)
            role8 = user.guild.get_role(938343755570905118)
            await user.remove_roles(role1)
            await user.remove_roles(role2)
            await user.remove_roles(role3)
            await user.remove_roles(role4)
            await user.remove_roles(role5)
            await user.remove_roles(role6)
            await user.remove_roles(role7)
            await user.add_roles(role8)

    if lvl_end <= 2000:
            role1 = user.guild.get_role(938343282742820874)
            role2 = user.guild.get_role(938343343274987530)
            role3 = user.guild.get_role(938343399843561532)
            role4 = user.guild.get_role(938343518294925323)
            role5 = user.guild.get_role(938343561504653332)
            role6 = user.guild.get_role(938343570694352897)
            role7 = user.guild.get_role(938343682791317515)
            role8 = user.guild.get_role(938343755570905118)
            role9 = user.guild.get_role(938343830053330985)
            await user.remove_roles(role1)
            await user.remove_roles(role2)
            await user.remove_roles(role3)
            await user.remove_roles(role4)
            await user.remove_roles(role5)
            await user.remove_roles(role6)
            await user.remove_roles(role7)
            await user.remove_roles(role8)
            await user.add_roles(role9)
    if lvl_end <= 20000:
            role1 = user.guild.get_role(938343282742820874)
            role2 = user.guild.get_role(938343343274987530)
            role3 = user.guild.get_role(938343399843561532)
            role4 = user.guild.get_role(938343518294925323)
            role5 = user.guild.get_role(938343561504653332)
            role6 = user.guild.get_role(938343570694352897)
            role7 = user.guild.get_role(938343682791317515)
            role8 = user.guild.get_role(938343755570905118)
            role9 = user.guild.get_role(938343830053330985)
            role10 = user.guild.get_role(938343745479376936)
            await user.remove_roles(role1)
            await user.remove_roles(role2)
            await user.remove_roles(role3)
            await user.remove_roles(role4)
            await user.remove_roles(role5)
            await user.remove_roles(role6)
            await user.remove_roles(role7)
            await user.remove_roles(role8)
            await user.remove_roles(role9)
            await user.add_roles(role10)

##################################################################################################
client.run(TOKEN)

Все нужные библиотеки импортированы и скачаны.

Видимо, в этой строке происходит деление на
0:

users[str(server.id)][str(user.id)]['win_rate'] = users[str(server.id)][str(user.id)]['win'] / users[str(server.id)][str(user.id)]['lose']

Можно сделать так, что если вдруг
LOSE равно
0, то пусть делится на
1 и ошибки не будет:

users[str(server.id)][str(user.id)]['win_rate'] = users[str(server.id)][str(user.id)]['win'] / (users[str(server.id)][str(user.id)]['lose'] or 1)

Вообще можно было бы вынести
users[str(server.id)][str(user.id)] в отдельную переменную и записать гораздо короче:

user_data = users[str(server.id)][str(user.id)]
user_data['win_rate'] = user_data['win'] / (user_data['lose'] or 1)


Как вызвать класс через скобки из себя?
Такая проблема, у нас есть класс, который инициализируется с какими-то данными.
После я хочу вызвать его как функцию, с передачей параметра, числа, как переопределить wr(14) функцию
<code>
class Work:
    def __init__(self, name, old):
        self.name = name
        self.old = old

    def __str__(self):
        return f"Name {self.name}, Old {self.old}"

    # def __new__(cls, name, old=-1):
    #     if old == -1:
    #         return 12
    #     super().__new__(cls)

wr = Work("name", "12")
print(wr)

print(wr(14))

</code>

Не совсем понятно, какое поведение вы ожидаете от такого вызова, но вы можете определить у класса специальный метод
__call__:

class Work:

    ...

    def __call__(self, old):
        self.old = old
        return self

wr = Work("name", "12")
print(wr)

print(wr(14))

Тогда ваш код выведет следующее:

Name name, Old 12
Name name, Old 14

В данном случае я сделал присвоение уже имеющемуся объекту другого значения поля
old, но можно было там создавать новый объект с таким значением поля и возвращать его. Смотря что вы хотите.


Как в Python прочитать последний символ строки?
Код на Python,  который читает из одного файла числа, умножает их и записывает в другой файл.
Нужно, чтобы вместо всей строки читался последний символ.
Код:
<code>
f = open('a.txt')
m, p = map(int, f.readline().split())
f.close()
f = open('b.txt', 'w')
f.write(str(m*p))
f.close()
</code>
Содержимое файла a.txt:
15268 14785

Я немножко ваш код поменял, но теперь оно работает так как вы хотели:

def func(line):
    return int(line[-1])

f = open('a.txt')

m, p = map(func, f.readline().split())

f = open('b.txt', 'w')

f.write(str(m * p))

f.close()

Совет от @CrazyElf в действии:

f = open('a.txt')

m, p = map(lambda line: int(line[-1]), f.readline().split())

f = open('b.txt', 'w')

f.write(str(m * p))

f.close()


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

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

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

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

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

<code>
def konus():
  r=int(input('enter r:'))
  h=int(input())
  v=1/3*3.14*r**2*h
  return v
print(konus())
</code>

Немного улучшу вот этот ответ, вам надо в начале файла импортировать встроенную библиотеку
math, и использовать оттуда переменную
pi:

import math

def konus():
  r = int(input('enter r:'))
  h = int(input())
  v = 1 / 3 * math.pi * r**2 * h

  return v

print(konus())


Почему я получаю ошибку "IndexError: list index out of range" и как ее исправить?
Цель создания данного вопроса и ответа к нему - обобщить всю информацию, относящуюся к ошибке:
<code>
IndexError: list index out of range
</code>
А также чтобы показать как определить почему и где в коде эта ошибка возникает и привести более-менее канонический ответ, чтобы ссылаться на него в будущем.
PS ответ планируется дополнять новыми примерами.

Суть этой ошибки очень проста - попытка обратиться к элементу списка/массива с несуществующим индексом.
Пример:

lst = [1, 2, 3]
print(lst[3])

вывод:

----> 2 print(lst[3])

IndexError: list index out of range

Указанный в примере список имеет три элемента. Индексация в Python начинается с
0 и заканчивается
n-1, где
n - число элементов списка (AKA длина списка).
Соответственно для списка
lst валидными индексами являются:
0,
1 и
2.
В Python также имеется возможность индексации от конца списка. В этом случае используются отрицательные индексы:
-1 - последний элемент,
-2 - второй с конца элемент, ...,
-n-1 - второй с начала,
-n - первый с начала.
Т.е. если указать отрицательный индекс, значение которого превышает длину списка мы получим всё ту же ошибку:

In [2]: lst[-4]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-2-ad46a138c96e> in <module>
----> 1 lst[-4]

IndexError: list index out of range

В реальной жизни (коде) эта ошибку чаще всего возникает в следующих ситуациях:

если список пустой:
lst = []; first = lst[0]
в циклах - когда переменная итерирования (по индексам) дополнительно изменяется или когда используются глобальные переменные
в циклах при использовании вложенных списков - когда перепутаны индексы строк и столбцов
в циклах при использовании вложенных списков - когда размерности вложенных списков неодинаковые и код этого не учитывает. Пример:
data = [[1,2,3], [4,5], [6,7,8]] - если попытаться обратиться к элементу с индексом
2 во втором списке (
[4,5]) мы получим
IndexError
в циклах - при изменении длины списка в момент итерирования по нему. Классический пример - попытка удаления элементов списка при итерировании по нему.

Поиск и устранения ошибки начинать нужно всегда с того, чтобы внимательно прочитать сообщение об ошибке (
error traceback).
Пример скрипта (
test.py), в котором переменная итерирования цикла
for <variable>
изменяется (так делать нельзя):

lst = [1,2,3]
res = []

for i in range(len(lst)):
  i += 1   # <--- НЕ ИЗМЕНЯЙТЕ переменную итерирования!
  res.append(lst[i] ** 2)

Ошибка:

Traceback (most recent call last):
  File "test.py", line 6, in <module>
    res.append(lst[i] ** 2)
IndexError: list index out of range

Обратите внимание что в сообщении об ошибке указан номер ошибочной строки кода -
File "test.py", line 6 и сама строка, вызвавшая ошибку:
res.append(lst[i] ** 2). Опять же в реальном коде ошибка часто возникает в функциях, которые вызываются из других функций/модулей/классов. Python покажет в сообщении об ошибке весь стек вызовов - это здорово помогает при отладке кода в больших проектах.
После этого - мы точно знаем в каком месте кода возникает ошибка и можем добавить в код отладочную информацию, например напечатать значения индекса, который вызвал ошибку, понять почему используется неправильный индекс и исправить ошибку.


Как получить массив индексов если для элементов массива выполняется условие? Python, Numpy
И вот я снова здесь, я хочу ускорить, улучшить, "занумпаить", то есть сделать без цикла и по
numpy-евски, вот эту конструкцию:

translated_vecs = np.array([[[ 1.94371022,  2.,          5.47115878],
                            [-0.70673817, -1.,          7.91556533],
                            [ 0.97185511,  5.,          5.23557939]],

                           [[-2.0908572,  -1.5,         9.38073238],
                            [-0.82569494,  0.88,        8.91568996],
                            [-1.09956499,  1.2,        9.62102335]]])

normals = np.array([[-0.5067397,  -0.22941573, -0.83101341],
                    [ 0.81391176, -0.34070593,  0.47060292]])

# то что идет дальше надо как-то преобразовать в numpy код

indexes = []

for i, translated_veс in enumerate(translated_vecs):
    normal = normals[i]

    if translated_veс[0] @ normal <= 0: #   -5.990392944695866  в первой итерации и  3.2238856963428164 во второй
        indexes.append(i)

# В данном примере выходит, что массив indexes будет таким [0]

# дальше идут мои преобразования с projection_vecs[indexes]

если я правильно понял вопрос:
<code>
indexes = np.where(np.diag(translated_vecs[:, 0, :] @ normals.T) <= 0)[0]
</code>
данное решение нужно будет перепроверить на большем примере данных...


Передача переменной

def buy(now="",bow="", mess_name=""):
    if now == 0 and bow == 0:
        btnAdditionZip = InlineKeyboardButton('Докупить архив', callback_data='button5', mess_name = mess_name)
        btnAdditionPasss = InlineKeyboardButton('Докупить пароль', callback_data='button5', mess_name = mess_name)
        mainAddition = InlineKeyboardMarkup(resize_keyboard = True).add(btnAdditionZip, btnAdditionPasss)

    if now == 1 and bow == 0:
        btnAdditionPass = InlineKeyboardButton('Докупить пароль', callback_data='button5', mess_name = mess_name)
        mainAddition = InlineKeyboardMarkup(resize_keyboard = True).add(btnAdditionPass)
    return mainAddition

При нажатии на кнопку button5 я передаю переменную mess_name сюда:

@dp.callback_query_handler(lambda c: c.data == 'button5')
async def process_callback_button5(mess_name,callback_query: types.CallbackQuery):
    if mess_name != None:
        mess_name = name_zip_pass
    else:
        pass
    there_money = db.user_money(callback_query.from_user.id)
    if (there_money < cost):
        message_money = cost - there_money
        comment = str(callback_query.from_user.id) + "_" + str(random.randint(1000, 9999))

        bill = p2p.bill(amount = message_money, lifetime = 15, comment = comment)
        db.add_check(callback_query.from_user.id, message_money, bill.bill_id)
        await bot.send_message(callback_query.from_user.id, f"Оплата услуги в {message_money} рублей\nСсылка на оплату: {bill.pay_url}\nКомментарий к оплате: {comment}", reply_markup=nav.buy_menu(url=bill.pay_url, bill=bill.bill_id))
    else:
        user_money = db.user_money(callback_query.from_user.id)
        db.set_money(callback_query.from_user.id, user_money-cost)
        await bot.send_message(callback_query.from_user.id, f"Вы совершили покупку!")
        await bot.send_document(callback_query.from_user.id, open(f'zip/{name_zip_pass}.zip', 'rb'), reply_markup = nav.mainPassPay)

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

process_callback_button5() missing 1 required positional argument: 'callback_query'

# Вместо этого
btnAdditionZip = InlineKeyboardButton('Докупить архив', callback_data='button5', mess_name = mess_name)
# Сделай так
btnAdditionZip = InlineKeyboardButton('Докупить архив', callback_data=f'button5:{mess_name}')

# А хендлер сделай на манер
@dp.callback_query_handler(text_startswith="button5")
async def process_callback_button5(callback_query: types.CallbackQuery):
    mess_name = callback_query.data.split(":")[1]


Найти все нужные переменные в коде и поменять их содержимое
У меня есть несколько переменных в названиях которых фигурирует слово ('string'). Количество переменных заранее не известно, но для примера рассмотрим количество 5. Я хочу у всех существующих переменных с названием 'string' сделать реплейс. Я попробовал найти все эти переменные через цикл

for i in globals():
    if 'string' in i:

Я получаю все нужные мне переменные, но сделать реплейс я в них не могу. Есть варианты как это сделать?)

Correct_SubNetwork = 'www'
Correct_MEID = 'xxx'
Correct_ENBFunctionFDD = 'zzz'
Correct_EUtranCellFDD_1 = 'yyy'

test_string1 = 'CREATE:MOC="UeEUtranMeasurement",MOI="SubNetwork=%SubNetwork%,MEID=%MEID%,ENBFunctionFDD=%ENBFunctionFDD%'
test_string2 = 'CREATE:MOC="UeEUtranMeasurement",MOI="SubNetwork=%SubNetwork%,MEID=%MEID%,ENBFunctionFDD=%ENBFunctionFDD%'
test_string3 = 'CREATE:MOC="UeEUtranMeasurement",MOI="SubNetwork=%SubNetwork%,MEID=%MEID%,ENBFunctionFDD=%ENBFunctionFDD%'
test_string4 = 'CREATE:MOC="UeEUtranMeasurement",MOI="SubNetwork=%SubNetwork%,MEID=%MEID%,ENBFunctionFDD=%ENBFunctionFDD%'
test_string5 = 'CREATE:MOC="UeEUtranMeasurement",MOI="SubNetwork=%SubNetwork%,MEID=%MEID%,ENBFunctionFDD=%ENBFunctionFDD%'

for i in range(1):          # цикл создан для того, чтобы добавить значение i в globals()
    print(i)

for i in globals():
    if 'string' in i:
        i = i.replace('%SubNetwork%', Correct_SubNetwork)
        i = i.replace('%MEID%', Correct_MEID)
        i = i.replace('%ENBFunctionFDD%', Correct_ENBFunctionFDD)
        print(i)

Можно использовать f-строки. Достаточно  поменять обычным редактором
%SubNetwork% на
{SubNetwork} и приписать f в начале строки инициализации

Correct_SubNetwork = 'www'
Correct_MEID = 'xxx'
Correct_ENBFunctionFDD = 'zzz'
Correct_EUtranCellFDD_1 = 'yyy'

test_string1 = f'CREATE:MOC="UeEUtranMeasurement",MOI="SubNetwork={SubNetwork},MEID={MEID},ENBFunctionFDD={ENBFunctionFDD}'

А если взять за основу ваш подход (что мне кажется весьма неудачным), то делать надо как-тотак

d = {}
k =  v = None
for k, v in globals().items():
    if 'string' in k:
        v = v.replace('%SubNetwork%', Correct_SubNetwork) \
             .replace('%MEID%', Correct_MEID) \
             .replace('%ENBFunctionFDD%', Correct_ENBFunctionFDD)
        d[k] = v

globals().update(d)
print(test_string4) # CREATE:MOC="UeEUtranMeasurement",MOI="SubNetwork=www,MEID=xxx,ENBFunctionFDD=zzz


Python Pygame ошибка в коде. argument 1 must be pygame.Surface, not Gun [закрыт]

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

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

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

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

File controls.py, line 34, in update

File MAIN.py, line 22, in run

File MAIN.py, line 24, in

Main.py:

import pygame
import sys
from bullet import Bullet
import controls
from gun import Gun
from pygame.sprite import Group

phon = pygame.image.load('paint\game\GameScreen.png')

def run():
    pygame.init() #иницилизация pygame
    screen = pygame.display.set_mode((0, 0),pygame.FULLSCREEN) #полный экран
    pygame.display.set_caption("Space Adventure") #Название игры
    gun = Gun(screen)
    bullets = Group()

    while True:
        controls.events(screen, phon, gun, bullets)
        gun.update_gun()
        bullets.update()
        controls.update(screen, phon, gun, bullets)

run()

bullet.py:

import pygame

class Bullet(pygame.sprite.Sprite):

    def __init__(self, screen, gun, phon):
        super(Bullet, self).__init__()
        self.screen = screen
        self.rect = pygame.Rect(0, 0, 16, 48)
        self.color = 223, 55, 55
        self.speed = 1
        self.rect.x = gun.rect.x
        self.rect.top = gun.rect.top
        self.x = float(self.rect.x)

    def update(self):
        self.x += self.speed
        self.rect.x = self.x
    def draw_bullet(self):

        pygame.draw.rect(self.screen, self.color, self.rect)

controls.py:

from operator import ne
import pygame
import sys
from bullet import Bullet

def events(screen, phon, gun, bullets):

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:          #Кнопка нажата
            if event.key == pygame.K_RIGHT: #вправо
                gun.mright = True
            if event.key == pygame.K_LEFT: #влево
                gun.mleft = True
            if event.key == pygame.K_UP: #вверх
                gun.mup = True
            if event.key == pygame.K_DOWN: #вниз
                gun.mdown = True
            if event.key == pygame.K_SPACE:
                new_bullet = Bullet(screen, phon, gun)
                bullets.add(new_bullet)
        elif event.type == pygame.KEYUP:            #Кнопка отжата
            if event.key == pygame.K_RIGHT: #вправо
                gun.mright = False
            if event.key == pygame.K_LEFT: #влево
                gun.mleft = False
            if event.key == pygame.K_UP: #вверх
                gun.mup = False
            if event.key == pygame.K_DOWN: #вниз
                gun.mdown = False

def update(screen, gun, phon, bullets):
    screen.blit(phon, (0, 0)) #обновление фона
    for bullet in bullets.sprites():
        bullet.draw_bullet()
    gun.output()
    pygame.display.flip()

gun.py:

import pygame

class Gun():

    def __init__(self, screen):

        self.screen = screen
        self.image = pygame.image.load('paint\planer\SHsprite\SH1.png') #Картинка корабля
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
        self.rect.x = self.screen_rect.x
        self.rect.y = self.screen_rect.y
        self.rect.bottom = self.screen_rect.bottom
        self.mright = False #вправо
        self.mleft = False #влево
        self.mup = False #вверх
        self.mdown = False #вниз

    def output(self):

        self.screen.blit(self.image, self.rect)
    def update_gun(self):
        if self.mright and self.rect.right <= 950: #Если нажата кнопка вправо
            self.rect.x += 2
        if self.mleft and self.rect.left >= 0: #Если нажата кнопка влево
            self.rect.x -= 2
        if self.mup and self.rect.y >= 0: #Если нажата кнопка вверх
            self.rect.y -= 2
        if self.mdown and self.rect.y <= 952: #Если нажата кнопка вниз
            self.rect.y += 2

Вот вызов функции в
main:

controls.update(screen, phon, gun, bullets)
                        ^^^^  ^^^

Вот сама функция в
controls:

def update(screen, gun, phon, bullets):
                   ^^^  ^^^^

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


Pandas и openpyxl и Nan
Есть два столбца в Excel. Один заполнен, в другом есть пустые ячейки. Задача: заменить пустые ячейки одного столбца, на значения соответствующих ячеек другого столбца. Данную задачу реализовала с помощью openpyxl :

    for i in range(2, sheet2.max_row + 1):
        if sheet2.cell(row=i, column=4).value==None:
            sheet2.cell(row=i, column=4).value=sheet2.cell(row=i, column=3).value

Хочу переписать скрипт с помощью pandas. У меня такое ощущение, что он не воспринимает NaN.
Например:

    in: data1['4'].unique()
    out: [nan '1']

Хочу заменить nan, ничего не происходит. Пробовала разные варианты.
Например:

    column_4=list(data1.iloc[:,4])
    column_3=list(data1.iloc[:,3])
    column_4=[[x for x in column_3] if x == None else x for x in column_4]

column_4-остается без изменений.
Даже если заменить на другое значение:

    column_4=["A" if x == None else x for x in column_4]

Если меняю условие:

    column_4=["A" if x != None else x for x in column_4]

Тоже он мне везде А печатает.
Есть вариант реализовать просто со столбцами, без списков?

Скорее всего пустые ячейки в Excel будут прочитаны как
NaN ("Not a Number") в Pandas. И т.к.
None !=
NaN ваш код не будет работать:

In [38]: np.nan == None
Out[38]: False

Попробуйте воспользоваться pd.Series.fillna():

In [42]: df = pd.DataFrame({"a":[1,2,3], "b":[10, np.nan, np.nan]})

In [43]: df
Out[43]:
   a     b
0  1  10.0
1  2   NaN
2  3   NaN

In [44]: df["b"] = df["b"].fillna(df["a"])

In [45]: df
Out[45]:
   a     b
0  1  10.0
1  2   2.0
2  3   3.0


регулярка python
Никак не могу понять как в пайтоне работают регулярки.
Помогите пожалуйста понять одну базовую задачу.
Допустим есть строка: "привет, я мирон123" и мне нужно вывести "мирон123"
В Lua всё было ясно:
text = text.match("привет, я (.+)"), как это же будет в пайтоне?

Если текст всегда найдётся, то можно просто:

import re
text = "привет, я мирон123"
text = re.findall(r"привет, я (.+)", text)[0]

Но в случае не соответствия исходной строки паттерну будет вызвано исключение. Можно не брать нулевой элемент, а сначала проверить, что функция вернула не None, и действовать по ситуации.
Ну или если надо, чтобы всё-равно что-то вернуло, то как вариант:

text = next(iter(re.findall(r"привет, я (.+)", text)), "")


Решение задачки
Возникла проблема при решении задачи на Python3.
Текст задачи

Ваня принес на кухню рулет, который он хочет разделить с коллегами.
Для этого он хочет разрезать рулет на
N равных частей. Разумеется,
рулет можно резать только поперек. Соотвественно, Костя сделает
N - 1 разрез ножом через равные промежутки.

По возвращению с кофе-брейка Ваня задумался — а можно ли было обойтись
меньшим числом движений, будь нож Вани бесконечно длинным (иначе
говоря, если он мог бы сделать сколько угодно разрезов за раз, если
эти разрезы лежат на одной прямой)? Считается, что места для разрезов
намечены заранее, и все разрезы делаются с ювелирной точностью.
Оказывается, что можно. Например, если Ваня хотел бы разделить рулет
на четыре части, он мог бы обойтись двумя разрезами — сначала он
разделил бы рулет на две половинки, а потом совместил бы две половинки
и разрезал обе пополам одновременно.
Вам дано число
N, требуется сказать, каким минимальным числом
разрезов можно обойтись.
Формат входных данных
Дано одно натуральное число
N (1≤N≤2000000000) — количество людей на кофе-брейке.

Формат выходных данных
Выведите одно число — минимальное число движений, которое придется
сделать Косте.

Замечание
Чтобы разрезать рулет на
6 частей, Ване сначала придется разрезать
его на две равные части, после чего совместить две половинки и сделать
два разреза.
Чтобы разрезать рулет на
5 частей, Ване понадобится разделить его в
соотношении
2:3, после чего совместить два рулета по левому краю
и разрезать больший рулет на одинарные кусочки — меньший тоже
разделится на одинарные."

Решил ее я так:

a = int(input())
b = 2
c = 1
while (b<=a):
    c+=1
    b=2**c
if a-b!=0 and a-b>0:
    c+=1
print(c)

Проверяющая программа пишет что решение частичное, но почему я понять не могу. Только изучаю питон и буду благодарен за подсказку или совет где искать ошибку.

Ваша программа ошибается для небольших N:

N     ваш   должно
     ответ   быть

1      1      0          # ошибка
2      2      1          # ошибка
3      2      2
4      3      2          # ошибка
5      3      3
6      3      3
7      3      3
8      4      3          # ошибка

Пусть fN - минимальное число разрезаний для N кусков. Какие у него есть свойства?

f1 = 0 - ничего резать не надо если вы завтракаете в одиночестве.

f2N ≤ 1 + fN - если число разрезов чётное, то режем рулет строго пополам, две половинки кладём рядом и следуем решению для N разрезов.

fN > k, если N > 2k. Каждый разрез в лучшем случае удваивает число кусков. Лучший результат для k разрезов - 2k кусков. Если требуется больше кусков, нужно и больше разрезов.

fN+1 ≥ fN - неубывание. Разрезание для большего числа кусков годится и для меньшего числа кусков.

Из 1, 2 получается ответ для степеней двойки (N = 2k): по индукции f2k ≤ k. Способ разрезания - k раз режем все куски пополам: f2k = k.
Если N между соседними степенями двойки (2k-1 < N < 2k), то из монотонности следует k-1 ≤ fN ≤ k. Из третьего пункта k-1 < fN. Следовательно fN = k.
В итоге нам надо найти
ceil(log_2(N)):

n = int(input())

e = 0
p = 1
while p < n:
    e += 1
    p *= 2
print(e)

P.S. В Питоне задачу можно решить в виде замкнутой формулы.
n.bit_length() возвращает длину числа в битах. Это почти то что нам нужно - формула ошибается на единицу на точных степенях двойки, для остальных чисел ответ верный. Проверить что число точная степень двойки можно так:
n & (n - 1) == 0. Операция
n & (n - 1) стирает младший ненулевой бит числа. Если число "стёрлось" до нуля, значит единичный бит в нем был только один, значит это была степень двойки.
Программа:

n = int(input())
print(n.bit_length() - (n & (n - 1) == 0))

P.P.S. Битовые хитрости не нужны. Предыдущее выражение просто-напросто равно
(n - 1).bit_length():

print((int(input()) - 1).bit_length())


Читаю лист с данными в формате txt, out of range
Ошибка out of index Пытаюсь получить значения из файла txt, как я понимаю в конце файла есть один символ при попытки его применить срез, появляется эта ошибка, каким if можно избавиться от этого?
<code>
d_airports = {}
file = open("list_airports.txt", encoding="utf-8" ,mode ='r')
for i in file.readlines():

    if i !=  '\\t':
        print(i.split(' — ')[1].split(', ')[0])
        d_airports[i[0:3]] = i.split(' — ')[1].split(', ')[0]

file.close()
</code>
последняя строчка файла ZZV — Занесвилл, США, Занесвилл
`

Лучше проверять на пустую строку так:

if i.strip():
    # действия

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

try:
    # действия
except:
    print("Случилась ошибка!")


Как сохранить записи из терминала в файл
Имеется код для Python который подключается к базе данных и select вытаскивает необходимые мне данные. Вот код
<code>
import cx_Oracle

conn_str = u'login/password@ip/user'
conn = cx_Oracle.connect(conn_str)
c = conn.cursor()
c.execute(u"SELECT subs_subs_id, number_history, navi_user FROM subs_histories WHERE subs_subs_id IN (SELECT subs_subs_id FROM subs_histories where end_date < start_date GROUP BY subs_subs_id HAVING COUNT(*) > 1) and start_date > '01.12.2021' and end_date < '02.12.2021' ORDER BY subs_subs_id, start_date, end_date")
for row in c:
    print (row[0], "-", row[1], "-", row[2], "-", row[3], "-", row[4])
conn.close()
with open('text_out.txt', 'w', encoding="utf8") as f:
    f.write(row[0], row[1], row[2])
f.close()
</code>
НЕ получается сохранить полученные данные в txt файл, в чём моя проблема?

import cx_Oracle

conn_str = u'rep_server/[email protected]:1521/bisprim'
conn = cx_Oracle.connect(conn_str)
c = conn.cursor()
c.execute(u"SELECT subs_subs_id, number_history, navi_user FROM subs_histories WHERE subs_subs_id IN (SELECT subs_subs_id FROM subs_histories where end_date < start_date GROUP BY subs_subs_id HAVING COUNT(*) > 1) and start_date > '01.12.2021' and end_date < '02.12.2021' ORDER BY subs_subs_id, start_date, end_date")

with open('text_out.txt', 'w', encoding="utf8") as f:
    for row in c:
        print(row[0], "-", row[1], "-", row[2], file=f)
conn.close()


Составьте программу, печатающую строку: «ABBCDD…ZZ»
<code>
s=''
for i in range(ord('A'), ord('Z')+1):
    s+=2*chr(i)
print(s)
</code>

в range второй параметр должен быть больше, чем последнее значение которое вы хотите получить. в данном случае можно прибавить единицу. А чтобы чередовались 1/2 символа можно использовать остаток от деления индекса на 2
<code>
for i in range(ord('A'), ord('Z')+1):
   s += ((i+1)%2 + 1)*chr(i)
print(s)   #  ABBCDDEFFGHHIJJKLLMNNOPPQRRSTTUVVWXXYZZ
</code>


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

def get_normal(translated_vec):
    print(translated_vec)
    line1 = translated_vec[1] - translated_vec[0]
    line2 = translated_vec[2] - translated_vec[0]

    normal = np.array([line1[1] * line2[2] - line1[2] * line2[1],
                       line1[2] * line2[0] - line1[0] * line2[2],
                       line1[0] * line2[1] - line1[1] * line2[0]])

    l = sqrt(sum(np.power(normal, 2)))
    if l != 0:
        normal /= l
    else:
        normal += 1.73205080757

    return normal

translated_vec = np.array([[[ 0.07243389, -0.462265,    4.87585974],
                           [ 0.13487457, -0.3653465,   5.06419032],
                           [ 0.20468741, -0.1275775,   4.95642205]],
                          [[-0.0753569,  -0.142866,    4.75400399],
                           [ 0.12289676, -0.1275775,   4.83061181],
                           [ 0.02365434,  0.2133755,   4.71171791]]])

while True:
    for i, translated_vec in enumerate(translated_vecs):
         normal = get_normal(translated_vec)

Вариант без цикла:

def get_normals(translated_vec):
    line1 = translated_vec[:, 1] - translated_vec[:, 0]
    line2 = translated_vec[:, 2] - translated_vec[:, 0]

    normal = np.cross(line1, line2)

    # Здесь фрагмент на котором я застрял

    sqrts = np.array([np.linalg.norm(n) for n in normal])

    # l = np.linalg.norm(normal)
    normal /= sqrts[:,np.newaxis]
    # if l != 0:
    #     normal /= l
    # else:
    #     normal += 1.73205080757

    return normal

translated_vec = np.array([[[ 0.07243389, -0.462265,    4.87585974],
                           [ 0.13487457, -0.3653465,   5.06419032],
                           [ 0.20468741, -0.1275775,   4.95642205]],
                          [[-0.0753569,  -0.142866,    4.75400399],
                           [ 0.12289676, -0.1275775,   4.83061181],
                           [ 0.02365434,  0.2133755,   4.71171791]]])

while True:
     normal = get_normals(translated_vec)

На выходе должно получиться это:

[-0.93211486  0.33550072  0.13638602] # Нормаль первого полигона

[-0.36645627  0.20945855  0.90655222] # Нормаль второго полигона

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

Можно немного оптимизировать ваше решение:

def get_normals(translated_vec):
    line1 = translated_vec[:, 1] - translated_vec[:, 0]
    line2 = translated_vec[:, 2] - translated_vec[:, 0]

    normal = np.cross(line1, line2)
    # NOTE: ---------------------------->  vvvvvv
    return normal / np.linalg.norm(normal, axis=1).reshape(len(normal), -1)

проверка:

In [37]: get_normals(translated_vec)
Out[37]:
array([[-0.93211486,  0.33550072,  0.13638602],
       [-0.36645627,  0.20945855,  0.90655222]])


Ошибка django 2.1. This engine did not provide a list of tried templates
учу django и возникает ошибка

Using engine django:
This engine did not provide a list of tried templates.

Код снизу
views.py

from django.shortcuts import render
from django.http import *
from .models import Bb, Rubric

def index(request):
    bbs = Bb.objects.all()
    rubrics = Rubric.objects.all()
    context = {'bbs': bbs, 'rubrics': rubrics}
    return render(request, '/Users/tim/PycharmProjects/djangobook/bboard/index.html', context)
def by_rubric(request, rubric_id):
    bbs = Bb.objects.filter(rubric=rubric_id)
    rubrics = Rubric.objects.all()
    current_rubric = Rubric.objects.get(pk=rubric_id)
    context = {'bbs': bbs, 'rubrics': rubrics, 'current_rubric': current_rubric}
    return render(request, '/Users/tim/PycharmProjects/djangobook/bboard/by_rubric.html', context)

index.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Главная-доска объявлений</title>
</head>
<body>
        <h1>Объявления</h1>
        <div>
            <a href ="/bboard/">Глвная</a>
            {% for rubric in rubrics %}
            <a href="/bboard/ {{ rubric.pk }}/"> {{ rubric.name}}</a>
            {% endfor %}
        </div>
        {% for bb in bbs %}
        <div>
            <h2>{{ bb.title }}</h2>
            <p>{{ bb.content }}</p>
            <p><a href="/bboard/ {{ bb.rubric.pk }}/" >{{ bb.rubric.name }}</a></p>
            <p>{{ bb.published|date:"d.m.Y H:i:s" }}</p>
        </div>
        {% endfor %}
    </body>
</html>

by_rubric.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <head>
        <meta http-equiv="Content-Type"
        content = "text/html; charset = utf-8">
        <title>{{ current_rubric.name}} - Доска объявлений</title>
    </head>
    <body>
        <h1>Объявления</h1>
        <h2>Рубрика: {{current_rubric.name }}</h2>
        <div>
            <a href="/bboard/">Главная</a>
            {% for rubric in rubrics %}
            <a href = "/bboard/ {{ rubric.pk }}/">{{ rubric.name }}</a>
            {% endfor %}
        </div>
        {% for bb in bbs %}
        <div>
            <h2>{{ bb.title }}</h2>
            <p>{{ bb.content}}</p>
            <p>{{ bb.published|date:"d.m.Y H:i:s" }}</p>
        </div>
        {% endfor %}
    </body>
</html>

Оказывается ошибка в том что html файлы у меня хранились вместе с файлами .py, а нужно было создать папку templates и туда поместить файлы html


Как из url удалить часть параметров
Получаю параметры с помощью urllib:

from urllib import parse

for url in urls:
    all_instances = parse.urlparse(url).query
    dict_from_query = parse.parse_qs(query)

Есть список ненужных параметров:

qw = ["perpage", "h"]

И список ссылок:

urls = ["google.com/news?page=1&perpage=20", "google.com/news?h=34748fdg&page=20", "google.com/news?h=jshjdfh5&perpage=20"]

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

urls = ["google.com/news?page=1", "google.com/news?page=20", "google.com/news"]

В данном случае лучше воспользоваться готовыми решениями
<code>
for i in range(len(urls)):
    url = parse.urlparse(urls[i])
    # получаем query в виде списка кортежей
    query = parse.parse_qsl(url.query)
    newQuery = dict()
    for k, v in query:
        # берем только нужные
        if k not in qw:
            newQuery[k] = v
    # строим новый урл
    # Результат urlparse не позволяет обновлять атрибуты,
    # но можно создать копию с измененными данными
    newUrl = url._replace(query=parse.urlencode(newQuery))
    urls[i] = parse.urlunparse(newUrl)

print(urls)  #  ['google.com/news?page=1', 'google.com/news?page=20', 'google.com/news']
</code>


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

button = ['тут какой то текст \n поделеный на строчки \n вот таким образом']
Задача состоит в том, что мне нужно вытащить каждую строчку и поместить их в разные переменные, например:

stro1 = "тут такой то текст"

stro2 = "поделеный на строчки"
подскажите, возможно глупый вопрос, но все же?)

button = ['some text \n another text \n that way']

splited_button = button[0].split("\n")

stro1 = splited_button[0]
stro2 = splited_button[1]
stro3 = splited_button[2]


Как решить задачу № 7 из Проекта Эйлера оптимизированно
я уже сделал решение этой задачи на Python, однако возникла проблема. На сайте самого проекта говорится, что решение должно занимать не более минуты.
Моё занимает 7.
Мне хотелось бы услышать допущенные оптимизационные ошибки и чуть-чуть утешения(
Вот мой код:

y = 1
counter = 0
ist = False

def is_prime(x):
    global ist
    s = 0
    for i in range(2, x):
        if x % i == 0:
            s += 1
    if s == 0:
        ist = True

while True:
    y += 1
    is_prime(y)
    if ist is True:
        ist = False
        counter += 1
    if counter == 10001:
        print(y)
        break

Также я нашёл чужой, уже оптимизированный код:

A = [1] * 1000000
A[0] = A[1] = summa = 0
for i in range(2, 1000000, 1):
    if A[i]:
        for m in range(2 * i, 1000000, i):
            A[m] = 0
        summa = summa + A[i]
    if summa == 10001:
        print(summa)
        print("Наше число " + str(i))
        break

P.S. Правильный ответ: 104743.

ох, посмотрел на это и решил, что нужно показать свой вариант.
<code>
import math

def is_prime(x):
    for i in range(3, int(math.sqrt(x)+1), 2):
        if x % i == 0:
            return False
    return True

y = 1
counter = 1

while counter != 10001:
    y += 2
    if is_prime(y):
        counter += 1

print(y)
</code>
время выполнения - около одной десятой секунды


Как добавить в выпадающий список выбираемые элементы PyQt5
Я хочу добавить в выпадающий список выбор элементов из списка, который парсится в процессе выполнения программы.
Я сделал графический интерфейс с помощью Qt Designer, но без добавления комбобоксов.
Подгрузил его с помощью:

app = QtWidgets.QApplication([])
ui = uic.loadUi('hwmon.ui')
...
ui.show()
app.exec()

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

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtGui import QFont
import sys

# subclass
class CheckableComboBox(QtWidgets.QComboBox):
    # once there is a checkState set, it is rendered
    # here we assume default Unchecked
    def addItem(self, item):
        super(CheckableComboBox, self).addItem(item)
        item = self.model().item(self.count() - 1, 0)
        item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
        item.setCheckState(QtCore.Qt.Unchecked)

    def itemChecked(self, index):
        item = self.model().item(i, 0)
        return item.checkState() == QtCore.Qt.Checked

# the basic main()
app = QtWidgets.QApplication(sys.argv)
dialog = QtWidgets.QMainWindow()
dialog.setGeometry(450, 450, 450, 450)
mainWidget = QtWidgets.QWidget()
dialog.setCentralWidget(mainWidget)
ComboBox = CheckableComboBox(mainWidget)
ComboBox.setGeometry(20, 210, 181, 26)
font = QFont('Century Gothic', 11)
ComboBox.setFont(font)

dialog.show()
sys.exit(app.exec_())

Мне нужно как-то поместить в ui файл этот подкласс, или как-то запускать их вместе.
Работать с полноценными классами не мой вариант.

Не имею под рукой PyQt5, но насколько я помню надо делать так:
(лучше) Создайте для вашего
CheckableComboBox отдельный файл
CheckableComboBox.py и перенесите туда исходный код вашего комбо.
Далее, запустите
QtDesigner и поместите в нужное место стандартный QComboBox, затем нажмите на нем
ПКМ и в выпадающем меню, выберите пункт
"Преобразовать в...".
В открывшемся диалоге введите следующее:

В поле
Имя преобразованного класса:
CheckableComboBox
В поле
Заголовочный файл: -
CheckableComboBox.py (по умолчанию будет
.h в конце, надо чтобы было
.py)
Нажмите кнопку
"Добавить"

Далее перейдите в файл, в котором вы загружаете ui и импортируйте в него
CheckableComboBox

# Если CheckableComboBox.py на одном уровне с main.py, или как там у вас называется
# файл с точкой входа, то так
from CheckableComboBox import CheckableComboBox

Теперь перед загрузкой
.ui надо сделать следующий вызов:

sys.modules['CheckableComboBox'] = CheckableComboBox
ui = uic.loadUi(...)

Если ничего не забыл, то должно подхватиться. Проверяйте


Открытие wav файла
У меня есть данный код:

import wave, struct
bad = False
wf = wave.open('recorded.wav', 'wb')

wf.setnchannels(channels) wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(sample_rate)
if randint(0, 2) == 1:
    bad = False
    wf.writeframes(b''.join(get_one())) else:
    data = []
    r = sample_rate
    if not bad:
        data.extend([3263 for i in range(850)])
        bad = True
        r -= 850
    for i in range(r):
        data.append(0)
    wf.writeframes(struct.pack('<' + str(len(data)) + 'h', *data)) wf.close()

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

Traceback (most recent call last):
  File "C:\Users\user\PycharmProjects\BadConn\main.py", line 13, in <module>
    bad = loop(bad)
  File "C:\Users\user\PycharmProjects\BadConn\engine.py", line 36, in loop
    wf = wave.open('recorded.wav', 'wb')
  File "C:\Python310\lib\wave.py", line 511, in open
    return Wave_write(f)
  File "C:\Python310\lib\wave.py", line 304, in __init__
    f = builtins.open(f, 'wb')
PermissionError: [Errno 13] Permission denied: 'recorded.wav'
Exception ignored in: <function Wave_write.__del__ at 0x000001C3FDE3D630>
Traceback (most recent call last):
  File "C:\Python310\lib\wave.py", line 326, in __del__
    self.close()
  File "C:\Python310\lib\wave.py", line 443, in close
    if self._file:
AttributeError: 'Wave_write' object has no attribute '_file'

В чём заключается ошибка и как её исправить? PermissionError пробовал убрать, запуская через консоль с правами администратора, но не помогло

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

<code>
with wave.open('recorded.wav', 'wb') as wf:
    ...
</code>

Проверьте, что файл не занят другой программой - например, предыдущим запуском вашего же скрипта, не закрывшего файл, либо какой-то программой, которой вы сгенерированный файл потом открыли.
Проверьте, из какого каталога вы запускаете скрипт. Без явного указания пути записи файла, файл будет создаваться в текущем каталоге запуска скрипта (это не обязательно каталог, где расположен сам скрипт, вы можете его запускать, находясь в совсем другом каталоге). Даже у администратора (локального) может не быть прав на запись в некоторые каталоги (например, в какие-то сетевые каталоги).


Объясните код на питоне [закрыт]

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

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

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

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

Это решение задачи на полуразность чисел, но я не понимаю сам код, а особенно 3 строчку. Кто нибудь может мне объяснить этот код?
<code>
a = int(input())
b = int(input())
x, y = (a + b), (a - b) / 2
if a > b:
    print(x, y)
elif a < b:
    print(y, x)
else:
    print(a, b)
</code>

Разбираем по частям:

x, y = (a + b), (a - b) / 2

это то же самое что

(x, y) = ((a + b), (a - b) / 2)

Здесь элементам кортежа (tuple) слева присваиваются элементы из кортежа справа (прием называется "распаковка"), т.е. получается, что:

x = (a + b)
y = (a - b) / 2

И без "вывертов" ваш код можно записать так:

a = int(input())
b = int(input())

x = a + b
y = (a - b) / 2

if a > b:
    print(x, y)
elif a < b:
    print(y, x)
else:
    print(a, b)


Как соединить строки из файла?
Есть текстовый файл с большим количеством строк. Нужно соединить строки: первую со второй, третью с четвертой итд. То есть, по идее, после каждой нечетной строки удалить /n.
Вот что пробовалось, как-то не получилось:
<code>
with open('dss2.txt','r+', encoding="utf8") as f:
    lines = f.readlines()
with open("dss2.txt", 'w', encoding="utf8") as fp:
    for n, line in enumerate(lines):
        if n % 3 != 0:
            line.rstrip('\n')
            fp.write(line)

print(lines)
</code>

Ну как-то так правильно наверное:

        if n % 2 == 0:               # правильная проверка на нечётность
            line = line.rstrip('\n') # не забываем присвоить в переменную
        fp.write(line)               # следим за табуляцией

проверка на нечётность это
n % 2 == 0 (нулевой остаток от деления на 2, поскольку в питоне первая строчка это нулевая)
обрезанную строчку нужно присвоить обратно в переменную
выводить нужно все строки (у вас лишняя табуляция)

И смотрите после этого сам файл, а то, что печатается у вас в конце, это исходный файл.
Ещё можно в
enumerate указать вторым параметром
1, чтобы нумерация привычно начиналась с 1, а не с 0. И условие тогда можно проверять просто
if n % 2:.


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

d = {'name': ['rick, mike, morty', 'tot, piter, carl', 'brick, nick', 'rick, reaven, bart, homer', 'rick, morty'],
     'Date': ['11/05/2011', '9/02/2010', '1/01/2014', '12/20/2020', '9/30/2009'],
     'Address': ['AR', 'YU', 'RU', 'EU', 'BY']}
df = pd.DataFrame(data = d)

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

d1 = {'name': ['rick, mike, morty', 'tot, piter, carl', 'brick, nick', 'rick, reaven, bart, homer', 'rick, morty', 'Nan'],
     'Date': ['11/05/2011', '9/02/2010', '1/01/2014', '12/20/2020', '9/30/2009', 'Nan'],
     'Address': ['AR', 'YU', 'RU', 'EU', 'BY', 'VR']}
df1 = pd.DataFrame(data = d1)

Причём, желательно обойтись без перебора функцией for.

Вариант 1:

df.loc[len(df)] = [np.nan, np.nan, 'VR']

Вариант 2:

df = df.append(dict(Address="VR"), ignore_index=True)

Вариант 3:

df = df.append(pd.Series("VR", name=len(df), index=["Address"]))


Как изменить поведение JsonDecoder
у меня в json строке есть
datetime.datetime. Мне требуется, чтобы
JsonDecoder парсил
datetime.datetime, как объект. Я уже нашёл, как это можно сделать:

import ast
import datetime
from operator import attrgetter

value_from_db = "datetime.datetime(2019, 6, 10, 00, 00)"

expr, = ast.parse(value_from_db).body
dt_value = datetime.datetime(*map(attrgetter('n'), expr.value.args))

print(dt_value)

Теперь мне нужно, чтобы при использование
json.loads, это делалось автоматически.
Пример того, как должно работать:

json_string = '{"last_updated": {"$gte": datetime.datetime(2022, 1, 19, 0, 0)}}'
dct = json.loads(json_string)
print(dct) # -> {"last_updated": {"$gte": datetime.datetime(2022, 1, 19, 0, 0)}}

Заранее спасибо!

Object_hook выполняется после десериализации, поэтому вам все равно нужен валидный json. Но вы можете передать datetime объект в виде строки и сделать следующим образом:
<code>
import json
import datetime

def objHook(dst):
    for k,v in dst.items():
        if isinstance(v, str) and v.startswith('datetime.datetime'):
            args = v.replace('datetime.datetime(', '').replace(')','').replace(' ', '').split(',')
            args = map(int, args)
            dst[k] = datetime.datetime(*args)
    return dst

json_string = '{"last_updated": {"$gte": "datetime.datetime(2022, 1, 19, 0, 0)"}}'
dct = json.loads(json_string, object_hook=objHook)
print(dct)  #  {'last_updated': {'$gte': datetime.datetime(2022, 1, 19, 0, 0)}}
</code>


Ошибка при наследовании в Python
Пытаюсь разобраться с наследованием в Python. Столкнулся с тем, что при попытке вызвать переменные из родителей, могу вызвать только переменную
a и собственно переменную
f, с вызовом методов так же. Чем это вызвано (Если не сложно, то хотелось бы почитать источники с действительно полезной информацией), и можно ли как то это исправить чтобы из всех классов вызывались методы и переменные?

class a:
    def __init__(self):
        self.a = 1

class b:
    def __init__(self):
        self.b = 2

    def b_print(self):
        print(self.b)

class c:
    def __init__(self):
        self.c = 3

class f(a, b, c):
    def __init__(self):
        super().__init__()
        self.f = 4

    def pprint(self):
        try:
            print(self.a)
        except:
            print('a: Не обнаружено')
        try:
            print(self.b)
        except:
            print('b: Не обнаружено')
        try:
            print(self.c)
        except:
            print('c: Не обнаружено')
        try:
            print(self.f)
        except:
            print('f: Не обнаружено')

cl = f()
print(f.__mro__)
cl.pprint()
cl.b_print()

Вывод кода:

(<class '__main__.f'>, <class '__main__.a'>, <class '__main__.b'>, <class '__main__.c'>, <class 'object'>)
1
b: Не обнаружено
c: Не обнаружено
4
Traceback (most recent call last):
  File "c:\DEV\oop\test.py", line 43, in <module>
    cl.b_print()
  File "c:\DEV\oop\test.py", line 10, in b_print
    print(self.b)
AttributeError: 'f' object has no attribute 'b'

т.к
super() берет только первого родителя, то как заметил @splash58, тут нужно будет делать руками, но если такой возможности нет, можно сделать так:

class D(A, B, C):

    def __init__(self):
        for parent in self.__bases__:
            parent.__init__(self)


Ускорить работу функции
Помогите оптимизировать код. Написал такую функцию:

def vp(df):
    df_v=df.groupby('col1').sum().reset_index()
    df['target']=0
    for i in range(0, (len(df)-1)):
        for j in range (0, (len(df_v)-1)):

            if  df_v['col1'][j] == df['col1'][i]:

                df['target'][i]=df_v['vol'][j]
    return df

Проблема в том, что она работает медленно на больших наборах, как ее можно ускорить?
Пример входных данных:
dict= {'col1':[1, 2, 3, 1, 3, 5, 1], 'vol':[10, 15, 10, 20, 10, 15, 10]}

Если я правильно понял вопрос - вы можете воспользоваться GroupBy.transform():

df["target"] = df.groupby("col1")["vol"].transform("sum")

результат:

In [49]: df
Out[49]:
   col1  vol  target
0     1   10      40
1     2   15      15
2     3   10      20
3     1   20      40
4     3   10      20
5     5   15      15
6     1   10      40

PS на будущее - вопрос должен включать описание алгоритма, а не только код, который вы хотите исправить или улучшить. Также стоит приводить в вопросе желаемый результат.
Советую ознакомиться: Как наиболее эффективно задать вопрос, связанный с обработкой и/или анализом данных (например: по Pandas / Numpy / SciPy / SciKit Learn / SQL)


pycharm не принимает none. Выдает ошибку invalid syntax [закрыт]

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

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

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

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

<code>
itsdict = ["first", 23, 43, 66, "second", 3838, 32, -223, "third", 995, 5, 2]
mydict = {}
currentstring = none
for element in itsdict:
    if(type(element) == str):
    mydict[element] = []
    currentstring = element
else:
    mydict[currentstring].append(element)
print(mydict)
</code>

Попробуйте так:
<code>
currentstring = 'None'
currentstring = None
</code>
оба варианта работают


работа с циклами и списками
помогите пожалуйста, как организовать программу так, чтобы она удаляла с каждым разом всё больше значений? у меня прога прогоняет, например, ABCDEF типо сначала A удалит, вернёт список, потом B, возвращает, потом С... и так по кругу.
Я не понимаю как заставить её работать так, чтоб после первого цикла она начал удалять AB, AC, AD... потом BA, BC, ну вы поняли. Я не понимаю как всучить сюда ещё один цикл, и куда переставить возврат строки.
помогите, извините что много букв

def sga235():
    global n
    global sum
    for i in range(len(n)):
        if i != 0:
            del n[i]
        for j in range(len(n)):
            del n[j]
            s1 = ''.join(n)
            if s1 == s1[::-1]:
                sum += 1
            n = list(s)
s = input()
sum = 0
n = list(s)
for i in range(1, len(n) + 1):
    for j in range(i):
        sga235()
print(sum)

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

def sga235():
    global n
    global sum
    for i in range(len(n)):
        del n[i]
        s1 = ''.join(n)
        if s1 == s1[::-1]:
            sum += 1
        n = list(s)

s = input()
sum = 1
n = list(s)
for i in range(1, len(n) + 1):
    for j in range(i):
        sga235()
print(sum)

выше я пытался всунуть ещё один цикл, но как видите, не получилось.

Достаточно просто задача делается при помощи itertools.combinations

import itertools

string = 'HEIHEH'
cnt = 0

i = len(string)
while i:
    for s in itertools.combinations(string, i):
        if s == s[::-1]:
            cnt += 1
    i -= 1
print(cnt)   # 22

Трехстрочник для любителей однострочников

print(sum(s == s[::-1] \
      for i in range(1, len(string)+1) \
      for s in itertools.combinations(string, i)))


Оптимизированное умножение матриц. Numpy
У меня есть массив
obj, в котором хранятся матрицы, каждый из которых мне надо умножить на матрицу
projection_vec. Когда программа перебирает все элементы
obj, и умножает каждый из них на
projection_vec, и тогда результаты умножения такие какие мне нужны, но когда программа умножает сразу весь массив
obj на
projection_vec, результаты немного отличаются, я не знаю как это исправить, так как умножение сразу всего массива
obj в разы быстрее чем перебирать и умножать каждый элемент массива по отдельности, скажите пожалуйста что мне нужно изменить во втором фрагменте кода, чтобы результаты были как в первом фрагменте, но при этом код выполнялся с такой же скоростью (или даже быстрее) как второй фрагмент.
Фрагмент 1

import numpy as np
from math import *

def matrix_multiply(inp_tri, matrix):
    out_tri = inp_tri @ matrix[:3, :3] + matrix[3, :3]
    w = inp_tri @ matrix[:3, 3] + matrix[3, 3]
    w[w == 0] = 1.0
    out_tri = out_tri / w[:, None]

    return out_tri

perspective_matrix = np.array([
        [(1.0 / tan(45 / 180 * pi)), 0.0, 0.0, 0.0],
        [0.0, (WIDTH / HEIGHT) * (1.0 / tan(45 / 180 * pi)), 0.0, 0.0],
        [0.0, 0.0, 1.0, 1.0],
        [0.0, 0.0, -1.0, 0.0]
    ])

def get_projection(translated_vec):
    projection_vec = matrix_multiply(translated_vec, perspective_matrix)

    projection_vec += 1.0
    projection_vec = projection_vec * H_SIZE

    return projection_vec

obj = np.array([[
        [0, 0, 0],
        [1, 1, 1],
        [-2, -2, 2]
    ],
    [
        [1, 1, 1],
        [0, 1, 2],
        [-2, -2, -2]
    ]])

drawig_obj = []

for i, translated_vec in enumerate(obj):
    translated_vec = get_projection(translated_vec)

    drawing_obj.append(translated_vec)

print(drawing_obj)

Выходные данные:

[(array([[            nan,             nan,            -inf],
       [ 1.28000000e+03,  1.00000000e+03,  1.00000000e+00],
       [-1.42108547e-13, -2.80000000e+02,  1.50000000e+00]]), (255, 255, 255)), (array([[1.28e+03, 1.00e+03, 1.00e+00],
       [6.40e+02, 6.80e+02, 1.50e+00],
       [1.28e+03, 1.00e+03, 2.50e+00]]), (255, 255, 255))]

Фрагмент 2

import numpy as np
from math import *

def matrix_multiply(inp_tri, matrix):
    out_tri = inp_tri @ matrix[:3, :3] + matrix[3, :3]
    w = inp_tri @ matrix[:3, 3] + matrix[3, 3]
    w[w == 0] = 1.0
    out_tri = out_tri / w[:, None]

    return out_tri

perspective_matrix = np.array([
        [(1.0 / tan(45 / 180 * pi)), 0.0, 0.0, 0.0],
        [0.0, (WIDTH / HEIGHT) * (1.0 / tan(45 / 180 * pi)), 0.0, 0.0],
        [0.0, 0.0, 1.0, 1.0],
        [0.0, 0.0, -1.0, 0.0]
    ])

def get_projection(translated_vec):
    projection_vec = matrix_multiply(translated_vec, perspective_matrix)

    projection_vec += 1.0
    projection_vec = projection_vec * H_SIZE

    return projection_vec

obj = np.array([[
        [0, 0, 0],
        [1, 1, 1],
        [-2, -2, 2]
    ],
    [
        [1, 1, 1],
        [0, 1, 2],
        [-2, -2, -2]
    ]])

projection_vecs = get_projection(obj)

print(projection_vecs)

Выходные данные:

[(array([[ 6.40e+02,  3.60e+02,  5.00e-01],
       [ 1.28e+03,  1.00e+03,  1.00e+00],
       [-6.40e+02, -9.20e+02,  1.50e+00]]), (255, 255, 255)), (array([[ 1.28e+03,  6.80e+02,  1.00e+00],
       [ 6.40e+02,  6.80e+02,  5.00e-01],
       [-6.40e+02, -2.80e+02,  2.50e+00]]), (255, 255, 255))]

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

out_tri = out_tri / w[:, None]

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


Задача на циклы в Python
Есть список дат, в котором дню отдали один символ, а месяцу - два (все даты корректны, несуществующих дней нет). Сравните данные из списка с текущей датой. Если дата в списке совпадает с сегодняшней - вывести
True, если нет -
False.

dates_list = ['11.07', '23.01', '3.12', '4.09', '10.03', '14.02', '2.05']

Что смог сделать:

# Сперва создаю переменные, которые будут проверять текущую дату (день и месяц):

import datetime

day = datetime.datetime.now().day # возвращает текущий день 1-31 без 0
month = datetime.datetime.now().month # возвращает текущий месяц 1-12 без 0

# привожу month к нужному виду:

if len(str(month)) == 1:
    month = '0' + str(month)

# теперь month 01-12

А что делать дальше - не пойму, какой цикл создать, как пройтись по дням и месяцам в списке.
Заранее благодарю за помощь и потраченное время.

В одну строку

print(f"{day}.{month}" in dates_list)

f-строка понимает переменные в фигурных скобках, а далее вы просто спрашиваете "Есть ли данная строка в списке"
На выходе будете иметь одно из булевых значений
True/False
вызовем с начальным списком

dates_list = ['11.07', '23.01', '3.12', '4.09', '10.03', '14.02', '2.05']
print(f"{day}.{month}" in dates_list)

# out
# False

Добавим дату от сегодня и снова проверим

dates_list.append("31.01")
print(f"{day}.{month}" in dates_list)

# out
# True


Ошибка типа данных при их передаче между скриптами Python
у меня такая проблема: передаю из script1 данные в script2, на выходе первого и на входе второго типы отличаются(лог), почему так и как это можно поправить?
Script 1:

class Transcriber:

    def __init__(self, wf, model):
        self.wf = wf
        self.model = model
        print('trans1')

        self._transcriber()

    def _transcriber(self):
        rec = KaldiRecognizer(self.model, self.wf.getframerate())
        final_result = ''
        print('trans2')

        while True:
            data = self.wf.readframes(4000)
            if len(data) == 0:
                break

            if AcceptWaveform(data):
                result = json.loads(rec.Result())
                final_result += result['text']
        print(type(final_result))
        print('trans3')
        return final_result

script2:

print('7')
logging.info('starting transcription...')
result = transcriber.Transcriber(wf, model)
print('trans_result')
print(type(result))
print('7.5')

log:

7
INFO root:starting transcription...
trans1
trans2
<class 'str'>
trans3
trans_result
<class 'transcriber.Transcriber'>
7.5

Вы не можете ничего вернуть из конструктора
__init__. Вы там вызвали
self._transcriber(), но результат никуда не дели, он просто пропал. Но и
return self._transcriber() вы тоже не можете сделать,
__init__ этого не позволяет.
Вы можете в явном виде вызвать эту функцию, создав объект
Transcriber(). Более точный код напишу, когда у вас будет код текстом. Но примерно так:

result = transcriber.Transcriber(wf, model)._transcriber()

А из
__init__ вызов
self._transcriber() уберите, он там бесполезен, если вы никуда результат не собираетесь сохранять.
Вообще, если вам экземпляр класса не нужен, то выкиньте из класса
__init__ и передавайте всё что нужно прямо в вызываемую функцию. А функцию эту вызывайте из класса, без создания экземпляра, и
self. там тоже тогда не нужен:

class Transcriber:

    def _transcriber(wf, model):
        rec = KaldiRecognizer(model, wf.getframerate())
        ...

...
result = transcriber.Transcriber._transcriber(wf, model)


Помогите с циклом в Пайтоне
После генерации рандомных букв и слов цикл выводит одну и туже строчку. Не понимаю как сделать, чтобы она обновлялась?
<code>
from mnemonic import Mnemonic
import random
import string

my_mnemonic = Mnemonic("english")
words = my_mnemonic.generate(128)

Running = True

def generate_alphanum_random_string(length):
    letters_and_digits = string.ascii_letters + string.digits
    rand_string = ''.join(random.sample(letters_and_digits, length))
    while running:
      print('A:' + rand_string, '| M:', words)

generate_alphanum_random_string(31)
</code>

Дело в том, что строка генерируется до цикла и моё решение в том, чтобы переместить строку генерации в само тело цикла, т.е. после
while
Строчки, которые находятся до цикла
while можно убрать, но я их оставил, чтобы вам было проще сравнивать мой код со своим кодом. В мой код я добавил ( скопировал ) всего две строки перед инструкцией
print

from mnemonic import Mnemonic
import random
import string

my_mnemonic = Mnemonic("english")
words = my_mnemonic.generate(128) // это лишнее

Running = True

def generate_alphanum_random_string(length):
    letters_and_digits = string.ascii_letters + string.digits
    rand_string = ''.join(random.sample(letters_and_digits, length)) // это лишнее
    while running:
      words = my_mnemonic.generate(128)
      rand_string = ''.join(random.sample(letters_and_digits, length))
      print('A:' + rand_string, '| M:', words)

generate_alphanum_random_string(31)