Необходимо сделать выборку из 4 столбцов, что бы на выходе получить 3 столбца
Ломаю голову уже неделю. Имеется 4 столбца, по 2 столбца из двух датафреймов.
Необходимо найти уникальные значения при сравнении столбца df1['Имя'] и df2['Имя 2'].
Важно, что бы значения столбца df1['Возраст'] и df2['Специальность'] были привязаны к значениям df3['Имя'], что бы они не потерялись при сравнении.
Что бы в итоге получилось 3 столбца, уникальные имена в столбце df3['Имя'], df3['Возраст'], df3['Специальность'].
<code>
import pandas as pd

data1 = {'Имя': ['Сергей', 'Владимир', 'Александр', 'Евгений', 'Анна', 'Татьяна', 'Ирина', 'Ольга', 'Елена', 'Сергей'],
         'Возраст': [20, 25, 35, 28, 35, 41, 45, 30, 42, 46],}

data2 = {
      'Имя': ['Александр', 'Сергей', 'Евгений', 'Объект', 'Объект', 'Объект', 'Татьяна', 'Объект', 'Объект', 'Объект'],
      'Специальность': ['Программист', 'Строитель', 'Монтажник', 'Инженер', 'Домохозяйка', 'Повар', 'Швея', 'Врач', 'Актриса', 'Программист'],}

df1 = pd.DataFrame(data1, index=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

df2 = pd.DataFrame(data2, index=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

df3 = pd.DataFrame(list(range(10)))

df3[['Имя', 'Возраст']] = df1.loc[:, ['Имя', 'Возраст']]

df3[['Имя 2', 'Специальность']] = df2.loc[:, ['Имя', 'Специальность']]
</code>

Если я вас правильно понял, то
DataFrame.merge это то что вам нужно:

import pandas as pd

data1 = {'Имя': ['Сергей', 'Владимир', 'Александр', 'Евгений', 'Анна', 'Татьяна', 'Ирина', 'Ольга', 'Елена', 'Сергей'],
         'Возраст': [20, 25, 35, 28, 35, 41, 45, 30, 42, 46],}

data2 = {
      'Имя': ['Александр', 'Сергей', 'Евгений', 'Объект', 'Объект', 'Объект', 'Татьяна', 'Объект', 'Объект', 'Объект'],
      'Специальность': ['Программист', 'Строитель', 'Монтажник', 'Инженер', 'Домохозяйка', 'Повар', 'Швея', 'Врач', 'Актриса', 'Программист'],}

df1 = pd.DataFrame(data1, index=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

df2 = pd.DataFrame(data2, index=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

df1.merge(df2, on='Имя')

Out[1]:
        Имя Возраст Специальность
    0   Сергей  20  Строитель
    1   Сергей  46  Строитель
    2   Александр   35  Программист
    3   Евгений 28  Монтажник
    4   Татьяна 41  Швея

Если это не совсем то что вам нужно, то поэксперементируйте с параметром
how функции
merge.


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

goods = [["яблоки", 50], ["апельсины", 190], ["груши", 100], ["нектарины", 200], ["бананы", 77]]

Недавно в лавку привезли новый
fruit_name по цене
price, а после этого случилось ужасное: повысили налоги. А значит, повысились и цены на фрукты, на целых 8%!
Реализуйте код, который добавляет в список
goods ещё один список с новым фруктом и ценой (это запрашивается у пользователя), а затем увеличивает цены всех фруктов на 8%.
Пример:
Текущий ассортимент:
[["яблоки", 50], ["апельсины", 190], ["груши", 100], ["нектарины", 200], ["бананы", 77]]
Новый фрукт:
абрикосы
Цена:
150
Новый ассортимент:
[["яблоки", 50], ["апельсины", 190], ["груши", 100], ["нектарины", 200], ["бананы", 77], ["абрикосы", 150]]
Новый ассортимент с увел. ценой:
[['яблоки', 54.0], ['апельсины', 205.2], ['груши', 108.0], ['нектарины', 216.0], ['бананы', 83.16], ['абрикосы', 162.0]]
я написал так

goods = [["яблоки", 50], ["апельсины", 190], ["груши", 100], ["нектарины", 200], ["бананы", 77]]

while True:
    print('Ваш текущий список фруктов',goods)
      fruit_name=input('Новый фрукт: ')
      price=int(input('Цена: '))
      goods.append([fruit_name,price])

Подскажите как увеличить весь двумерный список на 8%?

Все просто:

goods = [["яблоки", 50], ["апельсины", 190], ["груши", 100], ["нектарины", 200], ["бананы", 77]]

for item in goods:
    item[1] = round(item[1] * 1.08, 2)

print(goods)

Вывод:

[['яблоки', 54.0], ['апельсины', 205.2], ['груши', 108.0], ['нектарины', 216.0], ['бананы', 83.16]]


Нахождение веса минимального маршрута
Дано поле размером (N, N) клеток (двумерный массив). В каждой клетке написано число – вес клетки. Вес маршрута вычисляется как сумма весов посещенных клеток.
Начальное положение исполнителя — верхняя левая клетка, конечное — нижняя правая.
Если исполнитель может передвигаться только на одну клетку вправо или вниз, то нижеприведенный код верно отобразит ответ для каждой клетки массива:
<code>
A = [
    [5, 6, 8, 0],
    [3, 5, 0, 1],
    [4, 4, 1, 1],
    [9, 9, 8, 8]
]

for i in range(len(A)):
    for j in range(len(A)):
        if i > 0 and j > 0:
            A[i][j] += min(A[i-1][j], A[i][j-1])
        else:
            if i > 0:
                A[i][j] += A[i-1][j]
            else:
                if j > 0:
                    A[i][j] += A[i][j-1]

for i in A:
    print(i)
</code>
Как будет выглядеть алгоритм, где исполнитель может двигаться на любое количество клеток вправо или вниз?

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

A = [
    [5, 6, 8, 0],
    [3, 5, 0, 1],
    [4, 4, 1, 1],
    [9, 9, 8, 8]
]
dp = [
    [5, 10000, 10000, 10000],
    [10000, 10000, 10000, 10000],
    [10000, 10000, 10000, 10000],
    [10000, 10000, 10000, 10000],
]
for i in range(0,len(A)):
    for j in range(0,len(A)):
        if i-1>=0:
            dp[i][j]=min(dp[i-1][j]+A[i][j],dp[i][j])
        if j-1>=0:
            dp[i][j]=min(dp[i][j-1]+A[i][j],dp[i][j])
for i in dp:
    print(i)

Это был пофикшенный код, у вас выдавал ошибку как это заметили в комментах
А это решение::

A = [
    [5, 6, 8, 0],
    [3, 5, 0, 1],
    [4, 4, 1, 1],
    [9, 9, 8, 8]
]
dp = [
    [5, 10000, 10000, 10000],
    [10000, 10000, 10000, 10000],
    [10000, 10000, 10000, 10000],
    [10000, 10000, 10000, 10000],
]
for i in range(0,len(A)):
    for j in range(0,len(A)):
        if i-1>=0:
            x = 10000
            for ll in range(0,i):
                x=min(x,dp[ll][j])
            dp[i][j]=min(x+A[i][j],dp[i][j])
        if j-1>=0:
            x = 10000
            for ll in range(0, j):
                x = min(x, dp[i][ll])
            dp[i][j]=min(x+A[i][j],dp[i][j])
for i in dp:
    print(i)


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

base_dict = {"key1": "", "key2": ""}

new_list = [{"key1_1": "", "key2_1": ""}, {"key1_2": "", "key2_2": ""}]

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

for currency in list_currency:
     for i in range(len(new_list)):
         base_dict[currency] = new_list[i]

По факту получается заполнить базовый словарь только первым значением из списка, т.е оба ключа
base_dict содержат значения только первого элемента/значения списка
new_list, а необходимо чтобы первый ключ
base_dict содержал значение первого элемента списка, второй ключ
base_dict содержал значение второго элемента списка.

Не могу сказать точно почему не работает Ваш код. Если создавалась новая пара ключ-значение, то скорее всего в list_currency хранились не существующие в base_dict
ключи. Вариант кода ниже должен работать.
<code>
base_dict = {"key1": "", "key2": ""}

new_list = [{"key1_1": "", "key2_1": ""}, {"key1_2": "", "key2_2": ""}]
for currency in base_dict.keys():
    for i in new_list:
        base_dict[currency] = i
</code>


Discord.py | Как упомянуть бота
Я бы хотел узнать как я могу сделать так, чтобы вместо использования префикса я мог просто упомянуть бота написать команду и это работало так же как и с префиксом, только без него. Как сделано у других ботов.

Укажите в качестве префикса
commands.when_mentioned_or("!")

from discord.ext import commands
bot = commands.Bot(command_prefix=commands.when_mentioned_or("!"))


Как перевести месяцы в годы в таблице Pandas
Всем доброго дня.
Есть таблица типа:

Пол
Возраст
Опыт(месяцев)

М
44
73

Ж
42
230

М
45
237

Ж
27
69

Нужно значение столбца "Опыт(месяцев)" перевести в годы и месяцы.
Начал делать следующее:

exp = np.array([])
for i in list(df['Опыт(месяцев)']):
  years = i // 12
  if i % 12 != 0:
    monts = i % 12

Как теперь значения
years и
monts поместить в ячейку столбца?
Или может нужен другой подход?

У вас в принципе неверный подход к работе с pandas - зачем делать циклы, если можно использовать векторизированные функции? Например:

df["Опыт (лет)"], df["Опыт(месяцев)"] = df["Опыт(месяцев)"].divmod(12)

теперь ваш df:

  Пол  Возраст  Опыт(месяцев)  Опыт (лет)
0   М       44              1           0
1   Ж       42              2           0
2   М       45              9           0
3   Ж       27              9           0


Реализация промежуточных данных в aiogram
возникла такая проблема при переходе с python-telegram-bot на aiogram.
В первой библиотеке я мог достаточно просто реализовать промежуточные данные пользователя. К примеру:

NAME, NICKNAME = range(2) а потом сообщении получить эти данные и уже вывести через:

context.bot.send_message(context.user_data[NAME]
Как можно реализовать такую конструкцию в aiogram?

Для этого у aiogram есть FSM, вот подробный гайд на русском.
Если Вам нужно что-то помощнее и интереснее, советую библиотеку aiogram_dialog :)


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

Есть два варианта поиска. Через регулярные выражения и метод строки
find().
Вариант через регулярные выражения:

import re

text = "Привет. Ага, типа того"
finds = re.findall(r'(\bага\b|\bтого\b)', text, re.IGNORECASE)
print('Раньше встречается {}'.format(finds[0]))

Другой вариант, когда результат вычисляется через метод строки
find(), возвращающий позиции искомых слов.Дальше сортируем и выдаем первое упоминание.
У этого метода минус, что он найдет
ага и как отдельное слово, так и как составляющую слова.

text = "Привет. Ага, типа того"
req = ['ага', 'того']
positions = [(r, text.lower().find(r)) for r in req]
print('Раньше встречается {} на позиции {}'.format(*(sorted(positions, key=lambda x: x[1]))[0]))


Бот для телеграм на python
Я написал бота, который при вводе команды /start начинает в бесконечном цикле отсылать мне определенный ответ. Бота я задеплоил на хероку, то есть он должен работать постоянно, но раз в день мне приходится заново прописывать команду /start, чтобы он снова начал работать. Я не могу понять, почему он выходит из цикла "while(True)".

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


Python, удалить элементы None из списка
Получаю список из БД
Подскажите как удалить элементы None и оставить только IP
<code>
rows = [(None, 1), (None, 1), (None, 2), (None, 3), ('10.10.1.103', 3), ('10.10.1.101', 1), ('10.10.1.102', 2)]
</code>
чтобы на выходе получилось [('10.10.1.103', 3), ('10.10.1.101', 1), ('10.10.1.102', 2)]


Получение разницы во времени между разными днями| python datetime
Мне нужно вычислить разницу между 2 датами во времени, но не понимаю, как сделать это, если разница затрагивает несколько дней или месяцев.
Приведу код:
<code>
from datetime import datetime, date, time
a = input()
if a == "Записать":
    time = datetime.now(tz=None)
    time = datetime.strftime(time, '%d %H:%M:%S')
    time = str(time)
    f = open("C:/python/time.txt", "w")
    f.write(time)
    f.close()
    print(time)
elif a == "Сколько":
    f = open("C:/python/time.txt", "r")
    time1 = f.read()
    f.close()
    time1 = datetime.strptime(time1, "%d %H:%M:%S")
    time2 = datetime.now(tz=None)
    time2 = datetime.strftime(time2, '%d %H:%M:%S')
    time2 = datetime.strptime(time2, "%d %H:%M:%S")
    time_delta = time2 - time1
    time_delta = str(time_delta)
    time_delta = datetime.strptime(time_delta, "%H:%M:%S")
    timer = "1:00:00"
    timer = datetime.strptime(timer, "%H:%M:%S")
    if time_delta > timer:
        print("Прошло больше часа!")

    elif time_delta < timer:
        time_delta = timer - time_delta
        time_delta = str(time_delta)
        time_delta = datetime.strptime(time_delta, "%H:%M:%S").time()
        time_delta = str(time_delta)
        print("Прошло меньше часа, осталось " + time_delta)
</code>
Он будет работать только в том случае, если день остаётся одинаковым, но выдаёт ошибку ValueError: time data '1 day, 0:00:26' does not match format '%H:%M:%S', если день будет другим. Проба time_delta не удалась, ибо насколько я понимаю, он может вычислять только или разницу в днях или разнцу во времени, по крайней мере так я понял

Ваш код можно упростить. Не надо лишний раз переводить в строки, потом обратно.
В "записать" Вы получаете текущее время через
datetime.now(). Дальше в строку в ISO-формате
now.isoformat() и записываем в файл.
По считыванию обратный процесс. Прочитали, преобразовали ISO-формат в переменную
before = datetime.fromisoformat(f.read()). Дальше берем разницу. Она будет в формате объекта
timedelta. Ее сравниваем с
timedelta(hours=1) в один час. По итогам выводим результат.

from datetime import datetime, timedelta

a = input('Введите Записать или Сколько: ')
if a == 'Записать':
    now = datetime.now()
    with open('time.txt', 'w') as f:
        f.write(now.isoformat())  # Преобразуем в строку. Получаем время в ISO формате
elif a == 'Сколько':
    with open('time.txt', 'r') as f:
        before = datetime.fromisoformat(f.read())  # Считываем в ISO формате
    delta = datetime.now() - before
    if delta > timedelta(hours=1):
        print('Прошло больше часа!')
    else:
        print('Прошло меньше часа, осталось {} '.format(timedelta(hours=1) - delta))


Как вывести все объекты модели в плагине Django CMS
Создана модель категорий, через models.Model, для того чтобы в админке можно было добавлять записи.
сама модель (из models.py):

class KSRentalCategory(models.Model):
    name = models.CharField(max_length=250, default="", verbose_name="Название Категории")
    slug = models.SlugField(max_length=250, default="", verbose_name="URL")
    image = FilerImageField(null=True, blank=True, on_delete=models.CASCADE, related_name="image_ks_rental_category")
    sort = models.IntegerField(default="0", verbose_name="Сортировка")
    is_active = models.BooleanField(default="True", verbose_name="Активно?")
    date_pub = models.DateField(auto_now_add=True, blank=True, verbose_name="Дата добавления")
    date_upd = models.DateTimeField(auto_now_add=False, auto_now=True, verbose_name="Дата редактирования")

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'

на frontend надо вывести через плагин список категорий со всеми педалями, создаю плагин (из cms_plugins.py):

@plugin_pool.register_plugin
class KSRentalCategoryPlugin(CMSPluginBase):
    module = _("Аренда")
    name = _("Категории - блок для главной")
    render_template = "ksrental/blocks/rental_category_grid.html"
    model = KSRentalCategory
    allow_children = False

    def render(self, context, instance, placeholder):
        context = super(KSRentalCategoryPlugin, self).render(context, instance, placeholder)
        return context

так не работает, ибо класс модели должен быть не models.Model, а CMSPluginBase!
Допустим, как создать дополнительную модель для связки я нашёл:

class KSRentalPLG(CMSPlugin):
    rental = models.ForeignKey(KSRentalCategory, on_delete=models.CASCADE, verbose_name="Аренда", null=True, blank=True)

    def get_title(self):
        return self.rental.name

    def __str__(self):
        return self.get_title()

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

model = KSRentalCategory

на

model = KSRentalPLG

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

В общем сделал так ():
<code>
@plugin_pool.register_plugin
class KSRentalCategoryPlugin(CMSPluginBase):
    module = _("Аренда")
    name = _("Категории - блок для главной")
    render_template = "ksrental/blocks/rental_category_grid.html"
    # model = KSRentalPLG
    allow_children = False

    def render(self, context, instance, placeholder):
        category = KSRentalCategory.objects.all()
        context.update({'instance': category})
        return context
</code>
Т.е. убрал использование модели, в функции рендера заменил инстанс на все объекты модели.
Не знаю, на сколько это правильно, но для меня сработало.
Если кто знает правильное решение, хотелось бы увидеть!


Проблема с выводом вертикальной таблцы пифагора через вложенные списки (python3) [закрыт]

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

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

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

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

Имеется следующий код:

def fill_1(text):
    a, b = [int(i) for i in text.split(" ")]
    nums = [str(i) for i in range(1, a * b + 1)]
    matrix = [[] for _ in range(b)]
    for j in range(b):
        for i in range(a):
            matrix[i].append(nums[0].ljust(3))
            nums.remove(nums[0])
    for i in range(a):
        print(" ".join(matrix[i]))

fill_1(input())

Если на ввод подается строка, где a <= b, то все выводится корректно, например:

input: 4 5
output:

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

если же a > b, то на выводе следующая ошибка, например:

input: 5 4
output:

Traceback (most recent call last):
  File "file.py", line 13, in <module>
    fill_1(input())
  File "file.py", line 7, in fill_1
    matrix[i].append(nums[0].ljust(3))
IndexError: list index out of range

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

Вы создаёте матрицу с количеством строк =
b:

matrix = [[] for _ in range(b)]

A итерируетесь по ним до значения
a:

for i in range(a):
matrix[i].append(...)

Так что поправьте на:

matrix = [[] for _ in range(a)]


Будет ли работать Python программа на ПК на котором питон не скачан?
Написал небольшую игру на питоне. Хочу скинуть другу. Будет ли она у него работать если я сделаю из пайтон файла exe файл, но при условий что питон у него на пк не скачан?

Будет. Чтобы собрать exe используй pyinstaller
Если у тебя несколько файлов, то вместо

pyinstaller твой_скрипт.py используй
pyinstaller --onefile твой_скрипт.py

Чтобы команда выполнилась нужно находится в той же папке, что и твой скрипт.
Перейти в папку со скриптом можно командой
cd /path/to или, если ты на Windows,
cd C:\path\to (cd - change directory)

pyinstaller автоматически соберет все зависимости. Также, если есть желание, можешь поставить ico иконку на свою игру. О том, как это сделать можешь почитать здесь либо просто загуглить


Как написать Telegram бота отправляющий сообщения другому пользователю на Python?
Мне надо написать телеграм-бота на python который отправляет сообщения определённому пользователю который запустил бота. Если кто знает как это сделать то напишите пожалуйста, заранее спасибо!

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


Импорт списка объектов из файла
У меня есть подмодуль:

.\
  ..\__init__.py
  ..\smth.py

Код
smth.py такой:

_all_ = ['A']
__all__ = _all_ + ['B']

class A:
    ''' Видимый в __init__ '''

class B:
   ''' Видимый только при импорте из этого файла '''

class C:
    ''' Доступен только по прямому импорту '''

Я не хочу захламлять пространство имён подмодуля, поэтому в
__init__ сделал так:

from .smth import _all_ as _smth_all_
from .smth import *

__all__ = _smth_all_

Проблема в том, что
from .smth import * импортирует всё, что будет в
smth.__all__, то есть
smth.A и
smth.B, а мне нужен только
A.
Писать же что-то типа
from .smth import A я не хочу, тк имён много, а при добавлении новых придётся менять И
smth.py, И
__init__.py.
Есть решение, как импортировать из
smth.py только те имена, которые находятся в
_all_?

Оказалось, у этого вопроса есть два ответа.
1, с молотком вместо микроскопа:
YAGNI. Пусть в файле
__init__.py импортируются все и
A, и
B, но и что, пространство имён импорта будет всё равно формироваться из
__init__.__all__, то есть
from __init__ import * импортирует только
A. Собственно, для этого
__all__ и нужен.
2, если всё-таки необходим микроскоп:

# __init__.py
from .smth import _all_ as _smth_all_
smth = __import__('.smth', fromlist=_smth_all_)
globals().update({name: getattr(smth, name) for name in _smth_all_})
__all__ = _smth_all_


Исправьте вывод работы кода
Назовём натуральное число подходящим, если у него ровно
3 различных простых делителя.
Например, число
180 подходящее (его простые делители —
2, 3 и 5),
а число
12 — нет (у него только
два различных простых делителя).
Определите количество подходящих чисел, принадлежащих отрезку
[50001; 90000], а также наименьшее из таких чисел.
В ответе запишите два целых числа: сначала количество, затем наименьшее число.

sp = set()
k=0
m=90001
for i in range(50001,90001):
    for j in range(2,int(i**0.5)+1):
        if i%j==0:
            sp.add(j)
        if len(sp)==3:
                k+=1
                if i<m:
                    m=i
                break
    sp.clear()
print(k,m)

ответ:
15587 50001

мой ответ:
25287 50001

первое число не сходится,нет проверки на простоту делителя, как ее реализовать?

Попробуйте так:
<code>
k = 0
m = 90001

def simpleDividers(n):
   answer = []
   d = 2
   while d * d <= n:
       if n % d == 0:
           answer.append(d)
           n //= d
       else:
           d += 1
   if n > 1:
       answer.append(n)
   return answer

for i in range(50001, 90001):
    if len(set(simpleDividers(i))) == 3:
        k += 1
        if i < m:
            m = i
print(k, m)
</code>


Как сделать чтобы в дискорд боте музыка проигрывалась без остановки?
Вот код, подскажите как сделать чтобы музыка играла бесконечно, пока я ее сам не остановлю.
Напишите что добавить пожалуйста, буду благодарен
<code>
@client.command(pass_context=True, aliases=['u', 'ur'])
async def url(ctx, url: str):

    song_there = os.path.isfile("song.mp3")
    try:
        if song_there:
            os.remove("song.mp3")
            print("Removed old song file")
        await ctx.send("Бот загружает музыку...")
    except PermissionError:
        print("Trying to delete song file, but it's being played")
        await ctx.send("ERROR: Music playing")
        return
    await ctx.send("Почти готово...")
    voice = get(client.voice_clients, guild=ctx.guild)
    ydl_opts = {
        'format' : 'bestaudio/best',
        'postprocessors' : [{
            'key' : 'FFmpegExtractAudio',
            'preferredcodec' : 'mp3',
            'preferredquality' : '192'
            }],
        }
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        print("Downloading audio now\n")
        ydl.download([url])

    for file in os.listdir("./"):
        if file.endswith(".mp3"):
            name = file
            print(f"Renamed File: {file}\n")
            os.rename(file, "song.mp3")
    voice.play(discord.FFmpegPCMAudio("song.mp3"), after=lambda e: print("Song done!"))
    await ctx.send("Готово!")
    voice.source = discord.PCMVolumeTransformer(voice.source)
    voice.source.volume = 0.09

    nname = name.rsplit("-", 2)
    await ctx.send(f"**Играет трек**: {nname[0]}")
    print("playing\n")
</code>

попробуй
discord.FFmpegPCMAudio("song.mp3", before_options="-stream_loop -1")


Как создавать DNS записи через запрос в панель ISPManager на Python
У меня есть домен, который привязан к вебхосту.
Панель управления на вебхосте: ISPManager.
Мне нужен способ, с помощью которого можно было бы отправить запрос на вебпанель и создать тем самым DNS запись. И все это нужно сделать на Python.
Как такое реализовать?

Могу предложить воспользоваться библиотекой ispmanager-python-api. Ей правда четыре года, но если что, то можно форкнуть или на ее базе свою написать.
Базовый вариант по добавлению домена (от автора):
<code>
from isp_manager.credentials import Credentials
from isp_manager.server import Server
from isp_manager import IspManager
from isp_manager.func.domain import Add

user = Credentials('user', 'password')
server = Server('delta.hoster.net')

func = Add()
func.set_additional({
    'name': 'domain.ru',
    'ip': '127.0.0.1',
    'ns': 'dns3.domain.net. dns1.domain.net. dns2.domain.net.',
    'ns_list': '',
    'mx': 'mail',
    'mx_list': '',
    'elid': '',
    'sok': 'ok',
})

isp_manager = IspManager()
isp_manager.set_server(server)
isp_manager.set_user(user)
isp_manager.set_func(func)
print(isp_manager.execute())
</code>


Как вытащить определенные значения из бд SQLite (Python)
У меня есть код простого телеграм-бота (использую Telebot) на Python 3.9
<code>
import telebot
import sqlite3

bot = telebot.TeleBot('token')
connection = sqlite3.connect('database.db', check_same_thread=False)
cursor = connection.cursor()

# ответ бота на команду /profile
@bot.message_handler(commands=['profile'])
def command_Profile(message):
    uid = message.from_user.id

    UserID = '\nID: ' + str(uid)
    isUserAdmin = 'Администратор: ' # + значение из таблицы (true/false)

    profile_message = 'Ваш профиль:\n' + userID + isUserAdmin # текст сообщения, которое отправит бот
    bot.send_message(uid, profile_message)

bot.polling(none_stop=True)
</code>
Также есть база данных (SQLite), где в таблице users хранятся значения user_id (int, ID пользователя в телеграме) и isAdmin (bool, является ли пользователь администратором):

id
user_id
isAdmin

1
11111111
0

2
22222222
1

P.S. uid передается в таблицу в user_id, когда пользователь пишет /start. Этот кусок кода здесь не представлен.
У меня вопрос: как можно посмотреть, является ли пользователь администратором и как добавить полученное значение в isUserAdmin?
Впервые работаю с субд, буду благодарен любой помощи

def get_db(uid):
    conn = sqlite3.connect(db)
    user = conn.execute(f'SELECT * FROM users WHERE user_id ={uid}').fetchone()

    if user is None:
        conn.close()
        return None
    else:
        conn.close()
        row = user[0]
        user_id = user[1]
        is_adm = user[2]
        return row, user_id, is_adm

@bot.message_handler(commands=['start'])
def start(message):
    row, user_id, is_adm = get_db(message.chat.id)
    if is_adm:
        bot.send_message(message.chat.id, f'Администратор: {user_id}')

выполняете запрос к БД -
SELECT почитать.
в моём примере запрашиваются все данные имеющиеся в таблице
users с условием (
where) поиска по
uid, после извлечения получается кортеж (
tuple) с данными, обратится к элементу можно по индексу.
ну а дальше либо возвращаете все данные, либо те что требуются и применяете их там где нужно.


Ускорьте работу кода
Назовём натуральное число подходящим, если у него больше 17 различных делителей (включая единицу и само число). Определите количество подходящих чисел, принадлежащих отрезку [10 001; 50 000], а также наименьшее из таких чисел. В ответе запишите два целых числа: сначала количество, затем наименьшее число.
<code>
sp = []
k=0
m=50001
for i in range(10001,50001):
    for j in range(1,i//2+1):
        if i%j==0:
            sp.append(j)
    if len(sp)>16:
        k+=1
        if i<m:
            m=i
    sp.clear()
print(k,m)
</code>
выводит ответ очень долго, что не дождаться
код добавляет все делители числа в список и потом если длин списка >16(хотя в условии сказано 17, но для того чтобы как то ускорить выше в делителях я сделал ограничение до половины числа, ибо дальше только делитель это само число, соответственно его в списке только не будет и значит в условии на один меньше)
как мог ускорил, но все равно не получается

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

Приходим к такому коду:

sp = set()
k=0
m=50001
for i in range(10001,50001):
    for j in range(1,int(i**0.5)+1):
        if i%j==0:
            sp.add(j)
            sp.add(i//j)
            if len(sp)>17:
                k+=1
                if i<m:
                    m=i
                break
    sp.clear()
print(k,m)

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


Как взять слово, если известны только первые и последние буквы? [закрыт]

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

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

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

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

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

words = ['***', 'Primer.net/rsrc.php/pTeXjRdVk8c/page', '***']
pTeXjRdVk8c - эти символы каждый раз рандомны. И как мне из 'Primer.net/rsrc.php/' и '/page' получить полную ссылку? Надеюсь понятно объяснил.

Например, с помощью регулярных выражений:

import re

words = ['***', 'Primer.net/rsrc.php/pTeXjRdVk8c/page', '***']
r = re.compile(r'Primer\.net/rsrc\.php/(\w+)/page')
res = list(filter(len, (r.findall(x) for x in words)))
print(res)

Вывод:

[['pTeXjRdVk8c']]


Как ускорить код работы программы?
Определите количество принадлежащих отрезку [2 · 10^10; 4 · 10^10] натуральных чисел, которые делятся на 7 и на 100 000 и при этом не делятся на 13, 29, 43 и 101, а также наименьшее из таких чисел. В ответе запишите два целых числа без пробелов и других дополнительных символов: сначала количество, затем наименьшее число.
<code>
m = 4 * 10**10 +1
k=0
for i in range(2 * 10**10,4 * 10**10 +1):
    if i %7==0 and i %100000==0 and i %13!=0 and i %29!=0 and  i %43!=0 and i %101!=0:
        k +=1
        if i<m:
            m=i
print(k,m)
</code>
в IDLE запускаю и просто выдачи ответа не дождаться, как ускорить можно было бы?

Если чуть-чуть подумать, то
2 * 10**10 конечно делится на
100000 нацело (там ведь 10 нулей в конце). А какое следующее число будет делиться на
100000 нацело? Конечно же
2 * 10**10 + 100000. А следующее? Таким образом, просто нужно перебирать не все числа подряд, а с шагом
100000. И у
range для такого перебора есть специальный третий параметр. Ответ получается моментально.


Определение ближайших точек к одной координате (двухмерной)
Имеется сетка 10 на 10, а также рандомная точка, которая может быть как в центре созданной сетки, так и в углу или у её "стенки"
Как можно определить ближайшие к этой рандомной координате [i, j] точки, которые её окружают? К примеру, имеется точка [5, 6]. Ближайшие точки, которые её окружают (к ней примыкают), будут ([4, 5], [5, 5], [6, 5], [4, 6], [6, 6], [4, 7], [5, 7], [6, 7]). Если точка в углу - [10, 1], то окружающие её будут ([10, 2], [9, 1], [9, 2]), если у стенки - [5, 10], то ([4, 9], [5, 9], [6, 9], [6, 10], [4, 10])
Предполагаю, что это можно сделать с помощью евклидового расстояние и функции min() c параметром key, но как именно- не могу понять.

Условие наверняка как-то попроще можно записать, но сходу не придумал:

def near_points(x, y, arr):
    return [(a,b) for a,b in arr if abs(a-x) <= 1 and abs(b-y) <= 1 and (x != a or y != b)]

points = [(x,y) for x in range(1,11) for y in range(1,11)]

print(near_points(5, 6, points))
print(near_points(10, 1, points))
print(near_points(5, 10, points))

Вывод:

[(4, 5), (4, 6), (4, 7), (5, 5), (5, 7), (6, 5), (6, 6), (6, 7)]
[(9, 1), (9, 2), (10, 2)]
[(4, 9), (4, 10), (5, 9), (6, 9), (6, 10)]

P.S. Упростить выражение можно так, но будет ли так быстрее и понятнее - не уверен:

if 0 < (a-x) ** 2 + (b-y) ** 2 <= 2

А с функцией
min тут не получится, потому что она выдаёт только одно значение. Можно было бы поискать минимальное расстояние через неё, но вы его и так знаете - это 1 по одной из координат (и 1 или 0 по другой).


Python flask send_from_directory()
мне нужно написать функцию, которая будет скачивать файлы с сервера
и вот все работало отлично когда надо было скачивать по одному файлу я тогда использовал

@app.route('return_files/', methods=['GET','POST'])
def return_files(file)
    return send_from_directory(directory="pdf", filename=file, as_attachment=True)

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

 @app.route('return_files/', methods=['GET','POST'])
    def return_files(files)
        for file in files:
        return send_from_directory(directory="pdf", filename=file, as_attachment=True)

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

return прерывает выполнение функции с сразу возвращает результат. В вашем случае могу посоветовать два варианта:

Завести список и
append туда каждый файл.

 @app.route('return_files/', methods=['GET','POST'])
 def return_files(files)
    file_list = []
    for file in files:
        file_list.append(send_from_directory(directory="pdf",
                         filename=file,
                         as_attachment=True))
    return file_list

Написать генератор для получения всех возможных файлов. Читайте про
yeld
Ну и советую немножко зарефакторить, потому что логика получения файлов, это не логика rout`ов

И да, обратите внимание на комментарий andreymal


Как закрыть программу с разрешения юзера на пайтон
Я создал программу который при нажатия на кнопку Выход появится окно который спросит "Вы уверены что хотите выйти?" когда нажму на "Да" ничего не произойдёт. Надо это исправить.
Вот код:
<code>
from tkinter import*
from tkinter import messagebox as mbox

def OnQuest():
    mbox.askquestion("Вопрос", "Вы уверены, что хотите выйти?")

root=Tk()
root.title('Exit?')
root.geometry('600x400')
root['background']= None

menubar=Menu(root)
filemenu=Menu(menubar, tearoff=0)
filemenu.add_command(label="Выход", command=OnQuest)
menubar.add_cascade(label="Файл", menu=filemenu)

root.config(menu=menubar)
root.mainloop()
</code>

В функцию
OnQuest(): добавьте следующий код и измените
askquestion на
askyesno:

def OnQuest():
    quest = mbox.askyesno("Вопрос", "Вы уверены, что хотите выйти?")
    if quest == True:
        root.quit()

Когда Вы нажимаете на "Да" переменной
quest, присваивается значение
True, а когда на "Нет"
False. Метод
quit() завершает программу.


Необходимо перенести 2 значения выводимых в консоль в новый файл
<code>
name: str = input ("Введите имя входящего файла")
f = open (name)  # открываем файл
lines = f.readlines ()  # читаем его построчно
t: str = print (lines [23]) # выводим строки
t1: str = print (lines [24]) # выводим строки
name1: str = input ("Введите имя исходящего файла")
f = open(name1, "w+")
f.write(str(t))
f.write(str(t1))
f.close()
</code>
Собственно сам код, его результат не вывод (как я предполагал) значений отфильтрованных по строкам из документов, а всего лишь новый файл с NoneNone, прошу пояснить как это исправить, а так же помочь разобраться как правильно задавать переменные.
Заранее спасибо!

Все достаточно просто. Ошибка здесь

t: str = print (lines [23]) # выводим строки
t1: str = print (lines [24]) # выводим строки

Переменные
t и
t1 содержат возврат функции
print, что естественно будет
None. Не понятно насколько в приципе необходимо читать с консоли, но можно решить так

name: str = input ("Введите имя входящего файла")
f = open (name, "r")  # открываем файл
lines = f.readlines ()  # читаем его построчно
t: str = lines [23] # выводим строки
t1: str = lines [24] # выводим строки
print(t, t1)
name1: str = input ("Введите имя исходящего файла")
f = open(name1, "w+")
f.write(str(t))
f.write(str(t1))
f.close()

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


Пароль отображается как текст в админке (не хэшируется)
Есть модель
CustomUser, наследуемая от
AbstractUser. При регистрации модели в админке пароль отображается как текст, то есть тип этого поля text, а не password. Знаю, что эту проблему можно решить если вместе с моделью зарегистрировать класс
ModelAdmin, в моём случае это будет
CustomUserAdmin, наследуемый от
UserAdmin из
django.contrib.auth.admin, да при этом пароль будет отображаться корректно, но тогда поля из CustomUser отображаться не будут(как бы зарегистрирована модель
CustomUser, но отображаться будут только поля модели
User, при использовании класса наследуемого от выше упомянутого
UserAdmin). Что с этим делать, подскажите пожалуйста!

Для меня сработала следующая схема
<code>
class User(AbstractUser):
    '''Extended standard user class '''
    ....

class UserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = User

class Admin(UserAdmin):
    form = UserChangeForm
    model = User
    list_display = ('all you need', ...)

admin.site.register(User, Admin)
</code>


Как написать Telegram бота с функцией звонка на Python?
Мой заказчик дал мне задание написать телеграм-бота на  python с функцией звонка. Я потратил 2 дня на поиск решения данной задачи, однако не где нету об никакой информации.
Если кто знает как это сделать то напишите пожалуйста, заранее спасибо!

И не найдёте никакой информации, так как боты не умеют (и не должны) звонить.
Вам нужно ознакомиться с Telegram VoIP Calls и с MTProto API. Для Python есть прекрасная реализация MTProto API - фреймворк Pyrogram.


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

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

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

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

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

Есть словарь, который в функции создается сам:

message = {
        'from_user': {'id': call.message.chat.id},
        'chat': {'id': call.message.chat.id}
    }

При выводе словаря получаю:

# print(message)
# print(type(message))

{'from_user': {'id': 00000000}, 'chat': {'id': 00000000}}
<class 'dict'>

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

Task exception was never retrieved
future: <Task finished name='Task-24' coro=<Dispatcher._process_polling_updates() done, defined at C:\Users\Maxim\AppData\Local\Programs\Python\Python39\lib\site-packages\aiogram\dispatcher\dispatcher.py:409> exception=AttributeError("'dict' object has no attribute 'from_user'")>
Traceback (most recent call last):
  File "C:\Users\Maxim\AppData\Local\Programs\Python\Python39\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 417, in _process_polling_updates
    for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
  File "C:\Users\Maxim\AppData\Local\Programs\Python\Python39\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 238, in process_updates
    return await asyncio.gather(*tasks)
  File "C:\Users\Maxim\AppData\Local\Programs\Python\Python39\lib\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
    response = await handler_obj.handler(*args, **partial_data)
  File "C:\Users\Maxim\AppData\Local\Programs\Python\Python39\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 286, in process_update
    return await self.callback_query_handlers.notify(update.callback_query)
  File "C:\Users\Maxim\AppData\Local\Programs\Python\Python39\lib\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
    response = await handler_obj.handler(*args, **partial_data)
  File "c:\Users\Maxim\Desktop\englishbot\englishbot.py", line 100, in callback_handler
    await userAnswerCheckWord(call)
  File "c:\Users\Maxim\Desktop\englishbot\englishbot.py", line 151, in userAnswerCheckWord
    await sendNewWord(message)
  File "c:\Users\Maxim\Desktop\englishbot\englishbot.py", line 74, in sendNewWord
    keyboard, message_text, image_link = await generate_message(message)
  File "c:\Users\Maxim\Desktop\englishbot\gen_message.py", line 9, in generate_message
    if (await connect.get_user_stateAction(message)) == 'lwords':
  File "c:\Users\Maxim\Desktop\englishbot\sqlite_connector.py", line 153, in get_user_stateAction
    userId = message.from_user.id
AttributeError: 'dict' object has no attribute 'from_user'

Функция которая обращается к словарю:

async def get_user_stateAction(message):
        userId = message.from_user.id

        sql.execute(f"""SELECT action FROM users_states WHERE userId = '{userId}'""")
        if sql.fetchone()[0] == 'lwords':
            return 'lwords'
        else:
            return 'none'

По просьбе одного из пользователей, код который вызывает функцию get_user_stateAction:

from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from kreekly_parser import get_word
from sqlite_connector import connect
from random import randint
import asyncio

async def generate_message(message):
    if (await connect.get_user_stateAction(message)) == 'lwords':
        select_eng_word, select_rus_word, eng_words, rus_words, image_link, action, audio, response_status = await get_word()
        if response_status == 200:

            # генерация клавиатуры
            keyboard = InlineKeyboardMarkup()
            for button in range(len(eng_words)):
                keyboard.add(InlineKeyboardButton(text=eng_words[button], callback_data=f'SELECTED_WORD:{eng_words[button]}'))

            # передача правильных слов
            await connect.setRightWord(message, select_eng_word, select_rus_word)

            # передача аудио
            await connect.setNewAudio(message, audio)

            # передача неправильных слов
            wrongWords = eng_words
            inn = wrongWords.index(select_eng_word)
            del wrongWords[inn]
            await connect.setWrongUserWords(message, wrongWords=wrongWords)

            # генерация текста сообщения
            message_text = (
                f"Как переводится {select_rus_word}?"
            )

            return keyboard, message_text, image_link

        else:
            pass
    else:
        pass

Обращаться к словарю надо так:
<code>
userId = message['from_user']['id']
</code>


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

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


У меня есть пнг, и я хочу создать файл в репозитории github, который будет в себе иметь этот пнг [закрыт]

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

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

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

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

У меня есть файл cam.png, и я хочу поместить этот файл в репозиторий на github, я использую PyGitGub
<code>
from github import Github

TOKEN='мой токен'
g=Github('TOKEN')

repo= g.get_user().get_repo('db')

with open('cam.png', encoding='cp1251') as file:
    repo.crete_file('cam.png', 'New Png!', file)
</code>
Но мне выдаёт выдаёт AssertionError. Можно ли вообще так делать? Или нужно по другому?

Поскольку файл с картинкой это двоичный файл, открывать его нужно соответственно в двоичном режиме:
<code>
with open('cam.png', 'rb') as file:
</code>
По умолчанию питон открывает файлы на чтение в текстовом режиме. Кодировка применима только к текстовым файлам, двоичные файлы читаются "как есть", байт в байт.


Как измерить насколько та или иная функция загружает процессор?
Заметил что мой скрипт в ходе своего выполнения буквально на 1 секунду повышает загруженность процессора (смотрел в программе FPSMonitor), есть ли способ узнать сколько та или иная функция загружает процессор в момент своего выполнения?

есть ли способ узнать сколько та или иная функция загружает процессор
в момент своего выполнения?

Вопрос не очень корректен. Потому, что нагружают процессор не функции программы, а процессы. И ядро ведёт статистику нагрузки именно по процессам.
Подозреваю, что на самом деле, вас интересует просто вопрос о том, какая из функций Вашей программы жрёт процессорное время больше других функций.
Получить ответ на этот вопрос довольно просто. Предположим, что в Вашей программе работают три функции: F1(), F2() и F3().
Для начала, заведём глобальный хэш:

total = dict(F1=0, F2=0, F3=0)

После этого, в начале тела кажой функции добавляем строку вида:

timeStart = time.time_ns()

Разумеется, не забываем про import time !  А в конце всех функций добавляем строки вида (это для F1);

timeEnd = time.time_ns()
duration = timeEnd - timeStart
total['F1'] += duration

Ну а в самом конце программы вставляем строчку вида:

print(total)

и анализируем полученные результаты.


Два for в одну строчку
<code>
res = []
for k in str:
    for j in str1:
        if k == j:
            res.append(k)
</code>
Возможно ли записать это в одну строчку?

str - плохое название для переменной, оно перекрывает встроенный класс питона. Поэтому у меня будут
str1 и
str2.
Второй цикл
for вообще не нужен, его можно заменить оператором
in. Вариант со списковым включением:

res = [k for k in str1 if k in str2]

Вариант через множества вообще без
for, но он подходит только в случае, если символы в строках не повторяются и порядок следования символов в результате не важен (и если на выходе нужен именно список, нужно потом результат преобразовать через
list()):

res = set(str1) & set(str2)

Ну и на закуску "функциональный" вариант с
filter (аналог первого варианта по сути):

res = list(filter(str2.__contains__, str1))


Как задокументировать, что метод возвращает self?
У меня есть метод в классе, который возвращает self. Я решил задокументировать это, но понял, что не знаю что написать.
Допустим у меня есть класс 'MyCalss' с методом 'MyMethod'

class MyClass:

    def MyMethod(self, arg: int) -> ???:
        # Work
        return self

Я пытался вписать вместо
???
self и
MyClass, но всегда появлялась ошибка
NameError

Python 3.7+:
from __future__ import annotations
В Python 3.7 добавили PEP 563: postponed evaluation of annotations. Модуль, который импортировал
from __future__ import annotations сохранит анотации автоматичкески:

from __future__ import annotations

class Position:
    def __add__(self, other: Position) -> Position:
        ...

Это добавят в Python 3.10
Python <3.7: use a string
Следуя to PEP 484, нужно использовать строки вместо классов:

class Position:
    ...
    def __add__(self, other: 'Position') -> 'Position':
       ...

Тут подробнее


Как с помощью команд telegram бота выводить отдельные данные погоды [закрыт]

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

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

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

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

<code>
import telebot
from pyowm.owm import OWM
from pyowm.utils.config import get_default_config

bot = telebot.TeleBot('1:AA')

@bot.message_handler(commands=['start'])
def hello(message):
    bot.send_message(message.chat.id, 'Добро пожаловать, я бот знающий погоду во всем мире' + '\n' +
    'Чтобы узнать погоду напишите в чат название любого города\n/help - все команды бота')
@bot.message_handler(commands=['help'])
def help(message):
    bot.send_message(message.chat.id, '/start - запуск бота\n/help - команды бота\nНапишите в чат название города для получения информации о погоде')
@bot.message_handler(content_types=['text'])
def test(message):
    try:
        place = message.text
        config_dict = get_default_config()
        config_dict['language'] = 'ru'
        owm = OWM('0...', config_dict)
        mgr = owm.weather_manager()
        observation = mgr.weather_at_place(place)
        w = observation.weather
        t = w.temperature('celsius')
        t1 = t['temp']
        t2 = t['feels_like']
        t3 = t['temp_max']
        t4 = t['temp_min']

        wi = w.wind()['speed']
        humi = w.humidity
        cl = w.clouds
        dt = w.detailed_status
        ti = w.reference_time('iso')
        pr = w.pressure['press']
        vd = w.visibility_distance
        st = w.status

        bot.send_message(message.chat.id, 'В городе ' + str(place) + ' температура ' + str(t1) + ' C' + '\n' +
                         'Максимальная температура ' + str(t3) + 'C' + '\n'+
                         'Минимальная температура ' + str(t4) + 'C' + '\n' +
                         'Ощущается как ' + str(t2) + 'C' + '\n' +
                         'Скорость ветра ' + str(wi) + 'м/с' + '\n' +
                         'Давление ' + str(pr) + 'мм.рт.ст' + '\n' +
                         'Влажность ' + str(humi) + '%' + '\n' +
                         'Видимость ' + str(vd) + 'метров' + '\n'
                         'Статус ' + str(st) + '\n' + str(dt) )

    except:
        bot.send_message(message.chat.id, ' Такой город не найден')
        print(str(message.text), '- не найден')
bot.polling(none_stop=True, interval=0)
</code>

несмотря на правильные вопросы MyZik и passant, я всё же хочу ответить на данный вопрос:

использование @bot.message_handler(content_types=['text']) будет запускать поиск погоды для всех сообщений, будь-то город или название фрукта

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

def owm_info(place):
    config_dict = get_default_config()
    config_dict['language'] = 'ru'
    owm = OWM(owm_token, config_dict)
    mgr = owm.weather_manager()
    w = mgr.weather_at_place(place).weather
    t = w.temperature('celsius')

    temp = t['temp']
    feels_like = t['feels_like']
    temp_max = t['temp_max']
    temp_min = t['temp_min']

    wind_speed = w.wind()['speed']
    humidity = w.humidity
    clouds = w.clouds
    detailed_status = w.detailed_status
    reference_time = w.reference_time('iso')
    pressure = w.pressure['press']
    visibility_distance = w.visibility_distance
    status = w.status

    return {'temp': f'Температура: {temp} C', 'feels_like': f'Ощущается как: {feels_like} C',
            'temp_max': f'Температура / max: {temp_max} C', 'temp_min': f'Температура / min: {temp_min} C'}

дальше хэндлер на команду и метод ожидания ввода:

@bot.message_handler(commands=['tmp'])
def get_tmp(message):
    msg = bot.send_message(message.chat.id, 'напишите название любого города')
    bot.register_next_step_handler(msg, get_tmp_2)

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

def get_tmp_2(message):
    w = owm_info(message.text)
    bot.send_message(message.chat.id, f'{w["temp"]}\n{w["feels_like"]}\n{w["temp_max"]}\n{w["temp_min"]}')

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

можно сделать без ожидание ввода - "аргумент" к команде:

@bot.message_handler(commands=['temp'])
def get_temp(message):
    w = owm_info(message.text.split(maxsplit=1)[1])
    bot.send_message(message.chat.id, f'{w["temp"]}\n{w["feels_like"]}\n{w["temp_max"]}\n{w["temp_min"]}')

для этого потребуется отправить боту "/temp город"

а можно пойти ещё дальше и сделать с помощью
inline кнопок:
создадим словарь с данными для кнопок -
text и
callack_data:

button = {'temp': 'Температура', 'feels_like': 'Ощущается как', 'temp_max': 'Температура / max', 'temp_min': 'Температура / min'}

функцию создания клавиатуры из словаря:

def kb_btn(place):
    kb = InlineKeyboardMarkup()
    btn = []
    for i in button.items():
        bt = InlineKeyboardButton(text=i[1], callback_data="['w', '" + i[0] + "', '" + place + "']")
        btn.append(bt)
    kb.add(*btn)
    return kb

и коллбэк хэндлер:

@bot.callback_query_handler(func=lambda call: True)
def inline_kb(call):
    if call.data.startswith("['w"):
        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
                              text=f'{owm_info(ast.literal_eval(call.data)[2])[ast.literal_eval(call.data)[1]]}',
                              reply_markup=kb_btn(ast.literal_eval(call.data)[2]))

обратите внимание на
startswith - возвращает флаг, указывающий на то, начинается ли строка с указанного префикса (callback_data="['w'...) т.к. callback_data составная - префикс, ключ словаря и город, а так же
ast.literal_eval который позволит получить все части callback_data по индексам.
пожалуйста! не копируйте код в тупую, разберитесь в предоставленном вам ответе, цените время потраченное на ответ.

ast
startswith
f-string
register_next_step_handler
InlineKeyboardButton
split


Слияние данных из 2-х списков со словарями по одинаковому ключу и его значению
Из разных сервисов получаю 2 списка с пользовательскими данными в виде словарей, в обоих списках в словарях есть одинаковый ключ 'user_id', количество записей в списках может не совпадать,
в списке 'current_list' (данные об активных пользователях из ldap) записей о пользователях будет всегда либо меньше либо равное количеству в списке 'users_list':

users_list = [
    {'user_id': '24638', 'phone_name': 'p24638', "some_key": "some_value", ...},
    ...,
    {'user_id': '03283', 'phone_name': 'p03283', "some_key": "some_value", ...},
    {'user_id': '01595', 'phone_name': 'p01595', "some_key": "some_value", ...}
]

current_list = [
    {'user_id': '03283', 'display_name': 'Z.Oleg', 'mail': '[email protected]', ...},
    ...,
    {'user_id': '01595', 'display_name': 'S.Mikhail', 'mail': '[email protected]', ...}
]

Необходимо дополнить данные пользователя в списке 'current_list' данными из первого списка при совпадении значений ключа 'user_id'. Самое простое решение: пройтись 2 циклами по спискам и обновить данные:

for i in current_list:
    for j in users_list:
        if i["user_id"] == j["user_id"]:
            i.update(
                {
                    "phone_name": j["phone_name"],
                    "some_key"  : j["some_value"]
                }
            )

но тогда суммарное количество иттераций будет i*j, а списки могут быть большими и каждый содержать по несколько десятков тысяч записей. Какие еще могут быть варианты смерджить данные, желательно без использования сторонних библиотек?

Можно два списка превратить в два словаря с ключем в виде
user_id. Потом провести слияние через
dict.update(). И преобразовать словарь в список по значениям. Будет около
3*N (спасибо
GrAnd) операций.

users_list = [
    {'user_id': '24638', 'phone_name': 'p24638', "some_key": "some_value", },
    {'user_id': '03283', 'phone_name': 'p03283', "some_key": "some_value", },
    {'user_id': '01595', 'phone_name': 'p01595', "some_key": "some_value", }
]

current_list = [
    {'user_id': '03283', 'display_name': 'Z.Oleg', 'mail': '[email protected]', },
    {'user_id': '01595', 'display_name': 'S.Mikhail', 'mail': '[email protected]', }
]

current_dict = {r['user_id']: r for r in current_list}
for k in users_list:
    if current_dict.get(k['user_id']):
        current_dict[k['user_id']].update(k)
    else:  # Если нужно добавить недостающего пользователя
        current_dict[k['user_id']] = k

current_list = list(current_dict.values())

В
current_list:

[{'user_id': '03283', 'display_name': 'Z.Oleg', 'mail': '[email protected]', 'phone_name': 'p03283', 'some_key': 'some_value'}, {'user_id': '01595', 'display_name': 'S.Mikhail', 'mail': '[email protected]', 'phone_name': 'p01595', 'some_key': 'some_value'}, {'user_id': '24638', 'phone_name': 'p24638', 'some_key': 'some_value'}]


Ошибка в программе при проверке текста на наличие букв
изучаю Python и пишу программу на проверку содержания букв в тексте. Имеется вот такой вот код:

import string
mytext = input("Введите текст для проверки: ")

n = input("Введите буквы для поиска: ")
n = n.replace(" ", "")
symbs = list(n)
print("Ищем такие буквы: ", symbs)
for s in symbs:
    if s in mytext:
        print("В тексте есть буква '"+s+"'")
        break
    else:
        print("В тексте нет буквы '"+s+"'")
else:
    print("Таких букв в тексте нет")
print("Поиск завершен")

Например: "Привет меня зовут Олег" является текстом для проверки, а буквы "П,р,и,в,е,т" являются искомыми. В этом случае результат программы будет таков:

Введите текст для проверки: Привет меня зовут Олег
Введите буквы для поиска: Привет
Ищем такие буквы:  ['П', 'р', 'и', 'в', 'е', 'т']
В тексте есть буква 'П'
Поиск завершен

Как сделать так чтобы отображались все найденные буквы

Нужно заменить оператор
break оператором
continue.

mytext = input("Введите текст для проверки: ")
n = input("Введите буквы для поиска: ")
n = n.replace(" ", "")
symbs = list(n)
print("Ищем такие буквы: ", symbs)
for s in symbs:
    if s in mytext:
        print("В тексте есть буква '"+s+"'")
        # поменяли break на continue
        continue

    print("В тексте нет буквы '"+s+"'")

print("Поиск завершен")


Преобразование строки в словарь
Есть строка по типу
a = '# Игрок Ранг Статус 1 Lenny_Bezkurov X Сейчас играет 2 Mike_Deporto X Не в игре 3 Shon_Blake...' и так далее.
Можно ли каким либо способом получить из подобной строки словарь? по типу {'#': '1', 'Игрок': 'Mike_Deporto' ...}

В целом через регулярные выражения можно попробовать вытащить данные через
re.findall.
Первыми вытаскиваем ключи
keys по маске, потом данные по игрокам
finds. Потом объединяем все в список словарей
comb.

import re

a = '# Игрок Ранг Статус 1 Lenny_Bezkurov X Сейчас играет 2 Mike_Deporto X Не в игре'
keys = re.findall('^(\S) ([\w]+) ([\w]+) ([\w]+)', a)
finds = re.findall('([\d]+) ([\w]+) ([\w]+) ([\s\D]+)', a)

comb = [dict(zip(*keys, f)) for f in finds]
print(*comb, sep='\n')

Вывод:

{'#': '1', 'Игрок': 'Lenny_Bezkurov', 'Ранг': 'X', 'Статус': 'Сейчас играет '}
{'#': '2', 'Игрок': 'Mike_Deporto', 'Ранг': 'X', 'Статус': 'Не в игре'}


Как в боте отредактировать сообщение с фото на другое фото?
Возникла данная проблема: необходимо фото в сообщении заменить на другое фото.
Пытался так:

bot.edit_message_text(chat_id=msg_chat_id,
    message_id=msg_id, text=open('frame.jpg', 'rb'))`

P.S.
msg_chat_id и
msg_id нормальные переменные
Выдает следующую ошибку:

[b'{"ok":false,"error_code":400,
"description":"Bad Request: there is no text in the message to edit"}']"

Как это решить?

Для этого есть прекрасный метод editMessageMedia:

with open('frame.jpg', 'rb') as file
    photo = types.InputMediaPhoto(file)

bot.edit_message_media(chat_id=msg_chat_id, message_id=msg_id, media=photo)

Ну или так:

with open('frame.jpg', 'rb') as file
    bot.edit_message_media(chat_id=msg_chat_id, message_id=msg_id, media=types.InputMediaPhoto(file))


Вызвать функцию имея декоратор -Python
В ряде модулей питон функции вызываются непонятным мне способом, полагаю с помощью декоратора. (Список таких модулей, которые я знаю:
Django,
Flask,
Aiogram,
Pyrogram,
discord.py)
Код будет показан на примере Flask

from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def index():
    return 'heya'
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

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

Ну вот я вам взяв за основу типовой декоратор за 10 минут набросал аналог:

class WebServer:
    def __init__(self):
        self.doit = {}

    def route(self, path):

        def decorator(function):
            self.doit[path] = function
        return decorator

    def run(self):
        print('Server is running')
        for i,key in enumerate(self.doit):
            print(i, key)
            self.doit[key]()

app = WebServer()

@app.route('/')
def index():
    print('Go go go!')

@app.route('/img')
def images():
    print('Images!')

if __name__ == "__main__":
    app.run()

Вывод:

Server is running
0 /
Go go go!
1 /img
Images!

Update: Чуть усложнил код, можно прописывать много
route, они копятся в словарь, который можно потом перебрать.


Цикл While (задание для новичка) [закрыт]

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

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

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

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

Мы только начали проходить циклы while. А ещё преподаватель не объяснил, как пользоваться "sum" и "round". И я собирала этот👇 код по кусочкам с форума. Но чего-то не хватает. Выкладываю задачу и лучший (на мой взгляд) вариант кода.
Задача
Напишите программу, которая считывает числа, пока пользователь не введет 55. После ввода 55 прекратите чтение ввода, распечатайте, сколько чисел было введено, их общую сумму и среднее значение (округленную). Вы НЕ включаете в себя 55 в своих расчетах и печати каждого полученное значение на новой линии в порядке.
Код
<code>
number=int(input())
i = 0
while number < 55:
     i = i + 1
     s = sum(number)
     r = round(number)
print(i)
print(s)
print(r)
</code>

num = int(input())
nums = []
while num !=  55:
    nums.append(num)
    num = int(input())

s = sum(nums)
length = len(nums)
print("len = ", length)
print("sum = ", s)
print("среднее = ", s / length)


Недопонимание ООП. Область видимости
Такой вопрос, как в теле функции(метода), класса можно не обращаться к атрибутам класса вот так:

class Rso:
    _username = input()
    def func():
        print(Rso._username)

А вот так:

class Rso:
    _username = input()
    def func():
        print(_username)

По факту мы же в теле класса, и к атрибутам мы можем обращаться как в теле класса)

я бы вам предложил попробовать два варианта.
Мне лично второй вариант нравится больше.
так:

class Rso(object):
    _username = input('Введите ваше имя: ')

    def func(self):
        print(self._username)

rso = Rso()
rso.func()

или так:

class Rso(object):
    def __init__(self, _username):
        super().__init__()
        self._username = _username

    def func(self):
        print(self._username)

username = input('Введите ваше имя: ')
rso = Rso(username)
rso.func()


Как сгруппировать по нескольким колонкам?
Есть датасет
df с колонками
person, year,    sum_of_purchase. В датасете может быть много строк - когда один 'person' в один 'year' тратил разные суммы.
Надо сделать: 1) новую колонку
df['mean_sum_of_purchases_this_year']; 2) в этой колонке должна быть средняя сумма всех покупок этого 'person' за тот год, который будет в той же строке.
Вот так нахожу среднюю сумму всех трат одного 'person' за все годы:

df["mean_sum_of_purchase_all_years"] =
    df.person.map(df.groupby("person").sum_of_purchase.mean())

Понимаю, что это тема 'groupby multiple times'.
Но что брать - 'map' или 'apply', и как применить?

попробуйте так:
<code>
df["mean_sum_of_purchase_all_years"] = \
    df.groupby(["person", "year"])["sum_of_purchase"].transform("mean")
</code>


Как сделать бесконечную кнопку в discord.py [закрыт]

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

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

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

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

Ищу и не понимаю. Вроде же можно, а не нахожу. В общем мне нужна кнопка, которая срабатывает не один раз и потом выдает "Ошибка взаимодействия". Она обязана выполняться каждое нажатие
Это код функции:
<code>
@bot.command()
async def test(ctx):
    embed = discord.Embed(title = 'Проверка!',timestamp = ctx.message.created_at)
    await ctx.send(embed=embed, components = [Button(style = ButtonStyle.green, label = 'Create Ticket'),
                                                Button(style = ButtonStyle.red, label = 'Delete Ticket')])

    responce = await bot.wait_for('button_click', check = lambda message: message.author == ctx.author)

    if responce.component.label == 'Create Ticket':
        await responce.respond(content = 'Ваш тикет создан!')
        # responce.component.disabled = False

    elif responce.component.label == 'Delete Ticket':
        await responce.respond(content = 'Ваш тикет удален')
</code>

Непонятно что вы используете, скорее всего discord-components,
В документации написано про бесконечные кнопки


Ошибка рассылки VkBottle Python
Не получается сделать массовую рассылку юзеров из группы вк. При попытке отправить рассылку, вылезает ошибка:

"TypeError: 'usrget' is an invalid keyword argument for int()"

проблемный кусочек кода:

@bot.on.private_message(text='Сделать рассылку')
async def rass(message:Message):
    await message.answer('Какую рассылку будем делать?')
    await bot.state_dispenser.set(message.peer_id, FormState.RASSILKA)

@bot.on.private_message(text='<rp>', state=FormState.RASSILKA)
async def handler(message:Message, rp):
    usrget = await bot.api.groups.get_members(group_id=секрет, offset=100, count=500)
    await bot.api.messages.send(usrget, rp)

памагите

Скорее всего, в Вашей переменной
usrget находится массив из пользователей, а метод
bot.api.messages.send() отправляет сообщение одному пользователю.
Попробуйте так:

@bot.on.private_message(text='<rp>', state=FormState.RASSILKA)
async def handler(message:Message, rp):
    usrget = await bot.api.groups.get_members(group_id=секрет, offset=100, count=500)
    for user_id in usrget:
        await bot.api.messages.send(peer_id=user_id, message=rp, random_id=0)


Как прочитать словарь в словаре?
Мне нужно узнать значение
text

d = dict()
d = {'ans':{'anf':{'atributes':{'text':'res'}}}}
print(d.ans.anf.atributes['text'])

AttributeError: 'dict' object has no attribute 'ans'

print(d.ans.anf.atributes['text'])

Такое работает только в библиотеках, например
Pandas, которые автоматически делают у объекта поля, к которым можно обращаться и так
df['field'] и так
df.field, с обычными словарями это не работает, к ним надо обращаться через индексирование (квадратные скобки):

print(d['ans']['anf']['atributes']['text'].lower())


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

if len(x)>m:
    m = len(x)
else:
    #остановить анимацию, но функции для остановки анимации не работают

Заранее благодарю за любой совет!))

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.animation import FuncAnimation
import numpy as np
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT
import mplcursors
plt.style.use('seaborn-whitegrid')

def animation(i, axs):
    data = pd.read_csv('FlyData.txt', sep='\s+', encoding='latin-1', header=None)
    data = pd.DataFrame(data)
    colors = ['#FFD700', 'g', 'b', 'r', 'purple', 'c', 'm', 'y', 'k', 'c', '#FF4500', '#2F4F4F', '#FF69B4', '#556B2F', '#20B2AA', '#BDB76B', '#FFD700', '#DB7093', '#7FFF00', '#4B0082']
    labels = ['hr', 'Vпр, м\с', 'c', 'gh', 'h', 'j', 'h']
    x = data[0]
    m = 0
    for i in range(0, 7):
        y = data[i+1]
        ymax = max(y)
        ymin = min(y)
        stepx = max(x)/10
        axs[i].clear()
        axs[i].label_outer()
        axs[i].set_ylim([ymin*1.1, ymax*1.1])
        axs[i].set_xticks(np.arange(0, max(x)+1, stepx))
        axs[i].spines['right'].set_visible(False)
        axs[i].spines['top'].set_visible(False)
        axs[i].autoscale_view()
        axs[i].set_ylabel(labels[i])
        axs[i].plot(x, y, colors[i])

        if ymax > 1000 and ymax>2000:
            axs[i].set_yticks(np.arange(ymin, ymax, 400))
        elif ymax < 1000 and ymax>500:
            axs[i].set_yticks(np.arange(ymin, ymax, 200))
        elif ymax>100 and ymax<500:
            axs[i].set_yticks(np.arange(ymin, ymax, 50))
        elif ymax<100 and ymax>15:
            axs[i].set_yticks(np.arange(ymin, ymax, 20))
        elif ymax<15 and ymax>1:
            axs[i].set_yticks(np.arange(ymin, ymax, 2))
        else:
            axs[i].set_yticks(np.arange(ymin, ymax, 0.20))

        #DATA_POINTS_TO_DISPLAY = 200
        #data1 = deque(maxlen=DATA_POINTS_TO_DISPLAY)

    plt.xlabel('Время')
    mplcursors.cursor(hover=True)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1119, 821)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")

        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)

        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 0, 1, 1, 1)

        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout.addWidget(self.pushButton_3, 0, 2, 1, 1)

        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout.addWidget(self.pushButton_4, 0, 3, 1, 1)

        self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_5.setObjectName("pushButton_5")
        self.gridLayout.addWidget(self.pushButton_5, 0, 4, 1, 1)

        self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_6.setObjectName("pushButton_6")
        self.gridLayout.addWidget(self.pushButton_6, 0, 5, 1, 1)

        self.figure = plt.figure(dpi=100)
        self.gs = self.figure.add_gridspec(7, hspace=0)
        self.axs = self.gs.subplots(sharex=True, sharey=False)
        self.figure.tight_layout()

        #self.figure.canvas.mpl_connect('button_press_event', onClick)
        #anim_running = True
        self.ani = FuncAnimation(self.figure, animation, fargs = (self.axs,), interval = 1000, blit = False)
        self.canvas = FigureCanvasQTAgg(self.figure)
        self.toolbar = NavigationToolbar2QT(self.canvas, self.canvas)
        self.gridLayout.addWidget(self.canvas, 1, 0, 1, 18)
        self.canvas.draw()

        #self.widget = QtWidgets.QWidget(self.centralwidget)
        #self.widget.setObjectName("widget")
        #self.gridLayout.addWidget(self.widget, 1, 0, 1, 6)

        self.step = 1
        #self.scroll = QtWidgets.QScrollArea(self.centralwidget)
        #self.scroll.setWidget(self.canvas)
        #self.scroll.setWidgetResizable(True)
        #self.gridLayout.addWidget(self.scroll,  2, 0, 1, 18)
        self.scroll = QtWidgets.QScrollBar(self.centralwidget)
        self.scroll.setOrientation(QtCore.Qt.Horizontal)
        self.scroll.setPageStep(self.step * 100)
        self.scroll.setObjectName("scroll")
        self.gridLayout.addWidget(self.scroll,  2, 0, 1, 18)
        self.setupSlider()
        #self.scroll.sliderMoved.connect(self.canvas)

        MainWindow.setCentralWidget(self.centralwidget)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_2.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_3.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_4.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_5.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_6.setText(_translate("MainWindow", "PushButton"))

    def setupSlider(self):

        self.lims = np.array(self.axs[0].set_xlim())
        self.scroll.setPageStep(self.step * 100)
        self.scroll.actionTriggered.connect(self.updatePage)
        self.updatePage()

    def updatePage(self, evt = None):
        r = self.scroll.value() / ((1 + self.step) * 100)
        l1 = self.lims[0] + r * np.diff(self.lims)
        l2 = l1 + np.diff(self.lims) * self.step
        self.axs[0].set_xlim(l1, l2)
        print(self.scroll.value(), l1, l2)
        self.figure.canvas.draw_idle()

    #def stop_anim(self):
       #self.ani.event_source.stop()
       #self.ani.run ^= False

    #def onClick(event):
        #nonlocal anim_running
        #if anim_running:
            #ani.event_source.stop()
            #anim_running = False
        #else:
           # ani.event_source.start()
            #anim_running = True

if __name__ == '__main__':
    app = QtWidgets.QApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)
        w1 = Ui_MainWindow()
        Form = QtWidgets.QMainWindow()
        w1.setupUi(Form)
        Form.show()
        app.exec_()

<code>
 _prev_data = None

 global _prev_data
        if _prev_data == data.size:
            return
        else:
            _prev_data = data.size
        print(data.size)
</code>
добавила этот код и смогла остановить анимацию после data = pd.DataFrame(data) <-- этой строки


Повторение в строке [закрыт]

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

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

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

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

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

Как вариант:

word = 'привеееееет'
word_fixed = ''.join(cur if cur != prev else '' for cur,prev in zip(word,word[1:]+' '))
print(word_fixed)

Вывод:

привет

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


Как работает конструкция f'{n:,}'?
Писал код на codewars и нашел то, что сложно загуглить)
писал код который из
'10000000' дает
'10,000,000'
ну так вот, в solve, я нашел такую конструкцию:
f'{n:,}' и не совсем понял как она работает, буду очень благодарен, если обьясните ;)

>>> num = 10000000
>>> print(f"{num:,}")
10,000,000

Часть после двоеточия - это спецификатор формата.
Запятая - это желаемый разделитель, поэтому
f"{num:_}" вместо запятой используются подчеркивания.

С этим методом можно использовать только символы
«,» и
«_».
Это эквивалент использования
format(num, ",") более старых версий python3.


Получить разрешение на отправку сообщений ботом от имени сообщества ВК
Пишу Бота для ВК Сообщества на Python.
У меня есть файлы пользователей, в которых хранится их информация для Бота.
Мне нужно, чтобы этим пользователям отправлялась рассылка в 00:00.
Я получил имена их файлов, получил таким образом их
id, занёс в список, но ВК пишет, что:

Нельзя отправить сообщение без права/разрешения
Можете помочь?
UPD:
Прочитав документацию, я использовал метод:
showAllowMessagesFromCommunityBox для получения разрешения, но после указания
group_id в методе, мне выдало:

int object has no attribute 'copy'

                            group_id = 1234567890

                            #Код

                            if msg_lower == 'вкл рассылку' or msg_lower == 'включить рассылку' or msg_lower ==  'рассылка вкл' or msg_lower == 'вкл рассылка':
                                answered = True

                                way = 'Data/Users/'+str(id)+'.dat'

                                time.sleep(0.5)
                                if newsletter_summerDay == 'Включена':
                                    sender(id, 'Рассылка и так включена!', '')
                                if newsletter_summerDay == 'Выключена':
                                    sender(id, 'Для включения рассылки нажмите "OK" в появившемся окне', '')
                                    vk_session.method("showAllowMessagesFromCommunityBox", group_id)

                                    if event.onAllowMessagesFromCommunityCancel:
                                        time.sleep(0.5)
                                        sender(id, 'Вы отменили включение рассылки', '')
                                    elif event.onAllowMessagesFromCommunity:
                                        time.sleep(0.5)
                                        sender(id, 'Включаю рассылку...', '')
                                        path = pathlib.Path(way); path.write_text(path.read_text().replace('Рассылка (Какой день лета): Выключена', 'Рассылка (Какой день лета): Включена'))
                                        time.sleep(0.5)
                                        sender(id, 'Рассылка включена!', '')

Сообщение
Для включения рассылки нажмите "OK" в появившемся окне отправляется, но после вк метода ничего не работает.

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

Метод showAllowMessagesFromCommunityBox Client API в приложениях сообществ;
Метод messages.allowMessagesFromGroup в Standalone-приложениях;
Виджет «Разрешить писать сообществу» на внешнем сайте.

В Callback API и Bots Longpoll API события message_allow и message_deny помогут отслеживать факт разрешения и запрета сообщений от сообщества.
Обратите внимание, получить список всех пользователей, разрешивших сообщения сообществу, через API нельзя, необходимо хранить и синхронизировать этот список на своей стороне.
Источник


Как конвертировать один часовой пояс в другой?
У меня есть строка с временем, допустим,
13:47, и допустим это время в
'America/New_York' часовом поясе.
Как мне это время сконвертировать в Московский часовой пояс?
Пробовал вот так:

import datetime
import pytz

time = "13:47"
#
tz = 'America/New_York'
tz1 = 'Europe/Moscow'
#
time = datetime.datetime.strptime(time, "%H:%M")
#
time1 = time.replace(tzinfo=pytz.timezone(tz))
print("In America/New_York " + datetime.datetime.strftime(time1, "%H:%M"))

time2 = time1.astimezone(tz=pytz.timezone(tz1))
print("In Europe/Moscow " + datetime.datetime.strftime(time2, "%H:%M"))

Но результат неверный:

In America/New_York 13:47
In Europe/Moscow 21:13

Я не уверен, но возможно это связано с тем, что в 1900 году в москве жили еще по юлианскому календарю. А если не указывать дату, то Python автоматически создаст объект
datetime с датой
1900-01-01. Попробуйте указать более актуальный год и используйте следующий подход:

from datetime import datetime as DT
import pytz

tz1 = pytz.timezone('America/New_York')
tz2 = pytz.timezone('Europe/Moscow')

dt_tz2 = tz1.localize(DT.strptime("2021-01-01 13:47", "%Y-%m-%d %H:%M")).astimezone(tz2).strftime("%Y-%m-%d %H:%M")

Судя по примерам Python начинает правильно переводить время для москвы начиная с 1919-07-01:

In [248]: tz1.localize(DT.strptime("1900-01-01 13:47", "%Y-%m-%d %H:%M")).astimezone(tz2).strftime("%Y-%m-%d %H:%M")
Out[248]: '1900-01-01 21:13'

In [249]: tz1.localize(DT.strptime("1919-01-01 13:47", "%Y-%m-%d %H:%M")).astimezone(tz2).strftime("%Y-%m-%d %H:%M")
Out[249]: '1919-01-01 22:18'

In [250]: tz1.localize(DT.strptime("1920-01-01 13:47", "%Y-%m-%d %H:%M")).astimezone(tz2).strftime("%Y-%m-%d %H:%M")
Out[250]: '1920-01-01 21:47'

In [251]: tz1.localize(DT.strptime("2000-01-01 13:47", "%Y-%m-%d %H:%M")).astimezone(tz2).strftime("%Y-%m-%d %H:%M")
Out[251]: '2000-01-01 21:47'

In [252]: tz1.localize(DT.strptime("2021-01-01 13:47", "%Y-%m-%d %H:%M")).astimezone(tz2).strftime("%Y-%m-%d %H:%M")
Out[252]: '2021-01-01 21:47'

In [253]: tz1.localize(DT.strptime("1919-07-01 13:47", "%Y-%m-%d %H:%M")).astimezone(tz2).strftime("%Y-%m-%d %H:%M")
Out[253]: '1919-07-01 21:47'

In [254]: tz1.localize(DT.strptime("1919-06-30 13:47", "%Y-%m-%d %H:%M")).astimezone(tz2).strftime("%Y-%m-%d %H:%M")
Out[254]: '1919-06-30 22:18'


Как можно итерировать по str объекту с \n, \t
Например, у меня есть переменная
html = '<html>\n\t<head>\n\t\t<meta charset ="utf-8">\n\t\t</meta>\n\t</head>\n<\html>'
Как можно итерировать по каждой строке html без табуляций? Пробовал
for i in  html.strip().split(): не получается.
Без сторонних библиотек.

Для начала можно разбить на строки

lines = html.splitlines()

lines будет содержать следующее

['<html>', '\t<head>', '\t\t<meta charset ="utf-8">', '\t\t</meta>', '\t</head>', '<\\html>']

А затем можно итерироваться, убирая мешающие знаки:

for i in lines:
  print(i.replace('\t',''))

Вывод

<html>
<head>
<meta charset ="utf-8">
</meta>
</head>
<\html>


Как добавить в начало строки n символов на python?
Есть строка из произвольного количества символов, как можно добавить в её начало n символов с?
rjust не подходит.
Сейчас делаю, так, но думаю, есть что-то лучше.
<code>
s = str().rjust(n, c) + s
</code>

c = 'u'  # символ
n = 4  # количество раз
was_str = 'данная строка'
new_str = c * n
print(new_str + was_str)


Помогите пожалуйста! Как узнать логин и пароль от почты через python? [закрыт]

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

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

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

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

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

То что вы описали называется стиллер. Все сохраненные пользователем данные для входа хранятся в не очень зашифрованном виде в локальной базе данных обозревателя (браузера).
Более подробно изучить работу стиллера вы можете покопавшись в этом репозитории: www.github.com/hakanonymos/steal-chrome-password-all-version/
И помните что несанкционированный доступ к личным данным является не законным и противоправным деянием. Не используйте стиллер в корыстных целях


Вывод всех ключей в списке из словарей [закрыт]

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

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

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

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

Есть такой список словарей:

[{'id': 53, 'name': 'Thriller'}, {'id': 80, 'name': 'Crime'}, {'id': 18, 'name': 'Drama'}]

Как из него вытащить все ключи
'name'?

dicti = [{'id': 53, 'name': 'Thriller'}, {'id': 80, 'name': 'Crime'}, {'id': 18, 'name': 'Drama'}]
names = [] # Массив в котором будут храниться имена
for i in dicti:
    print(i['name'])
    names.append(i['name']) # добавляем значение name в массив names
print(names) # ['Thriller', 'Crime', 'Drama']

И есть вариант более изящнее как написал выше asanisimov:

names = [dict_['name'] for dict_ in list_]

Хотелось бы посоветовать подучить работу с массивами, это ведь основы :)


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

df = pd.DataFrame({ 'a':['female, female, female, female, male, female', 'female, male, female, female', 'female, female, female', 'male, male, male']})

       a
0   female, female, female, female, male, female
1   female, male, female, female
2   female, female, female
3   male, male, male

Моё решение с использованием метода
set():

f = lambda x: [set(y) for y in x.split('; ')]
df['b'] = df['a'].apply(f)

Даёт следующий результат:

      a                                              b
0   female, female, female, female, male, female    [{m, , e, ,, a, f, l}]
1   female, male, female, female                    [{m, , e, ,, a, f, l}]
2   female, female, female                          [{m, , e, ,, a, f, l}]
3   male, male, male                                [{m, , e, ,, a, l}]

А нужно:

     a                                               b
0   female, female, female, female, male, female    female, male
1   female, male, female, female                    female, male
2   female, female, female                          female
3   male, male, male                                male

Вариант 1:

df["res"] = [", ".join(set(x.split(", "))) for x in df["a"]]

Вариант 2:

df["res"] = df["a"].str.split(", ").apply(lambda x: ", ".join(set(x)))

Вариант 3:

df["res"] = df["a"].str.split(", ").explode().groupby(level=0).apply(lambda x: ", ".join(set(x)))

Результат:

In [93]: df
Out[93]:
                                              a           res
0  female, female, female, female, male, female  male, female
1                  female, male, female, female  male, female
2                        female, female, female        female
3                              male, male, male          male


Сравнение адресов Python
Пытаюсь разобраться, как сравнить строки
Примеры строк
<code>
1. г. Москва, вн.тер.г. муниципальный округ Тверской, ул Кузнецкий Мост, д. 4/3, стр. 1, этаж МАНСАРДНЫЙ, ПОМ. I, ком. 413
2. г. Москва Тверской ул Кузнецкий Мост д. 4/3 стр. 1

3. 105005 г. Москва 2-я Бауманская ул. 5 стр. 1
4. 105005 г. Москва ул. Радио д. 20
</code>
Как видно, строки 1 и 2 содержат в целом одинаковый адрес. А строки 3 и 4 разный.
Я не могу понять, как сделать,чтобы программа выдавала, что 1 и 2 адрес - один и тот же.
Даже не знаю  с чего начать...

почистить всякий мусор
использовать нечёткое сравнение

В первом приближении может выглядеть так:

import re
from fuzzywuzzy import fuzz

junk_words = [
r'вн\.тер\.г\.',
'муниципальный округ',
r'этаж \w+',
r'ПОМ\. \w+',
r'ком\. \w+',
r'\,']
junk_re = re.compile('|'.join(f'{w}' for w in junk_words), re.IGNORECASE)

addresses = [
'г. Москва, вн.тер.г. муниципальный округ Тверской, ул Кузнецкий Мост, д. 4/3, стр. 1, этаж МАНСАРДНЫЙ, ПОМ. I, ком. 413',
'г. Москва Тверской ул Кузнецкий Мост д. 4/3 стр. 1',
'105005 г. Москва 2-я Бауманская ул. 5 стр. 1',
'105005 г. Москва ул. Радио д. 20',
]

addr_processed = [junk_re.sub('', addr).strip() for addr in addresses]
print('\n'.join(addr_processed))

for i,w1 in enumerate(addr_processed):
    for j,w2 in enumerate(addr_processed):
        if i >= j:
            continue
        print(i, j, fuzz.ratio(w1.lower(),w2.lower()))

Почищенные от ненужной информации адреса:

г. Москва   Тверской ул Кузнецкий Мост д. 4/3 стр. 1
г. Москва Тверской ул Кузнецкий Мост д. 4/3 стр. 1
105005 г. Москва 2-я Бауманская ул. 5 стр. 1
105005 г. Москва ул. Радио д. 20

Результаты сравнения:

0 1 98
0 2 52
0 3 45
1 2 51
1 3 46
2 3 63

Обычно рейтинг где-то >95 означает, что данные можно считать совпадающими. В данном случае совпадают 1-й и 2-й адреса, остальные сравнения дают очень маленький рейтинг. Основные проблемы бывают на рейтинге от 85 до 95, но дополнительная чистка/нормализация данных может помочь - надо смотреть, где алгоритм не справляется и добавлять ещё преобразований данных.
Но вообще может получиться и так, что вы в итоге утонете в этих преобразованиях данных. В общем случае это довольно нетривиальная задача и она может оказаться гораздо сложнее, чем выглядит на первый взгляд.


tf.Variable созданный в __call__ слоя. tensorflow, python
У меня есть мой слой:

class Laplacian(tf.keras.layers.Layer):
  def __init__(self):
      super(Laplacian, self).__init__()

  def build(self, input_shape):
      self.filter = tf.constant([[0, -1, 0],
                                [-1, 4, -1],
                                [0, -1, 0]], dtype=tf.float32)

  def call(self, tensor):
      stride = (1, 1)
      channels = tensor.shape[3]
      n1 = tf.cast(((tf.shape(tensor)[1]-self.filter.shape[0])/stride[0]+1), dtype=tf.int32)
      n2 = tf.cast(((tf.shape(tensor)[2]-self.filter.shape[1])/stride[1]+1), dtype=tf.int32)
      result = tf.Variable(tf.zeros((tf.shape(tensor)[0], n1, n2, channels)), dtype=tf.float32, trainable=False)

      for ch in range(channels):
          for row in range(0, tf.shape(tensor)[1], stride[0]):
              for col in range(0, tf.shape(tensor)[2], stride[1]):
                  if (row+self.filter.shape[0]-1<tf.shape(tensor)[1] and col+self.filter.shape[1]-1<tf.shape(tensor)[2]):
                      temp_mtx = tensor[:, row:self.filter.shape[0]+row, col:self.filter.shape[1]+col, ch]
                      val = tf.tensordot(temp_mtx, self.filter, 2)
                      #print(val)
                      result[:, row//stride[0], col//stride[1], ch].assign(val)
      return result

когда я хочу добавить его в свою модель, он ругается на tf.Variable:

avg_pool = tf.keras.layers.AveragePooling2D(pool_size=(3, 3), strides=(3, 3), padding='valid', name='avg_pooling2D')(vgg.layers[-2].output)
lap_layer = Laplacian()(avg_pool)

Вот такая ошибка:
ValueError: Tensor-typed variable initializers must either be wrapped in an init_scope or callable (e.g.,
tf.Variable(lambda : tf.truncated_normal([10, 40]))) when building functions. Please file a feature request if this restriction inconveniences you.
Если я оборачиваю variable в lambda, то непонятно, как мне к ней обращаться и изменять элементы моего тензора result.

Нужно было перенести создание result в build
<code>
class Laplacian(tf.keras.layers.Layer):
  def __init__(self):
      super(Laplacian, self).__init__()
      self.filter = tf.constant([[0, -1, 0],
                                [-1, 4, -1],
                                [0, -1, 0]], dtype=tf.float32)

      self.stride = (1, 1)

  def build(self, input_shape):
      channels = input_shape[3]
      n0 = input_shape[0]
      # n1 = tf.cast(, dtype=tf.int32)
      # n2 = tf.cast(, dtype=tf.int32)

      # n1 = tf.cast(((n1-self.filter.shape[0])/self.stride[0]+1), dtype=tf.int32)
      # n2 = tf.cast(((n2-self.filter.shape[1])/self.stride[1]+1), dtype=tf.int32)
      n1 = tf.math.add(tf.math.divide(tf.math.subtract(input_shape[1], self.filter.shape[0]), self.stride[0]), 1)
      n1 = tf.math.add(tf.math.divide(tf.math.subtract(input_shape[2], self.filter.shape[1]), self.stride[1]), 1)

      self.result = tf.Variable(tf.zeros((n0, n1, n2, channels)), dtype=tf.float32, trainable=False)

  def call(self, tensor):
      for ch in range(channels):
          for row in range(0, tf.shape(tensor)[1], self.stride[0]):
              for col in range(0, tf.shape(tensor)[2], self.stride[1]):
                  if (row+self.filter.shape[0]-1<tf.shape(tensor)[1] and col+self.filter.shape[1]-1<tf.shape(tensor)[2]):
                      temp_mtx = tensor[:, row:self.filter.shape[0]+row, col:self.filter.shape[1]+col, ch]
                      val = tf.tensordot(temp_mtx, self.filter, 2)
                      self.result[:, row//self.stride[0], col//self.stride[1], ch].assign(val)
      return self.result

</code>


Как импортировать динамически
Товарищи знатоки Python :)
У меня есть: каталог(относительный) - library/MDrop/MDrop.py
Так же основной файл проекта: project/main.py
<code>
#main.py
for x in os.listdir('library/'):
    pluginsNum = pluginsNum + len(fnmatch.filter(os.listdir(f'library/{x}'), '*.ini')) #считаю кол-во библиотек
    #как в этом месте мне импортировать файл MDrop.py если условно я не знаю как он называется
    #Как я могу использовать переменную X при импорте
</code>
P.S.:
Вот полное дерево проекта project/library (main.py)/MDrop/MDrop.py

Вот пример кода. Файл загружается в spec (спецификацию) с именем handlermod, затем импортируется в переменную ( аналогично import... as mod). и можно обращаться к классу или функции, которые реализуют Ваш плагин.
<code>
    spec = importlib.util.spec_from_file_location("handlermod", filename)
    if not spec:
        continue
    mod = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(mod)
    Handler = mod.Handler
</code>


Вычисления с элементами массива
Всем привет!
У меня возникла небольшая проблема у меня имеется список с различными значениями в хаотичном порядке содержащим числа от 1 до 9. Мне нужно сделать проверку, если 3 значения в результате дадут 15.
Числа не повторяются и массив не меньше чем три числа.
Это вопрос аналогия поскольку будет использоваться более большие магические квадраты(так и называются - магические).
Я знаю что вопрос очень маленький но мне нечем его дополнить.  :/

Написал решение для общего случая:

def magic_support(dp, n, s=None, i=None, j=None, last=None):
    if s is None:
        s = n * (n ** 2 + 1) // 2
        i, j = n, s
        last = s + 1

    elif i == 0:
        yield []
        return

    for item in dp[i][j]:
        if item >= last:
            break
        for res in magic_support(dp, n, s, i - 1, j - item, item):
            yield res + [item]

def magic(a, n):
    a.sort()
    s = n ** 2 * (n ** 2 + 1) // 2 // n # 3: 15, 4: 34

    dp = [[[] for _ in range(s + 1)] for _ in range(n + 1)]
    dp[0][0] = [0]
    for item in a:
        for layer in range(n - 1, -1, -1):
            for weight in range(s - item + 1):
                if dp[layer][weight]:
                    dp[layer + 1][weight + item].append(item)

    return magic_support(dp, n)

n = 4
a = [1, 3, 5, 6, 7, 10, 12, 13]
for i in magic(a, n):
    print(i)
# [5, 7, 10, 12]
# [5, 6, 10, 13]
# [3, 6, 12, 13]

В основе алгоритма лежит ДП-решение задачи о рюкзаке. Только в данном случае предметы не имеют никакой ценности, вычисляется только принципиальная возможность собрать рюкзак определенного веса.
dp[layer][weight] отвечает на вопрос, возможно ли собрать сумму
weight из
layer предметов. В каждой ячейке массива
dp хранится список из чисел, используя которые можно ее достичь. Благодаря этому, возможно восстановить "путь", которым была собрана сумма
s.
Функция
magic работает за O(N^6), но количество путей растет очень быстро. В массиве оно хранится достаточно сжато, но я за полчаса так и не дошел до конца генератора при N=20. Знаю лишь то, что при N=11, все двадцать миллионов комбинаций перебирались две минуты.
Перебор для малых значений N, по моему мнению, проще всего пишется так:

from itertools import combinations

n = 4
s = 34
a = [1, 3, 5, 6, 7, 10, 12, 13]
for comb in combinations(a, n):
    if sum(comb) == s:
        print(*comb)
# 3 6 12 13
# 5 6 10 13
# 5 7 10 12

Но это решение не оптимально по своей скорости, поэтому я попробовал написать рекурсивный перебор с отсечением ветвей:

def rec(a, n, s=None, count=0, last=-1, summ=0, way=None):
    if count == 0:
        a.sort()
        s = n * (n ** 2 + 1) // 2
        way = []

    elif count == n:
        if summ == s:
            yield way
        return

    elif summ + (n - count) * a[last] > s:
        return

    for i in range(last + 1, len(a) - n + count + 1):
        way.append(a[i])
        yield from rec(a, n, s, count + 1, i, summ + a[i], way)
        way.pop()

n = 4
a = [1, 3, 5, 6, 7, 10, 12, 13]
for i in rec(a, n):
    print(i)
# [3, 6, 12, 13]
# [5, 6, 10, 13]
# [5, 7, 10, 12]