Убрать одинаковые значения из списка следующие друг за другом
В списке ниже иногда между разными значения (например 115.2 и 116.9) встречаются одинаковые друг за другом (напр. 114.2 и 114.2). Нужно из одинаковых оставить последнее, а предыдущие одинаковые заменить на nan.

[nan, nan, 115.4, nan, 115.4, nan, nan, nan, nan, 115.4, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.41, nan, 115.41, nan, nan, nan, nan, nan, 115.43, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.44, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.43, nan, nan, 115.43, nan, nan, nan, nan, 115.43, nan, nan]

Как решить это в одну строчку?
Что должно выйти:

[nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.4, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.41, nan, nan, nan, nan, nan, 115.43, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.44, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.43, nan, nan]

попробуйте так:

from numpy import nan
import pandas as pd
a = [nan, nan, 115.4, nan, 115.4, nan, nan, nan, nan, 115.4, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.41, nan, 115.41, nan, nan, nan, nan, nan, 115.43, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.44, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.43, nan, nan, 115.43, nan, nan, nan, nan, 115.43, nan, nan]
s = pd.Series(a).fillna(method="bfill")
s[s == s.shift(-1)]=nan
a = s.tolist()

теперь
a:

[nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.4, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.41, nan, nan, nan, nan, nan, 115.43, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.44, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 115.43, nan, nan]


python Облачное хранилище mega permissionError
Проблема в том, что не могу скачать текстовый файл с хранилища. Вернее, он качается, но пустой из-за того, что выходит ошибка.

from mega import Mega

mega = Mega()
m = mega.login("", "") # email, password

file = m.find("hotel.txt")
m.download(file)

Код такой, то есть просто скачать текстовый файл, но выходит ошибка:

Traceback (most recent call last):
File "C:\Users\nigga22nd\AppData\Local\Programs\Python\Python38\lib\shutil.py", line 791, in move
        os.rename(src, real_dst)
PermissionError: [WinError 32] Процесс не может получить доступ к файлу, так как этот файл занят другим процессом: 'C:\\Users\\NIGGA2~1\\AppData\\Local\\Temp\\megapy_r0z9_pji' -> 'hotel.txt'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
      File "MEGApy.py", line 8, in <module>
        m.download(file)
File "C:\Users\nigga22nd\AppData\Local\Programs\Python\Python38\lib\site-packages\mega\mega.py", line 564, in download
        return self._download_file(file_handle=None,
File "C:\Users\nigga22nd\AppData\Local\Programs\Python\Python38\lib\site-packages\mega\mega.py", line 745, in _download_file
        shutil.move(temp_output_file.name, output_path)
File "C:\Users\nigga22nd\AppData\Local\Programs\Python\Python38\lib\shutil.py", line 812, in move
        os.unlink(src)
PermissionError: [WinError 32] Процесс не может получить доступ к файлу, так как этот файл занят другим процессом: 'C:\\Users\\NIGGA2~1\\AppData\\Local\\Temp\\megapy_r0z9_pji'

Это баг библиотеки, который почему-то не фиксят.

Перейдите по пути
C:\Users\nigga22nd\AppData\Local\Programs\Python\Python38\lib\site-packages\mega\mega.py и откройте файл
mega.py
Выше 745ой строки (
shutil.move(temp_output_file.name, output_path)) вставьте это
temp_output_file.close()
Сохраните изменения
Запускайте код


Заменить n-элементов списка
Как заменить не последний элемент списка, а сразу три?

a=[1,2,3,4,5,6,7]
a[-1] = 0

Пока только приходит так:

a=[1,2,3,4,5,6,7]
a[-1] = 0
a[-2] = 0
a[-3] = 0

А какой самый красивый, компактный и быстрый способ?

Компактно можно через срез:

a[-3:] = [0]*3

a[-3:] - адресует последние 3 элемента списка.

[0]*3 - создаёт список из трёх одинаковых элементов. Тоже самое, что и
[0,0,0].
Ну а дальше одно присваивается другому, т.е. подсписок из последних трёх элементов заменяется на новый подсписок из трёх нулей. В результате
a станет содержать список
[1,2,3,4,0,0,0].


Не срабатывают условия if
<code>
documents = [
    {"type": "passport", "number": "2207 876234", "name": "Василий Гупкин"},
    {"type": "invoice", "number": "11-2", "name": "Геннадий Покемонов"},
    {"type": "insurance", "number": "10006", "name": "Аристарх Павлов"}
  ]

def data_people(names):

  for name in names:
    num_pass = input()
    sum_name = name['name']
    num_pass = name['number']

    if '10006' in num_pass:
      return sum_name
    elif '2207 876234' in num_pass :
      return sum_name

 print(data_people(documents))
</code>
По условию задачи надо вывести имена юзеров по номеру, т.е. ввели номер 10006, вывелся "Аристарх Павлов". Но у меня считывает и выводит почему то последний номер и выводит во всех условиях ="2207 876234 "Василий Гупкин" в чем моя ошибка ?

Запросить ввод один раз до цикла. И в цикле просто сравнить введённое значение с нужным полем словаря.
<code>
def data_people(names):

  num_pass = input()
  for name in names:
    if num_pass == name['number']:
      return name['name']
</code>


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

import pandas as pd
import numpy as np
d = {"Name": pd.Series(['Myrchik','Barsik','Bobik','Vasya','Vasya','Vasya','Barsik']),
     "test_unique": pd.Series([],dtype='object')}

df1 = pd.DataFrame(d)
print(df1.index)
print(df1.columns)
print(df1)
print(df1.test_unique)
#index = pd.MultiIndex.from_product(test_unique,names=["first", "second"])
def test_func(df1):
  for i in df1.test_unique:
    df1.test_unique.count(i)
    if df1.test_unique.count(i)  > 1:
      return 'not_unique'
    else:
      return 'unique'

test_unique = df1.apply(test_func, axis=1)
df1.test_unique = test_unique
test_unique.name = 'test_unique'
print(df1)

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

Воспользуйтесь DataFrame.duplicated():

df1["test_unique"] = \
    np.where(df1["Name"].duplicated(keep=False), "not_unique", "unique")

результат:

In [152]: df1
Out[152]:
      Name test_unique
0  Myrchik      unique
1   Barsik  not_unique
2    Bobik      unique
3    Vasya  not_unique
4    Vasya  not_unique
5    Vasya  not_unique
6   Barsik  not_unique


8 строчка кода выдаёт ошибку... Объясните, как пофиксить [закрыт]

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

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

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

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

Напишите программу, которая выводит количество элементов квадратной матрицы в каждой строке, больших среднего арифметического элементов данной строки.
Формат входных данных
На вход программе подаётся натуральное число nn — количество строк и столбцов в матрице, затем элементы матрицы (целые числа) построчно через пробел.
Формат выходных данных
Программа должна вывести nn чисел — для каждой строки количество элементов матрицы, больших среднего арифметического элементов данной строки.
<code>
n = int(input())
q = 0
w = 0
m = [input().split() for _ in range(n)]
for i in range(n):
    for j in range(n):
        q += int(m[i][j])
    if q // n <= int(m[i][y for y in range(n)]):
        w += 1
    print(q, w)
    q = 0
    w = 0
</code>
Я новичок, так что простите, если творю что-то глупое))

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

n = int(input())
m = [input().split() for _ in range(n)]
for i in range(n):
    q = 0
    for j in range(n):
        q += int(m[i][j])

    average = q / n
    w = 0
    for j in range(n):
        if int(m[i][j]) > average:
            w += 1

    print(q, w)

То же самое в более "питоничном" стиле (без использования индексов):

n = int(input())
m = [input().split() for _ in range(n)]
for row in m:
    q = 0
    for item in row:
        q += int(item)

    average = q / n
    w = 0
    for item in row:
        if int(item) > average:
            w += 1

    print(q, w)


icq new bot api ограничить область работы бота
Есть код:

def message_start(bot,event):
    bot.send_text(chat_id=event.from_chat, text = START_MESSAGE)

def start_meeting(bot):
    bot.dispatcher.add_handler(StartCommandHandler(callback=message_start))

При использовании команды
/start он отправляет сообщение пользователю. Т.к. бот работает и с чатами, он реагирует и в них. Например в aiogram для телеграмм есть фильтры позволяющие строго ограничить область работы бота. Как сделать на ICQ NEW Bot API подобное?

Решил так:
<code>
if event.data['chat']['chatId'] != '6*******[email protected]':
    bot.send_text(chat_id=event.from_chat, text = START_MESSAGE)
</code>
Я нагло проверяю от куда пришла команда, и если это мой чат, то проверка не дает вывести результат, но считаю сие творение лютым костылем, если кто знает решение получше, помогите.


Бот discord не отвечает на команду [закрыт]

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

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

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

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

подскажите как решить данную проблему? При запуске бота должен возращать написанные сообщения, но не возращает:
<code>
import discord
from discord.ext import commands

client = discord.Client()

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

@client.event
async def on_ready():
    print('Бот запущен')

@bot.command()
async def foo(ctx, arg):
    await ctx.send(arg)

</code>

Возможно вы забыли, указать токен и запуск бота? Так же я рекомендую поменять client в @client.event на @bot.event.
Используйте команду как !foo (сообщение) и бот вернет сообщение.
<code>
import discord
from discord.ext import commands
token = 'Здесь ваш токен'
bot = commands.Bot(command_prefix='!')

@bot.event #поменяйте на bot
async def on_ready():
    print('Бот запущен')

@bot.command()
async def foo(ctx, arg):
    await ctx.send(arg)

bot.run(token)
</code>


Как сделать вывод всех данных таблицы в одном сообщении
Хочу вывести данные 2х таблиц в формате

q:
a:
q:
a:

и тд

cursor = connect.cursor()
i = 0
while i<6:
 i=i+1
 Q = cursor.execute("SELECT question.Text FROM question WHERE ID < 6")
 A = cursor.execute("SELECT answers.Text FROM answers WHERE ID < 6")
 bot.send_message(message.chat.id, Q, reply_markup = markup)
 bot.send_message(message.chat.id, A, reply_markup = markup)
 connect.commit()
connect.close()

Наверное где-то так...

bot.send_message(message.chat.id, f"{Q}: {A}", reply_markup = markup)

UPD.
Не это не совсем то что вам нужно.
Думаю вот так будет лучше.

cursor.execute("SELECT question.Text FROM question WHERE ID < 6")
Q = cursor.fetchall()
cursor.execute("SELECT answers.Text FROM answers WHERE ID < 6")
A = cursor.fetchall()
connect.close()
message_str = ""
i = 0
while i < min(len(A), len(Q)):
    message_str += f"Q: {Q[i]}\nA: {A[i]}\n\n"
    i += 1
bot.send_message(message.chat.id, message_str, reply_markup = markup)


Как прекратить слушать микрофон?
У меня есть короткий код. Всё работает, если что-то сказать - это выведется, но я не понимаю, почему он слушает долго? Когда я сказал уже секунд 5-10 назад. Можно ли как-то завершить прослушивание?
<code>
import speech_recognition as sr

r = sr.Recognizer()
with sr.Microphone(device_index=2) as source:
    print("Скажите что ниудь")
    audio = r.listen(source)

voice = r.recognize_google(audio, language="ru-RU")
print("Вы сказали:" + voice.lower())

if voice == "Привет":
    print("Привет")
</code>

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

# это максимум, попробуйте разные значения от 50 до 4000
r.energy_threshold = 4000

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

# по умолчанию он включен, т.е. True
r.dynamic_energy_threshold = False

Там есть и другие параметры, которыми можно поиграться. Главное сначала понять, в чём проблема. Я так понимаю, в вашем случае фоновый шум принимается за речь, т.е. высокая чувствительность микрофона, либо высокий уровень шума. Нужно исходить из этого при подборе параметров. В документации это обозначено как "The recognizer tries to recognize speech even when I’m not speaking." например.


Определить, сколько элементов списка содержат по 3 слова, по 2 и по одному
<code>
queries = [
'смотреть сериалы онлайн',
'новости спорта',
'афиша кино',
'курс доллара',
'сериалы этим летом',
'курс по питону',
'сериалы про спорт'
]
for i in queries:
  if " " in i:
   print(i)
</code>
Есть список. Надо определить, сколько элементов с 3 словами, с 2-мя и одним. Моя мысль такова: Если три слова в элементе, то два пробела. Если 2 слова, то пробел один. Но вот, незадача Я пробовал условием искать пробел, но выходит найти только один и в итоге возвращает тот же список, потому что дин пробел имеют все элементы. Как составить проверку, чтобы питон искал 2 пробела или один. Или возможно нужно выбрать другой критерий сортировки? Помогите плиз

Если нужно считать слова, то и нужно считать слова, а не пробелы. Функцией
split() разделить строку на список слов и посчитать его длину:

queries = [
'смотреть сериалы онлайн',
'новости спорта',
'афиша   кино',
'курс доллара',
'сериалы этим летом',
'курс по  питону для  начинающих',
'сериалы   про  спорт'
] # для наглядности в некоторых местах больше одного пробела, на результат не влияет
two, three = 0, 0
for el in queries:
    words = el.split()
    if len(words) == 2:
        print("2 слова")
        two += 1
    elif len(words) == 3:
        print("3 слова")
        three += 1
    else:
        print("другое количество слов")


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

doc   anno_name   start   extracted_text    anno_init
doc_1   1_1        124.0    text1              1
doc_1   1_2        124.0    text2              1
doc_1   1_3        123.0    text2              1
doc_2   2_1        119.0    text4              2
doc_2   2_1          NaN    text4              2
doc_2   2_2          NaN    text5              2
doc_3   3_1        123.0    text6              3
doc_3   3_2        123.0    text7              3
doc_3   4_1        124.0    text6              4
doc_3   53         124.0    text6             53

В нем мне нужно удалить дубликаты.
Дубликатом является запись, в которой значения в колонках
doc,
anno_init и
start повторяются, но не есть
NaN
Т.е. на выходе должен быть датафрейм:

doc   anno_name   start   extracted_text    anno_init
    doc_1   1_1        124.0    text1              1
    doc_1   1_3        123.0    text2              1
    doc_2   2_1        119.0    text4              2
    doc_2   2_1          NaN    text4              2
    doc_2   2_2          NaN    text5              2
    doc_3   3_1        123.0    text6              3
    doc_3   4_1        124.0    text6              4
    doc_3   53         124.0    text6             53

Если я сделаю:

df.drop_duplicates(subset = ['doc', 'anno_init', 'start'])

то у меня удалятся так же дубликаты, в которых есть
NaN, что меня не устраивает.
Я могу разделить датафрейм на 2 части: где
start == NaN и
start != NaN, удалить дупликаты во второй части и потом иx обратно заджойнить, но мне это решение не очень нравиться)
Как удалить дубликаты так, чтобы все значения
NaN в колонке
start остались в датафрейме?
Спасибо!

Идея в том, чтобы сделать
NaN значения в столбце
start уникальными (0, 1, ..., N):

res = (df
       .assign(x=df["start"].fillna(pd.Series(np.arange(len(df)), index=df.index)))
       .drop_duplicates(["doc","anno_init","x"])
       .drop(columns="x"))

результат:

In [91]: res
Out[91]:
     doc anno_name  start extracted_text  anno_init
0  doc_1       1_1  124.0          text1          1
2  doc_1       1_3  123.0          text2          1
3  doc_2       2_1  119.0          text4          2
4  doc_2       2_1    NaN          text4          2
5  doc_2       2_2    NaN          text5          2
6  doc_3       3_1  123.0          text6          3
8  doc_3       4_1  124.0          text6          4
9  doc_3        53  124.0          text6         53


Как сделать чтобы закрывалось дочернее окно после закрытия главного?
Друзья, Прошу Вашей помощи. Я создаю шаблон через
QtDesigner (в данном примере форма с единственной кнопкой), после чего создаю класс дочернего окна.
Нужно чтобы оно закрывалось автоматически, после закрытия основного окна - window:

from PyQt5 import uic, QtWidgets, QtCore
from PyQt5.QtWidgets import QApplication

Form, Window = uic.loadUiType("untitled.ui")

app = QApplication([])
window = Window()
form = Form()
form.setupUi(window)
window.show()

def open_window1():
    window1.show()

form.pushButton.clicked.connect(open_window1)

class Window1(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Дочернее окно")
        # self.setWindowFlags(QtCore.Qt.Window)  # +++ Qt.Window

window1 = Window1()

app.exec()

Укажите главное окно как родительское для дочернего и при закрытии главного, дочернее закроется автоматически.
Если наследование от
QWidget:

...
class Window1(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.setWindowFlags(QtCore.Qt.Dialog)

window1 = Window1(window)
...

Если наследование от
QDialog (рекомендую):

...
class Window1(QtWidgets.QDialog):
    def __init__(self, parent=None):
        QtWidgets.QDialog.__init__(self, parent)

window1 = Window1(window)
...

Еще вариант - связать сигнал закрытия одного окна со слотом закрытия другого.


Как узнать какой язык используется в тексте
Есть массив строчек
<code>
[
   'Something in English и что-то на русском',
   'किसी भाषा में कुछ Something in English',
   'Something in English'
]
</code>
Как можно проверить эти строчки и получить только ту, в которой есть только английский язык?
Возможно ли решить данную задачу с помощью регулярных выражений?

На python вот так можно:

from langdetect import detect

lang = detect("Ein, zwei, drei, vier")

print lang
#output: de

или можно так:

from textblob import TextBlob
b = TextBlob("bonjour")
b.detect_language()


Объясните, пожалуйста, строку кода [закрыт]

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

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

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

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

Я взял из сети строку кода, который работает правильно, но я не знаю как
<code>
import numpy as np
randomArray = np.random.uniform(1, 100, size=(5,5))
columnSumm = list(map(sum,zip(*randomArray)))
print(randomArray, columnSumm)
</code>
Объясните, пожалуйста, третью строчку кода подробно, на простом языке.

Вы создаете массив размером
5 на 5 с рандомными числами от 1 до 100, после создаете новый массив
1 на 5 из сумм каждого столбца.

list - создание списка
Функция
map() используется для применения функции к каждому элементу итерируемого объекта (например, списка или словаря) и возврата нового итератора для получения результатов

sum - Суммирует элементы указанного объекта и возвращает результат.
функция
zip позволяет пройтись одновременно по нескольким итерируемым объектам (спискам и др.)


Python не видит гиперссылки в ворде
Есть вордовский файл, в нем есть таблица на 4 строки 9 столбцов, в 6 столбце идут (начиная со второй строки) почты, и если почта не выделяется вордом как гиперссылка, то питон прекрасно все считывает и переводит в текст, но если выделяется, то мне выводит пустоту, как исправить?
<code>
import docx
doc = docx.Document('file.docx')
table = doc.tables[0]
print(table.cell(2,6).text)
</code>

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

from docx.text.paragraph import Paragraph
import re
Paragraph.text = property(lambda self: GetParagraphText(self))
def GetParagraphText(paragraph):

    def GetTag(element):
        return "%s:%s" % (element.prefix, re.match("{.*}(.*)", element.tag).group(1))

    text = ''
    runCount = 0
    for child in paragraph._p:
        tag = GetTag(child)
        if tag == "w:r":
            text += paragraph.runs[runCount].text
            runCount += 1
        if tag == "w:hyperlink":
            for subChild in child:
                if GetTag(subChild) == "w:r":
                    text += subChild.text
    return text

После этого опять
import docx as ###, или просто
import docx (как в моем случае)
и гипертекст внутри ячеек становится читабельным программой


Python/CMD Как получить имя процесса на переднем плане
Например, у меня на переднем плане pycharm, и мне нужно, чтобы скрипт при активации написал в консоль имя процесса pycharm (pycharm64.exe)
Мне нужна либо функция в python, либо команда CMD

если речь о windows, то потребуется используя модуль
ctypes, немного повозиться с winapi:
1: получить список хэндлов окон

HWND GetTopWindow(
  [in, optional] HWND hWnd
);

и

void GetNextWindow(
  [in]  hWnd,
  [in]  wCmd
);

2: используя их получить хэндл процесса:

HANDLE WINAPI GetProcessHandleFromHwnd(
  _In_ HWND hwnd
);

3: имея хэндл процесса получить имя исполняемого файла

DWORD GetModuleFileNameExA(
  [in]           HANDLE  hProcess,
  [in, optional] HMODULE hModule,
  [out]          LPSTR   lpFilename,
  [in]           DWORD   nSize
);


Функция с queue(python) не выполняеться While True
Функция с queue(python) не выполняеться While True. Я имею ввиду я не могу за 1 секунду записать 5 сообщений в queue для проверки добавления в ту же queue
<code>
from asyncio import Queue
import asyncio

q = Queue()
async def mama(q):

    while not q.empty():
        try:
            b = await q.get()
            await asyncio.sleep(5)
            print(b)

        except q.empty():
            None

async def yo():

    while True:

        m = input("Введите: ")

        await q.put(m)
        await mama(q)

asyncio.run(yo())
</code>

Как я понимаю, вы хотите вводить данные, отправлять их в очередь, и параллельно раз в 5 секунд из этой очереди их вытаскивать и печатать. Тогда вам нужно не вызывать
mama из
yo, а запустить обе корутины через
asyncio.gather.
Рабочий вариант:

from asyncio import Queue
import asyncio

q = Queue()

async def mama(q):
    # При запуске в очереди пусто, условие not q.empty() ложно, из-за этого в цикл даже не зайдет, меняем на True
    while True:
        b = await q.get()
        await asyncio.sleep(5)
        print(b)

async def yo():
    while True:
        m = input("Введите: ")
        await q.put(m)
        # Добавляем паузу, чтобы вторая корутина успевала получить управление и вытащить значение из очереди
        await asyncio.sleep(0.1)

async def runner():
    # Запускаем две корутины одновременно
    await asyncio.gather(mama(q), yo())

asyncio.get_event_loop().run_until_complete(runner())

Пример ввода-вывода:

Введите: 1
Введите: 2
Введите: 3
Введите: 4
Введите: 5
Введите: 6
Введите: 7
Введите: 8
Введите: 9
1
Введите: 10
Введите: 11
Введите: 12
Введите: 13
2
Введите: 14
Введите: 15
Введите:
...

Учитывайте, что
input() - синхронная функция, и во время ее выполнения асинхронные функции в текущем потоке работать не будут, т.е. если ничего не вводить, обработка очереди выполняться не будет.


vk_api.exceptions.ApiError: [100] One of the parameters specified was missing or invalid: user_id not integer
<code>
import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType
import time
import random

token = `f`
vk = vk_api.VkApi(token=token)
longpoll = VkLongPoll(vk)

def kick_users(user_id):
    vk.method("messages.removeChatUser",{'chat_id' : 59, 'user_id' : id})

# Основной цикл
for event in longpoll.listen():

    # Если пришло новое сообщение
    if event.type == VkEventType.MESSAGE_NEW:

        # Если оно имеет метку для меня( то есть бота)
        if event.to_me:

            # Сообщение от пользователя
            request = event.text

            # Каменная логика ответа
            if request == 'Привет':
                kick_users(event.user_id)
</code>
По итогу ошибка

vk_api.exceptions.ApiError: [100] One of the parameters specified was missing or invalid: user_id not integer

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

Всё, смог сам решить. Всем спасибо)
прописал на id = event.user_id
и потом прописал после сообщений and id != bot_id:


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

word = "Имя"

fileQuestion = open(f"question/{word}.csv", "r", encoding="utf-8") #output
fileQuestion.readlines()

for i in fileQuestion:
...

Вывод, который нужно получить:

Содержимое первой строки

или

Содержимое второе строки

print(random.choice(fileQuestion.readlines())) - помогает в этом случае. Оно действительно выводит рандомную строку. Спасибо @andreymal за помощь


Как очистить input и вернуться к нему
У меня есть код, который запоминает слова, а далее отвечает на это(берёт информацию из файлов).
Вопрос - как мне сделать так, чтобы программа не завершалась, а возвращалась к началу? Тут просто указать Start() не имеет пользы, нужно ещё изменить переменную word, чтобы вновь вписать.
Код далеко не идеальный, но главное - он работает. А вот собственно и он:
<code>
import pandas as pd

word = input("")

def Start():

    df = pd.DataFrame({
        "word": word,
    }, index=[0])

    file = open("Lina.csv", "r", encoding = "utf-8") #input
    filelines = file.readlines()

    #Условие - есть в файле строка или нет
    for fileline in filelines:
        if word in fileline.strip('\n').split(','):
            fileQuestion = open(f"question/{word}.csv", "r", encoding="utf-8") #output
            print(fileQuestion.read())
            break
    #Если нету строки
    else:
        df.to_csv("Lina.csv", mode="a", index=False, header=False) #Добавление в pd
        question = input("Как мне на это отвечать? ")
        fileQuestion = open(f"question/{word}.csv", "w", encoding="utf-8") #Ответы
        fileQuestion.write(question)
        fileQuestion.close()
Start()

</code>

Просто добавь
while True:

import pandas as pd

while True:

    word = input("")

    df = pd.DataFrame({
        "word": word,
    }, index=[0])

    file = open("Lina.csv", "r", encoding = "utf-8") #input
    filelines = file.readlines()

    #Условие - есть в файле строка или нет
    for fileline in filelines:
        if word in fileline.strip('\n').split(','):
            fileQuestion = open(f"question/{word}.csv", "r", encoding="utf-8") #output
            print(fileQuestion.read())
            break
    #Если нету строки
    else:
        df.to_csv("Lina.csv", mode="a", index=False, header=False) #Добавление в pd
        question = input("Как мне на это отвечать? ")
        fileQuestion = open(f"question/{word}.csv", "w", encoding="utf-8") #Ответы
        fileQuestion.write(question)
        fileQuestion.close()


начинаю изучать питон, не пойму в чем ошибка? [закрыт]

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

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

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

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

<code>
a=[12, 23, 5]

for i in a[0]:
    print (i)
</code>
TypeError: 'int' object is not iterable

Я сам не силён в чистом питоне, но наверное смогу помочь.
Я конкретно не понял, что вы хотите вывести. В проблеме написано, что вы хотите вытащить элементы с помощью цикла for, при этом вытащить хотите из одного числа.
Так что думаю, что нужно написать так:
<code>
a = [12, 23, 5]
for i in a:
     print(i)
</code>


Не могу объединить множества

ids = {'user1': [213, 213, 213, 15, 213],
   'user2': [54, 54, 119, 119, 119],
   'user3': [213, 98, 98, 35]}

for i in ids.values():
  i1 = set(i)
  print(i1.intersection(i1))

Как объединить множества, метод intersection не помогает. Выводит:

{213, 15}
{54, 119}
{98, 35, 213}

А нужно
{213, 15, 54, 119, 98, 35}

Все таки применить нужно метод изменяющий множество
update.

ids = {'user1': [213, 213, 213, 15, 213],
    'user2': [54, 54, 119, 119, 119],
    'user3': [213, 98, 98, 35]}
a = set()
for i in ids.values():
    i_ = set(i)
    set.update(a, i_)

print(a)

"""OUT
{98, 35, 213, 54, 119, 15}
"""

Методы для изменения множеств содержат
update. Такие как

update() # эквивалент |=
intersection_update() # эквивалент &=
difference_update() # эквивалент -=

Эквивалент в вашем случае

for i in ids.values():
    a |= set(i)

UPD
Добавлю отличный вариант, указанный @SergFSM.
Можно воспользоваться оператором распаковки последовательностей -
*.
Элегантно.

a = set()
a.update(*ids.values())


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

import time
import random
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *

class SlidingStackedWidget(QtWidgets.QStackedWidget):
    def __init__(self, parent=None):
        super(SlidingStackedWidget, self).__init__(parent)

        self.m_direction = QtCore.Qt.Horizontal
        self.m_speed = 500
        self.m_animationtype = QtCore.QEasingCurve.OutCubic
        self.m_now = 0
        self.m_next = 0
        self.m_wrap = False
        self.m_pnow = QtCore.QPoint(0, 0)
        self.m_active = False

    def setDirection(self, direction):
        self.m_direction = direction

    def setSpeed(self, speed):
        self.m_speed = speed

    def setAnimation(self, animationtype):
        self.m_animationtype = animationtype

    def setWrap(self, wrap):
        self.m_wrap = wrap

    @QtCore.pyqtSlot()
    def slideInPrev(self):
        now = self.currentIndex()
        if self.m_wrap or now > 0:
            self.slideInIdx(now - 1)

    @QtCore.pyqtSlot()
    def slideInNext(self):
        now = self.currentIndex()
        if self.m_wrap or now < (self.count() - 1):
            self.slideInIdx(now + 1)

    def slideInIdx(self, idx):
        if idx > (self.count() - 1):
            idx = idx % self.count()
        elif idx < 0:
            idx = (idx + self.count()) % self.count()
        self.slideInWgt(self.widget(idx))

    def slideInWgt(self, newwidget):
        if self.m_active:
            return

        self.m_active = True

        _now = self.currentIndex()
        _next = self.indexOf(newwidget)

        if _now == _next:
            self.m_active = False
            return

        offsetx, offsety = self.frameRect().width(), self.frameRect().height()
        self.widget(_next).setGeometry(self.frameRect())

        if not self.m_direction == QtCore.Qt.Horizontal:
            if _now < _next:
                offsetx, offsety = 0, -offsety
            else:
                offsetx = 0
        else:
            if _now < _next:
                offsetx, offsety = -offsetx, 0
            else:
                offsety = 0

        pnext = self.widget(_next).pos()
        pnow = self.widget(_now).pos()
        self.m_pnow = pnow

        offset = QtCore.QPoint(offsetx, offsety)
        self.widget(_next).move(pnext - offset)
        self.widget(_next).show()
        self.widget(_next).raise_()

        anim_group = QtCore.QParallelAnimationGroup(
            self, finished=self.animationDoneSlot
        )

        for index, start, end in zip(
            (_now, _next), (pnow, pnext - offset), (pnow + offset, pnext)
        ):
            animation = QtCore.QPropertyAnimation(
                self.widget(index),
                b"pos",
                duration=self.m_speed,
                easingCurve=self.m_animationtype,
                startValue=start,
                endValue=end,
            )
            anim_group.addAnimation(animation)

        self.m_next = _next
        self.m_now = _now
        self.m_active = True
        anim_group.start(QtCore.QAbstractAnimation.DeleteWhenStopped)

    @QtCore.pyqtSlot()
    def animationDoneSlot(self):
        self.setCurrentIndex(self.m_next)
        self.widget(self.m_now).hide()
        self.widget(self.m_now).move(self.m_pnow)
        self.m_active = False

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

# создайте список каких-то своих изображений
        self.list_icon = [
            "1.png", "2.png", '3.png',
        ]

        slidingStacked = SlidingStackedWidget()

        for i in self.list_icon:

            label = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
            label.setPixmap(QtGui.QPixmap(i))

            label.setScaledContents(True)

            color = QtGui.QColor(*random.sample(range(255), 3))
            label.setStyleSheet(
                "QLabel{ background-color: %s; color : white; font: 40pt}"
                % (color.name(),)
            )
            label.setFixedSize(1920, 540)

            slidingStacked.addWidget(label)

        self.timer = QtCore.QTimer() # создание таймера
        self.timer.setInterval(1000) # установите интервал срабатывания в миллисекундах
        self.timer.setSingleShot(False) # Скажите таймеру что срабатывать надо не один раз, а повторять бесконечно
        self.timer.timeout.connect(lambda: slidingStacked.slideInNext) # При срабатывании таймера вызовем функцию перехода к следующей картинке
        self.timer.start() # теперь можно таймер запустить. Он будет бесконечно крутиться пока работает программа

        button_prev = QtWidgets.QPushButton(
             "Previous", pressed=slidingStacked.slideInPrev
        )

        button_prev.setFixedSize(71, 41)

        button_next = QtWidgets.QPushButton(
             "Next", pressed=slidingStacked.slideInNext
        )
        button_next.setFixedSize(71, 41)

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)

        lay = QtWidgets.QGridLayout(central_widget)
        lay.addWidget(button_prev, 0, 0)
        lay.addWidget(slidingStacked, 0, 1)
        lay.addWidget(button_next, 0, 2)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.showMaximized()
    sys.exit(app.exec_())

Я подправил два момента:
1.

# так                               vvvvvv                            vv  но лучше см.ниже
#        self.timer.timeout.connect(lambda: slidingStacked.slideInNext())
# или так
        self.timer.timeout.connect(slidingStacked.slideInNext)

...
@QtCore.pyqtSlot()
def slideInNext(self):
    now = self.currentIndex()
    if self.m_wrap or now < (self.count() - 1):
        self.slideInIdx(now + 1)
# +++
    else:                                                     # +++
        self.slideInIdx(0)                                    # +++
...

import time
import random
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *

class SlidingStackedWidget(QtWidgets.QStackedWidget):
    def __init__(self, parent=None):
        super(SlidingStackedWidget, self).__init__(parent)

        self.m_direction = QtCore.Qt.Horizontal
        self.m_speed = 500
        self.m_animationtype = QtCore.QEasingCurve.OutCubic
        self.m_now = 0
        self.m_next = 0
        self.m_wrap = False
        self.m_pnow = QtCore.QPoint(0, 0)
        self.m_active = False

    def setDirection(self, direction):
        self.m_direction = direction

    def setSpeed(self, speed):
        self.m_speed = speed

    def setAnimation(self, animationtype):
        self.m_animationtype = animationtype

    def setWrap(self, wrap):
        self.m_wrap = wrap

    @QtCore.pyqtSlot()
    def slideInPrev(self):
        now = self.currentIndex()
        if self.m_wrap or now > 0:
            self.slideInIdx(now - 1)

    @QtCore.pyqtSlot()
    def slideInNext(self):
        now = self.currentIndex()
        if self.m_wrap or now < (self.count() - 1):
            self.slideInIdx(now + 1)
# +++
        else:                                                     # +++
            self.slideInIdx(0)                                    # +++

    def slideInIdx(self, idx):
        if idx > (self.count() - 1):
            idx = idx % self.count()
        elif idx < 0:
            idx = (idx + self.count()) % self.count()
        self.slideInWgt(self.widget(idx))

    def slideInWgt(self, newwidget):
        if self.m_active:
            return

        self.m_active = True

        _now = self.currentIndex()
        _next = self.indexOf(newwidget)

        if _now == _next:
            self.m_active = False
            return

        offsetx, offsety = self.frameRect().width(), self.frameRect().height()
        self.widget(_next).setGeometry(self.frameRect())

        if not self.m_direction == QtCore.Qt.Horizontal:
            if _now < _next:
                offsetx, offsety = 0, -offsety
            else:
                offsetx = 0
        else:
            if _now < _next:
                offsetx, offsety = -offsetx, 0
            else:
                offsety = 0

        pnext = self.widget(_next).pos()
        pnow = self.widget(_now).pos()
        self.m_pnow = pnow

        offset = QtCore.QPoint(offsetx, offsety)
        self.widget(_next).move(pnext - offset)
        self.widget(_next).show()
        self.widget(_next).raise_()

        anim_group = QtCore.QParallelAnimationGroup(
            self, finished=self.animationDoneSlot
        )

        for index, start, end in zip(
            (_now, _next), (pnow, pnext - offset), (pnow + offset, pnext)
        ):
            animation = QtCore.QPropertyAnimation(
                self.widget(index),
                b"pos",
                duration=self.m_speed,
                easingCurve=self.m_animationtype,
                startValue=start,
                endValue=end,
            )
            anim_group.addAnimation(animation)

        self.m_next = _next
        self.m_now = _now
        self.m_active = True
        anim_group.start(QtCore.QAbstractAnimation.DeleteWhenStopped)

    @QtCore.pyqtSlot()
    def animationDoneSlot(self):
        self.setCurrentIndex(self.m_next)
        self.widget(self.m_now).hide()
        self.widget(self.m_now).move(self.m_pnow)
        self.m_active = False

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

# создайте список каких-то своих изображений
        self.list_icon = [
            "Ok.png", "boy.jpg", 'lena-2.png',
        ]

        slidingStacked = SlidingStackedWidget()

        for i in self.list_icon:

            label = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
            label.setPixmap(QtGui.QPixmap(i))

            label.setScaledContents(True)

            color = QtGui.QColor(*random.sample(range(255), 3))
            label.setStyleSheet(
                "QLabel{ background-color: %s; color : white; font: 40pt}"
                % (color.name(),)
            )
            label.setFixedSize(1920, 540)

            slidingStacked.addWidget(label)

        button_prev = QtWidgets.QPushButton(
             "Previous", pressed=slidingStacked.slideInPrev
        )
        button_prev.setFixedSize(71, 41)

        button_next = QtWidgets.QPushButton(
             "Next", pressed=slidingStacked.slideInNext
        )
        button_next.setFixedSize(71, 41)

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)

        lay = QtWidgets.QGridLayout(central_widget)
        lay.addWidget(button_prev, 0, 0)
        lay.addWidget(slidingStacked, 0, 1)
        lay.addWidget(button_next, 0, 2)

        self.timer = QtCore.QTimer()    # создание таймера
        self.timer.setInterval(1000)    # интервал в миллисекундах
#        self.timer.setSingleShot(False) # это по умолчанию

# так                               vvvvvv                            vv  но лучше см.ниже
#        self.timer.timeout.connect(lambda: slidingStacked.slideInNext())
# или так
        self.timer.timeout.connect(slidingStacked.slideInNext)

        self.timer.start() # теперь можно таймер запустить. Он будет бесконечно крутиться пока работает программа

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.showMaximized()
    sys.exit(app.exec_())

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


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

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

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

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

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

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

pip install pygame в cmd
посмотри если есть остаточные файлы от него, то удали


Почему в Pygame не меняется параметр 'x' у Rect?
Не пойму, почему не меняется параметр
x у прямоугольника.
Вот код:

import pygame as pg
import sys

pg.init()
screen = pg.display.set_mode((500, 500), 0, 32)
screen.fill((230,230,230))

rect = pg.draw.rect(screen, ' red', (0, 0, 70, 70))

image_load = pg.image.load('image.png')
image = image_load.get_rect()

def updates():
    rect.x += 1 # не работает

    image.x += 1 # работает
    screen.blit(image_load, image)

while True:

    for event in pg.event.get():
        if event.type == pg.QUIT or event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE:
            sys.exit()
    updates()

    pg.display.flip()

Он бессмысленный - просто двигает фигуру. Но таким образом я хотел разобраться с атрибутами и посмотреть как всё работает.
В данном случае я могу двигать изображение, меняя его параметр
x, но только не у отрисованного
rect.

Попробуйте так:
<code>
...

def updates():
    rect.x += 1                                           # работает

    pg.draw.rect(screen, ' red', (rect.x, 0, 70, 70))     # +++

    image.x += 1 # работает
    screen.blit(image_load, image)

...
</code>


Необходимо сделать с использованием рекурсии
Разработайте программу с рекурсивной функцией вычисление n первых членов геометрической прогрессии, первый член которой равен a и знаменатель q. Сделал код, но сомневаюсь в его правильности. Заранее спасибо.
<code>
def geom_prog(a, q, n, res=[]):
    if n == 0:
        return res + [a]
    return geom_prog(a * q, q, n - 1, res + [a])

print(geom_prog(2, 4, 8))`

</code>

Чуть чуть отредачил, а так вполне нормальный код.
<code>
def geom_prog(b, q, n):
    if n <= 1:
        return [b]
    return [b] + geom_prog(b * q, q, n-1)

print(geom_prog(1, 2, 8))
</code>


Как можно ускорить выполнение программы. Не хватает пары сотен секунд
Рассмотрим целочисленный массив a длины n. Назовём расстоянием от индекса i до множества индексов S величину dist(i,S)=∑_j∈S|a_i−a_j|. Зафиксируем целое число k. Рассмотрим функцию f(i)=min dist(i,S), где минимум берётся по множествам S размера k, не содержащим индекс i. Определите значение f(i) для всех i от 1 до n.
Пример ввода:5 33 2 5 1 2
В первой строке заданы два целых числа n и k (2≤n≤300000, 1≤k<n), описанные в условии. Во второй строке содержится n целых чисел ai (1≤a_i≤10^9) — элементы массива a.
Пример вывода:4 2 8 4 2
Алгоритм работы примерно следующий:
К каждому элементу массива ищем k ближайших по значению элемента (сам элемент не учитывается). Получаем сумму модулей разницы найденного и исходного.
<code>
def nearest(lst, target):
    return min(lst, key=lambda x: abs(x - target))

def func(k, arr):
    result = ''
    for i in range(len(arr)):
        f = 0
        arr_copy = arr.copy()
        arr_copy.pop(i)
        for j in range(k):
            num = nearest(arr_copy, arr[i])
            if num in arr_copy:
                f += abs(arr[i] - num)
                arr_copy.remove(num)
        result += str(f) + ' '
    return result

def main():
    f = input().split()
    s = map(int, input().split())
    print(func(int(f[1]), list(s)))
</code>
Пробовал обходить алгоритм при встрече высчитанного элемента - результатов в плане сокращения времени не дало.

Если идти окном размером k по отсортированному списку, должно быть значительно быстрее.

import random

def func(k, arr):
    lst = sorted(arr)
    d = {}
    _se = sum(lst[:k])
    for i in range(len(lst)-k):
        _se += lst[i+k]
        sb, se = 0, _se
        for p in range(k+1):
            v = lst[i+p]
            se -= v
            sum_dist = (p*v - sb) + (se - (k-p)*v)
            if v not in d or sum_dist < d[v]:
                d[v] = sum_dist
            sb += v
        _se -= lst[i]

    return [str(d[v]) for v in arr]

k = 300
s = random.sample(range(1, 10**9 + 1), 30000)
print(" ".join(func(k, s)))

Данная выборка (300 из 30000) обработалась за 5.11 сек. Вариант от @ДимаВиноградов - за 274.14 секунды. Оригинальная функция дала ответ за ... (прошло более получаса - всё ещё думает).

Вариант за линейное время:

def func(k, arr):
    lst = sorted(arr)
    d = {}
    sb, se = 0, sum(lst[:k+1])
    b, ll = 0, len(lst)
    for i,v in enumerate(lst):
        se -= v
        d[v] = (i-b)*v*2 - sb + se - k*v
        while b < i and b+k+1 < ll:
            sum_dist = (i-b-1)*v*2 - sb + lst[b] + se + lst[b+k+1] - k*v
            if sum_dist > d[v]:
                break
            d[v] = sum_dist
            sb -= lst[b]
            b += 1
            se += lst[b+k]
        sb += v

    return [str(d[v]) for v in arr]

При любом k на списке в 300 тыс элементов укладывается в пару секунд. Принцип почти тот же, только окно движется только вправо, без возврата и без полного перебора k дистанций для каждого элемента. Так что по сути работает за O(n).


Задача Анаграммы
Формат ввода:
В первой строке идёт целое число n (1 ≤ n ≤ 100 000), количество исходных слов.
Далее следует n слов, по одному слову в строке, слова могут идти в разном регистре!
Формат вывода:
В одной строке должны идти слова, которые являются анаграммами друг для друга, в нижнем регистре, через пробел. Порядок слов — лексикографический (как в словаре). Порядок строк так же лексикографический.
Не прошу решить задачу, прошу прояснить один момент мне.
Мой код:
<code>
n = int(input())
s = []
for i in range(n):
    s.append(input().lower())
s = sorted(s)
print(s)
for i in s:
    anagrams = []
    for j in s:
        if sorted(list(i)) == sorted(list(j)):
            anagrams.append(j)
    if len(anagrams) > 1:
        print(*anagrams)
        for j in anagrams:
            del s[s.index(j)]
</code>
Я собираю слова в один список. После прохожусь по нему: беру первое слово и после ещё раз прохожусь по списку слов для того чтобы найти анаграммы, найдя все я помещаю их в список anagrams.
Для того чтобы слова не повторялись, я прохожусь по списку анаграмм, и удалю из списка s все слова которые встречаются в списке anagram. Возникает проблема, мне нужно чтобы цикл проходился по уже изменённому списку, например был такой список:
['окорок', 'петлей', 'плетей', 'рококо', 'теплей', 'тишь', 'томно', 'тонко', 'тонок', 'тоном', 'шить']
И при удалении анаграмм, окорок и рококо, список стал иметь вид:
['петлей', 'плетей', 'теплей', 'тишь', 'томно', 'тонко', 'тонок', 'тоном', 'шить']
И цикл уже начинался со слова 'петлей', но такого не происходит, прошу описать решение этой проблемы, и почему она возникает.

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

Итерируйтесь не по списку, а по его индексам

    i = 0
    while i < len(s):
        # можно удалять, вставлять, делать со списком что угодно
        i += 1

Итерируйтесь по списку, но результат записывайте в новый список. В вашем конкретном случае этот рецепт не применим - два цикла, в старых и новых списках запутаетесь.

Поменяйте алгоритм. Ваш алгоритм работает за квадрат, задачу можно решить за линейное время, если изменить структуры данных. Подсказка: соберите анаграммы в словарь:
{ключ: [слова соответствующие ключу], ...}.


Разганичение прав доступа на уровне модели в административной панели Django
Вопрос касается только работы в административной панели Django:
Имеются 2 модели Departments (отделы) и Employees (сотрудники)
<code>
class Departments(models.Model):
    title = models.CharField()

class Employees(models.Model):
    name = models.CharField()
    fk_departments = models.ForeignKey(Departments)
</code>
Например, имеются несколько отделов: "Отдел № 1" и "Отдел № 2", в первом работает Иванов, во втором Петров.
Если создать пользователя при помощи административной панели Django и дать ему все права на модель Employees (сотрудники) то пользователь по-умолчанию будет видеть полный  список сотрудников из всех отделов:

имя: "Иванов", отдел: "Отдел № 1"
имя: "Петров", отдел: "Отдел № 2"

Есть ли возможность изменить права пользователя на уровне разграничения прав по отделам в административной панели Django? (т.е. разные пользователи должны видеть сотрудников только из определенных отделов).
Например, в списке сотрудников Пользователь № 1 будет видеть только "Иванова" из "Отдела № 1"

Возможно решение "костыльное", но я решил проблему, добавив в модуле приложения admin.py следующее:
<code>
class EmployeesAdmin(admin.ModelAdmin):
    .... списки отображаемых полей....

    def get_queryset(self, request):
        qs = super(EmployeesAdmin, self).get_queryset(request)
        # Если текущий пользователь суперюзер возвращаем всё:
        if request.user.is_superuser:
            return qs
        # Если текущий пользователь принадлежит к группе "Отдел № 1" возвращаем Сотрудников только из "Отдел № 1":
        if request.user.groups.filter(name='Отдел № 1').exists():
            return qs.filter(fk_departments=1)
        # Если текущий пользователь принадлежит к группе "Отдел № 2" возвращаем Сотрудников только из "Отдел № 2":
        if request.user.groups.filter(name='Отдел № 2').exists():
            return qs.filter(fk_departments=2)
</code>


Преобразовать столбец времени датафрейм
В датафрейме время записано в столбце Time как 235500 или 101400 или 82300. Пробую к этим минуткам добавить столбец с интервалами к какому часу они принадлежат через
df['hour'] = pd.DatetimeIndex(df['Time']).hour но не получается (пишутся везде нули), видимо нужно преобразовать столбец с временем.
Как это сделать?

Ваши проблемы начинаются с того, как вы читаете данные из CSV файлов. В ответах на тот ваш вопрос вам уже посоветовали создать столбец типа
datetime64, у которого есть очень много удобных методов и атрибутов для работы с датой и временем.
Если бы у вас был столбец типа
datetime64 вы бы просто могли воспользоваться атрибутом df["<col_name>"].dt.hour:

datetime_series = pd.Series(
    pd.date_range("2000-01-01", periods=3, freq="h")
)
datetime_series
0   2000-01-01 00:00:00
1   2000-01-01 01:00:00
2   2000-01-01 02:00:00
dtype: datetime64[ns]
datetime_series.dt.hour
0    0
1    1
2    2
dtype: int64

В качестве "костыльного" решения могу предложить решение с целочисленным делением:

In [11]: df["hr"] = df["time"] // 10000

In [12]: df
Out[12]:
     time  hr
0  235500  23
1  101400  10
2   82300   8

Но правильнее все-таки использовать правильный тип данных -
datetime64.


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

Добавьте проверку, является ли автор сообщения конкретным ботом:
<code>
@bot.event
async def on_message(message):
    # если автор сообщения - этот бот
    if message.author == bot.user:
        # завершаем выполнение функции выполняя возврат
        return

    # здесь ваш остальной код
    ...
</code>


Как выдать пользователю стейт по айди?
Возник вопрос, нужно выдать определённый стейт двум пользователям по известным айди

В aiogram установить состояние любого пользователя в любом чате можно с помощью следующей конструкции:
<code>
state = dp.current_state(chat=chat_id, user=user_id)
await state.set_state(User.accepted)
</code>
Где:
dp - объект класса Dispatcher
chat_id - id чата, который должен быть равен id пользователя, если это переписка с пользователем
User.accepted - состояние в которое мы хотим привести пользователя


Как отбросить все элементы, в которых нет хотя бы одного слова [закрыт]

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

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

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

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

Задача состоит в том, чтобы отбросить все строки, в которых нет хотя бы одного слова из строки. Например:
Есть строка:
"system of a down"
Перебираю массив строк:
["system down", "system of", "moscow never sleeps"]
Нужно отбросить те строки из массива и итерироваться только по тем, которые содержат хотя бы одно слово из начальной строки (в данном случае moscow never sleeps не попадает)
Делать это нужно быстро, раньше я перебирал каждую строку и проверял на наличие хотя бы одного слова, но это, мне подсказали, неэффективно.
Я сижу уже второй час и никакой код в голову не приходит. Подскажите, пожалуйста

В общем, я решил добавлять каждое новое слово в словарь, а в словарь со словом документы, в которых оно встретилось. То есть результирующий словарь вида
{слово: {документ: сколько раз встретилось}}. Таким образом решение сильно ускорилось


Как через сущность bot получить доступ к state в aiogram?
У меня в боте происходит сбор данных про букинг компьютера, там какой клуб компьютер время и тд. Потом бот получает из сервера ссылку на оплату, чтобы пользователь оплатил. Потом в сервер мне должен прийти callback от системы платежей. И потом мне как то нужно вызвать hendler бота из сервера, чтобы он отправил сообщение пользователю что оплата прошла успешно, и потом в боте мне нужно достать данные из state, который я использовал для сбора данных о букинге, чтобы отправить запрос на сервер с этими данными. Как я понял хендлер я никак вызвать из вне не могу, поэтому я пришел к выводу чтобы использовать webhook, чтобы потом просто дергать его из сервера. Вопрос остался только в том как мне получить доступ к данным state, который я использовал для сбора данных имея только сущность bot

Можно вот так сделать.
<code>
from aiogram import Dispatcher
state = Dispatcher.get_current().current_state()
</code>


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

[<b>uuee</b>, <b>uude</b>, <b>uses</b>, <b>ssde</b>]
Как добавить в начало массива
<b>enrt</b> ?
Через insert добавляет
'<b>enrt</b>'

['<b>enrt</b>', <b>uuee</b>, <b>uude</b>, <b>uses</b>, <b>ssde</b>]

С bs4 не работал, но сейчас бегло полистал документацию, и, кажется, элементы вашего массива имеют тип Tag.
Чтобы проверить это, выведите для вашего исходного массива такое:

print(type(data[0]))

(где data - ваш массив)
Если выведется что-то такое
<class 'bs4.element.Tag'>, значит я угадал верно.
В этом случае вам нужно будет перед вставкой в массив руками создать из вашего значения объект класса Tag.
Насколько я могу судить по той же документации, это делается как-то так:

from bs4 import BeautifulSoup

soup = BeautifulSoup("<b></b>", 'html.parser')

new_tag = soup.b          # Создаём пустой тэг <b>
new_tag.append('enrt')    # Наполняем его вашим текстом

print(new_tag)

# Напечатает без кавычек: <b>enrt</b>

А дальше вы просто делаете insert элемента
new_tag в ваш массив.


Python Beautifulsoup Как достать ссылку из тега ?
Почему я не могу спарсить ссылку из тега ? Я делаю вроде всё правильно.
Этот вопрос связан с моим предыдущим вопросом.
Я хочу, чтобы выдавало ссылку, а выдаёт None.
Сам код:

def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all('section', class_='proposition')

    cars = []
    for item in items:

        titles = None
        if titles_tag := item.find('div', class_='proposition_title'):
            if titles_1_tag := titles_tag.find('h3'):
                titles = titles_1_tag.get_text(strip=True)

        links = None
        if links_tag := item.find('section', class_='proposition'):
            if links_1_tag := links_tag.find('a'):
                links = links_1_tag.get('href')

        usd_prices = None
        if usd_prices_tag := item.find('div', class_='proposition_price'):
            if usd_prices_1_tag := usd_prices_tag.find('span'):
                usd_prices = usd_prices_1_tag.get_text(strip=True)

        cars.append(
            {
                'title': titles,
                'link': links,
                'usd_price': usd_prices,
            }
        )

        print(cars)

Проблема в:

links = None
        if links_tag := item.find('section', class_='proposition'):
            if links_1_tag := links_tag.find('a'):
                links = links_1_tag.get('href')

Если нужно, то скину сайт, на котором я парсю.

Вот этот код:

links = None
   if links_tag := item.find('section', class_='proposition'):
       if links_1_tag := links_tag.find('a'):
           links = links_1_tag.get('href')

Замените на этот:

links = item.find('a', class_='proposition_link').get('href')


Почему может не работать команда | await ctx.channel.purge(limit=2) | и как её решить? | Discord.py
Проблема в том что любая команда на удаление сообщения не работает, вопрос почему.
Вот ОШИБКА  (команда hello):

Ignoring exception in command hello:
Traceback (most recent call last):
  File "C:\Users\Home\PycharmProjects\llll\venv\lib\site-packages\discord\iterators.py", line 288, in next
    return self.messages.get_nowait()
  File "C:\Users\Home\AppData\Local\Programs\Python\Python39\lib\asyncio\queues.py", line 189, in get_nowait
    raise QueueEmpty
asyncio.queues.QueueEmpty

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Home\PycharmProjects\llll\venv\lib\site-packages\discord\channel.py", line 377, in purge
    msg = await iterator.next()
  File "C:\Users\Home\PycharmProjects\llll\venv\lib\site-packages\discord\iterators.py", line 290, in next
    raise NoMoreItems()
discord.errors.NoMoreItems

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Home\PycharmProjects\llll\venv\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "C:\Users\Home\PycharmProjects\llll\main.py", line 49, in hello
    await ctx.channel.purge(limit=1)
  File "C:\Users\Home\PycharmProjects\llll\venv\lib\site-packages\discord\channel.py", line 386, in purge
    await ret[-1].delete()
  File "C:\Users\Home\PycharmProjects\llll\venv\lib\site-packages\discord\message.py", line 1023, in delete
    await self._state.http.delete_message(self.channel.id, self.id)
  File "C:\Users\Home\PycharmProjects\llll\venv\lib\site-packages\discord\http.py", line 248, in request
    raise Forbidden(r, data)
discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Home\PycharmProjects\llll\venv\lib\site-packages\discord\ext\commands\bot.py", line 939, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\Home\PycharmProjects\llll\venv\lib\site-packages\discord\ext\commands\core.py", line 863, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:\Users\Home\PycharmProjects\llll\venv\lib\site-packages\discord\ext\commands\core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: Forbidden: 403 Forbidden (error code: 50013): Missing Permissions

Вот отрывок с кодом:

# -*- coding: utf-8 -*-

import discord
from discord.ext import commands

from lop import token

bot = commands.Bot(command_prefix='--', intents=discord.Intents.all())

@bot.command()
async def hello(ctx):
    await ctx.channel.purge(limit=1)
    author = ctx.message.author
    await ctx.send(f'Hello {author.mention}!')

bot.run(token)

Прошу помочь её решить!

У бота нету нужных прав. Выдайте ему роль с правами АДМИНИСТРАТОР


aiogram как записать данные из callback в state?
Всем здравствуйте! Как можно данные из callback передать в state (на выходе должен получиться словарь)
<code>
@dp.message_handler(state=Message_User.message_product_id,
content_types=types.ContentTypes.TEXT)
async def state_3(message: types.Message, state: Message_User):
    try:int(message.text)
    except:
        await message.reply("Пожалуйста, повторите ID:")
        return

    await state.update_data(prID=message.text.title())

    markup = types.InlineKeyboardMarkup()
    markup.add(types.InlineKeyboardButton("Ключ", callback_data='product_tip_event_key'))
    markup.add(types.InlineKeyboardButton("Аккаунт", callback_data='product_tip_event_account'))
    markup.add(types.InlineKeyboardButton("Гифт", callback_data='product_tip_event_gift'))

    await message.answer(text='Выберите тип товара', reply_markup=markup)
    #await Message_User.message_product_tip.set()

#ACTIVATION
@dp.callback_query_handler(lambda event: event.data.startswith('product_tip_event_'))
async def call_send_message(event: types.callback_query.CallbackQuery, state: Message_User):
    await state.update_data(prTip=event.data.replace('product_tip_event_',''))
    await message.answer(text='Введите тип активации:')
    await Message_User.message_product_activation.set()
</code>

Попробуй поменять это

@dp.callback_query_handler(lambda event: event.data.startswith('product_tip_event_'))
async def call_send_message(event: types.callback_query.CallbackQuery, state: Message_User):

На это

@dp.callback_query_handler(text_startswith='product_tip_event_', state=Message_User)
async def call_send_message(event: types.CallbackQuery, state: FSMContext):


TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
<code>
d   = {1: 1}

def nterms(n):
    if n in d: return d[n]
    else:
        if n%2: d[n] = 1+nterms(3*n+1)
        else: d[n] = 1+nterms(n/2)

print (max((nterms(n),n) for n in range(2,10**6)))
</code>
Выдаёт ошибку "Traceback (most recent call last)" и далее следует "TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'", как я понял происходит слишком много вызовов.
Как можно исправить эту ошибку?

Из функции всегда нужно что-то возвращать, если вы потом используете её результат. У вас в ветке
else: ничего не возвращается (а значит, возвращается
None с точки зрения питона). Если я правильно понимаю, вам везде нужно возвращать
d[n], поэтому, чтобы не писать одинаковые
return-ы во всех ветках, проще инвертировать условие и сначала посчитать
d[n], если оно ещё не посчитано, а потом вернуть его в любом случае:

def nterms(n):
    if n not in d:
        if n%2:
            d[n] = 1+nterms(3*n+1)
        else:
            d[n] = 1+nterms(n/2)
    return d[n]

Теперь функция всегда возвращает
d[n], при любом
n.


Как получить переменную, изместную в скрипте в импортированный модуль?
модуль Lib.py:

def res():
    b = a
    print(b)

ноутбук на python:

from Lib import res
a = 1
global a
res()

Результат:

name 'a' is not defined

Как в импортированной функции
res() получить переменную
a, не подавая
a как входной параметр в скобках-
res(a)

На английском
SO есть рецепт:

import Lib
Lib.a = 1
Lib.res()

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


Вывод всех ключей из json

json_string = """
{
    "researcher": {
        "name": "Ford Prefect",
        "species": "Betelgeusian",
        "relatives": [
            {
                "name": "Zaphod Beeblebrox",
                "species": "Betelgeusian"
            }
        ]
    }
}
"""

Есть json файл, ответ сверху. Надо, чтобы вывод в консоль был следующим:

researcher.name: "Ford Prefect",
researcher.species: "Betelgeusian",
researcher.relatives[0].name: "Zaphod Beeblebrox",
researcher.relatives[0].species: "Betelgeusian"

UPD:
Как сделать, чтобы был вывод как я описал выше на языке Python? Скрипт снизу упирается в первый ключ.

json_data = json.loads(json_string)

for i in json_data:
    print(i)

В лоб через рекурсию:
<code>
def print_json(data, path=[]):
    if isinstance(data, dict):
        for k,v in data.items():
            print_json(v, path+[k])
    elif isinstance(data, list):
        for i,v in enumerate(data):
            print_json(v, path[:-1]+[f'{path[-1]}[{i}]'])
    elif isinstance(data, str):
        print(f'{".".join(path)}: "{data}",')
    else:
        print(f'{".".join(path)}: {data},')

print_json(json.loads(json_string))
</code>


Добавить header в сообщение kafka producer на python
Имеется kafka producer написанный на python и работающий по принципу прокси. То есть на продюсер приходит сообщение извне, обрабатывается и перенаправляется в кафку. Но столкнулся с ошибкой: in send assert type(headers) == list AssertionError
Код моего продюсера

import kafka
from http.server import BaseHTTPRequestHandler, HTTPServer
import re
import json
class HandleRequests(BaseHTTPRequestHandler):

    producer = kafka.producer.KafkaProducer(bootstrap_servers=['перечень ip'])

    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):
        self._set_headers()

    def do_POST(self):
        '''Reads post request body'''

        self._set_headers()
        content_len = int(self.headers.get('Content-Length'))
        post_body = self.rfile.read(content_len)

        self._send_kafka(post_body)

    def do_PUT(self):
        self.do_POST()

    def _send_kafka(self, body):
        self.producer.send("topic", bytes(body))

host = ''
port = 9000
HTTPServer((host, port), HandleRequests).serve_forever()

С тем, чтобы отправлять просто сообщения он справляется. Но мне потребовалось ещё дополнительно отправлять заголовки вместе с сообщением.
Что я пытался сделать
Добавлять:

KafkaProducer(value_serializer=lambda v: json.dumps(v).encode('utf-8'))
Преобразовывать в самом send:

def _send_kafka(self, body):
    head={"a": "asdasdads", "b": "qweqwe" и тд}
    self.producer.send("topic", bytes(body), headers=json.dumps(head).encode('utf-8'))

Также пытался саму переменную head преобразовывать в разные форматы.
Но всегда ошибка:
in send assert type(headers) == list
AssertionError
Нагуглить готовый пример не получилось, поэтому прошу подсказать как с этим работать?

В таких случаях помогает только одно - изучать исходный код:

headers (optional): a list of header key value pairs. List items
are tuples of str key and bytes value.

Пример использования из их же unit тестов:
<code>
    # record headers are supported in 0.11.0
    if env_kafka_version() < (0, 11, 0):
        headers = None
    else:
        headers = [("Header Key", b"Header Value")]

    topic = random_string(5)
    future = producer.send(
        topic,
        value=b"Simple value", key=b"Simple key", headers=headers, timestamp_ms=9999999,
        partition=0)
</code>


Подскажите по маске для регулярного выражения python
Подскажите пожалуйста для python маску регулярного выражения для получения из конфига дескрипшена для xe-3/0/0 и unit 286. Нужно получить это - VPN: OOO (Palatki); R208726
Интерфейсов много, нужно именно из xe-3/0/0 получить.
Пример конфига коммутатора:
<code>
xe-3/0/0 {
    description "<< 10ge to SW1 port Te2/3; 12.08.2013 >>";
    hierarchical-scheduler;
    flexible-vlan-tagging;
    mtu 9100;
    hold-time up 1000 down 0;
    encapsulation flexible-ethernet-services;
    unit 234 {
        description "## VPN: v1193; via sw1:11/22; 24.10.13 ##";
        bandwidth 2m;
        vlan-id 234;
        family inet {
            filter {
                input profile-id3;
            }
            policer {
                input lim2m;
            }
            address 10.218.0.5/30;
        }
    }
    unit 286 {
        description "## VPN: OOO (Palatki); R208726 ##";
        vlan-id 286;
        family inet {
            mtu 1500;
            filter {
                input profile-id5;
            }
            policer {
                input lim10m;
            }
            address 10.27.2.2/30;
        }
    }
</code>

Ну вот что-то такое попробуйте
<code>
text = """
xe-3/0/0 {
    description "<< 10ge to SW1 port Te2/3; 12.08.2013 >>";
    hierarchical-scheduler;
    flexible-vlan-tagging;
    mtu 9100;
    hold-time up 1000 down 0;
    encapsulation flexible-ethernet-services;
    unit 234 {
        description "## VPN: v1193; via sw1:11/22; 24.10.13 ##";
        bandwidth 2m;
        vlan-id 234;
        family inet {
            filter {
                input profile-id3;
            }
            policer {
                input lim2m;
            }
            address 10.218.0.5/30;
        }
    }
    unit 286 {
        description "## VPN: OOO (Palatki); R208726 ##";
        vlan-id 286;
        family inet {
            mtu 1500;
            filter {
                input profile-id5;
            }
            policer {
                input lim10m;
            }
            address 10.27.2.2/30;
        }
    }

xe-4/0/0 {
    description "<< 10ge to SW1 port Te2/3; 12.08.2013 >>";
    hierarchical-scheduler;
    flexible-vlan-tagging;
    mtu 9100;
    hold-time up 1000 down 0;
    encapsulation flexible-ethernet-services;
    unit 234 {
        description "## VPN: v1193; via sw1:11/22; 24.10.13 ##";
        bandwidth 2m;
        vlan-id 234;
        family inet {
            filter {
                input profile-id3;
            }
            policer {
                input lim2m;
            }
            address 10.218.0.5/30;
        }
    }
    unit 286 {
        description "## VPN: OOO (Palatki); R208726 ##";
        vlan-id 286;
        family inet {
            mtu 1500;
            filter {
                input profile-id5;
            }
            policer {
                input lim10m;
            }
            address 10.27.2.2/30;
        }
    }
xe-3/0/0 {
    description "<< 10ge to SW1 port Te2/3; 12.08.2013 >>";
    hierarchical-scheduler;
    flexible-vlan-tagging;
    mtu 9100;
    hold-time up 1000 down 0;
    encapsulation flexible-ethernet-services;
    unit 234 {
        description "## VPN: v1193; via sw1:11/22; 24.10.13 ##";
        bandwidth 2m;
        vlan-id 234;
        family inet {
            filter {
                input profile-id3;
            }
            policer {
                input lim2m;
            }
            address 10.218.0.5/30;
        }
    }
    unit 286 {
        description "## VPN: OOO (Mullatki); R208788 ##";
        vlan-id 286;
        family inet {
            mtu 1500;
            filter {
                input profile-id5;
            }
            policer {
                input lim10m;
            }
            address 10.27.2.2/30;
        }
    }
"""

import re

print(
    re.findall(
        r'xe-3/0/0 .*?unit 286.*?\".+?(\w.+?) ##\"', text, flags=re.S
    )
)
# ['VPN: OOO (Palatki); R208726', 'VPN: OOO (Mullatki); R208788']
</code>


В каких строчках кода есть ошибки? (11 строк) [закрыт]

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

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

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

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

Я новичок в Питоне, прохожу тестирование, споткнулся на этом вопросе. В коде ниже допущены ошибки. Нужно найти где.
<code>
def make_list(number):
    names = []
    for item in number:
        names.append(input("Введите имя с заглавной буквы"))
    print(names)

number = int(input("Сколько имен надо ввести?"))
names = make_list(number)
for name in names:
    if name[1] == "А":
        print("Имя", name, "начинается с буквы А")
</code>
Прогонял чрез онлайн компиляторы, выдавало ошибку в 3 и 7 строках, но это Не верный ответ (так ругается тест)
Задача:
Программа запрашивает у пользователя сначала количество имён, потом - имена, и формирует из них список.
Из этих имён на экран выводятся только те, которые начинаются с заглавной буквы "А".

! - Ошибка

* - Коментарий

def make_list(number):
    # * names определено и здесь и на уровне модуля
    #    не ошибка но лучше так не делать, чтобы не путаться
    names = []
    # * Использование именованной переменной `item` без ее дальнейшего использования
    #     Обычно в таких случаях используется `_`
    # ! Переменная number имеет тип int (no Iterable)
    #   поэтому для создания цикла здесь должно быть `range(number)`
    for item in number:
        names.append(input("Введите имя с заглавной буквы"))
    print(names)
    # ! Функция не возвращает names поэтому names на уровне модуля будет всегда None

number = int(input("Сколько имен надо ввести?"))
names = make_list(number)

# ! Поскольку names всегда None а None not Iterable
#    то попытка итерировать по этой переменной вызовет исключение
for name in names:
    # ! Первая буква name будет иметь индекс 0 а не 1
    if name[1] == "А":
        print("Имя", name, "начинается с буквы А")

Вот так должно работать

def make_list(number):
    names = []
    for _ in range(number):
        names.append(input("Введите имя с заглавной буквы"))
    return names

qty = int(input("Сколько имен надо ввести?"))
name_list = make_list(qty)
for name in name_list:
    if name[0] == "А":
        print("Имя", name, "начинается с буквы А")

" Фантазия на тему..."

for name in [
    input("Введите имя с заглавной буквы: ")
    for _ in range(int(input("Сколько имен надо ввести? ")))
]:
    if name.startswith('А'):
        print("Имя", name, "начинается с буквы А")


Бот на aiogram не видит ответ на чужое сообщение
у меня вопрос\проблема,
у меня есть бот с командой 'обнять'
Но когда я использую эту команду на ком-то в чате, он ее не видит и игнорирует,  работает только в том случае, если отвечают на сообщение самого бота.
Помогите, что делать? Вот код:
<code>
import logging

from aiogram import Bot, Dispatcher, executor, types

API_TOKEN = 'токен'

# Configure logging
logging.basicConfig(level=logging.INFO)

# Initialize bot and dispatcher
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

@dp.message_handler(commands=['help'])
async def send_welcome(message: types.Message):
  await message.reply("Привет!\nЯ тестовый бот!\nМеня создали для обнимашек!")

@dp.message_handler(commands=['обнять'], commands_prefix='!?./')
async def hug(message):
  await message.reply(f'@{message.from_user.username} обнял @{message.reply_to_message.from_user.username}')

if __name__ == '__main__':
  executor.start_polling(dp, skip_updates=True)
</code>

@dp.message_handler(commands=['обнять'], commands_prefix='!?./')
async def hug(message: types.Message):
  await message.reply(f'@{message.from_user.username} обнял @{message.from_user.username}')

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

async def hug(message):

Не указав тип параметра с которым в последствии хотели работать:

async def hug(message: types.Message):

После вы использовали
reply_to_message собственно для того что бы бот "обнимал" только после того как вы ответите на сообщение бота(логично вроде)

await message.reply(f'@{message.from_user.username} обнял @{message.reply_to_message.from_user.username}')

Работать конечно же это не будет так как вы хотите, решение:

await message.reply(f'@{message.from_user.username} обнял @{message.from_user.username}')

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


Получение файла из командной строки python
Подскажите, пожалуйста, нужно передать файл в python скрипт из командной строки:
<code>
python script.py filename.xlsx
</code>
Как получить путь к файлу в script.py  для последующей обработки в pandas?

sys.argv позволяет использовать параметры в строго определенном порядке, что не всегда очень удобно если нужно передавать больше одного параметра.
Существует встроенный модуль argparse для парсинга аргументов командной строки, который намного мощнее и гибче
sys.argv.
Вот небольшой пример -
test1.py:

import argparse

parser = argparse.ArgumentParser(description='Test [argparse] module')
parser.add_argument('--string-parameter', '-s', dest='str_param',
                    help='a string parameter')
parser.add_argument('--float-parameter', '-f', type=float,
                    help='a float parameter')
parser.add_argument('--integers', '-lst', type=int, nargs='+',
                    help='a list of integers')

args = parser.parse_args()
print(f"args.str_param: {args.str_param}")
print(f"args.float_parameter: {args.float_parameter}")
print(f"args.integers: {args.integers}, sum: {sum(args.integers)}")

Примеры запуска:

python test1.py -h

usage: test1.py [-h] [--string-parameter STR_PARAM] [--float-parameter FLOAT_PARAMETER] [--integers INTEGERS [INTEGERS ...]]

Test [argparse] module

optional arguments:
  -h, --help            show this help message and exit
  --string-parameter STR_PARAM, -s STR_PARAM
                        a string parameter
  --float-parameter FLOAT_PARAMETER, -f FLOAT_PARAMETER
                        a float parameter
  --integers INTEGERS [INTEGERS ...], -lst INTEGERS [INTEGERS ...]
                        a list of integers

python test1.py -s "a short sentence" --float-parameter 3.1415 -lst 10
20 30

args.str_param: a short sentence
args.float_parameter: 3.1415
args.integers: [10, 20, 30], sum: 60


Как доработать код?
Определите максимальное количество идущих подряд символов, среди которых нет сочетания стоящих рядом букв P и R(в любом порядке)
<code>
f=open("24-157.txt")
#s=f.readline()
s='TROPERGOERPPRDGGDF'
s=s.replace("PR","1")
s=s.replace("RP","1")
max_=cnt=0
for i in range(len(s)):
    if s[i]!='1':
        cnt+=1
        max_=max(max_,cnt)
    else:
        cnt=0
print(max_)
</code>
на примере все работает, а с файлом выдает неправильный ответ
ссылка на файл

Как ваш код обработает строку
'PRAPR'? Первый
replace превратит её в
'1A1', второй оставит строку неизменной. Затем вы отыщете самую длинную последовательность символов без единиц. Ответом будет единица.
Правильный ответ в этом примере - тройка (
'RAP'). Алгоритмическая ошибка.
Бежим по строке, поддерживаем самую большую длину строки без
PR и
RP которая завершается в текущей позиции (
max_length_ending_here). Если последняя пара "хорошая", увеличиваем длину на единицу,  иначе сбрасываем в единицу:

def max_lengths(s):
    max_length_ending_here = 0
    last_char = ''
    yield max_length_ending_here
    for c in s:
        if (c == 'P' and last_char == 'R') or (c == 'R' and last_char == 'P'):
            max_length_ending_here = 1
        else:
            max_length_ending_here += 1
        last_char = c
        yield max_length_ending_here

with open('24-157.txt') as f:
    s = f.readline()
print(max(max_lengths(s)))

$ python max-length-no-pr-rp.py
2940

Решение без циклов. Найдём все сочетания
RP,
PR и вставим между ними пробелы. Разобьём строку на слова, выберем самое длинное слово:

with open('24-157.txt') as f:
    s = f.readline()
print(max(
    map(len, s.replace('RP', 'R P').replace('PR', 'P R').split()),
    default=0
))

P.S. Это новый вариант ответа, который существенно исправлен.


Sqlite3.InterfaceError: Error binding parameter 0 — probably unsupported type как исправить? [дубликат]

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

Как правильно подставлять значения из переменных / списков / словарей в SQL запрос?

                                (1 ответ)

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

Подскажите,как исправить, эту ошибку?

in start
    cursor.execute("INSERT INTO usermember(user_id,username) VALUES(?,?)", (user_id,username))
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.

Ругается на эту строку

cursor.execute("INSERT INTO usermember(user_id,username) VALUES(?,?)", (user_id,username))

Нужно чтобы в файл users.db записывался id пользователя и ник, который человек создал, для телеграм,
но поля пустые, подскажите как это исправить, писал код с видео, но там только одно поле прописывалось user_id.
Вот весь код

import sqlite3
from sqlite3 import connect
import cursor as cursor
import telebot

API_TOKEN = 'moy_token'

bot = telebot.TeleBot(API_TOKEN)

@bot.message_handler(commands=['start'])
def start(message):
    connect = sqlite3.connect('users.db')
    cursor = connect.cursor()

    cursor.execute("""CREATE TABLE IF NOT EXISTS usermember (
    user_id INTEGER,
    username TEXT
    )""")

    connect.commit()

    user_id = ["message.from_user.id"]
    username = ["message.chat.username"]
    print(type(user_id))
    cursor.execute("INSERT INTO usermember(user_id,username) VALUES(?,?)", (user_id,username))
    connect.commit()

bot.infinity_polling()

Все варианты, что я делал, чтобы определить user_id и username чтобы верно они прописались в бд.

#user_id = ["message.user.id"]
#user_id = ["message.chat.user.id"]
user_id = ["message.from_user.id"]
username = ["message.from_user.username"]
username = ["message.chat.username"]
#username = ["message.chat.username"]
#username = ["message.chat.user_username"]
#username = ["message.user_username"]
#username = ["message.user.username"]
#username = ["message.from_user.username"]
#username = ["message.chat.username"]

это все варианты, что я делал, так как, думал что может я неверно прописал, user_id и username и возможно поэтому ошибка, хотя ругается на другую строку, но они же, взаимосвязаны между собой.

user_id = ["message.from_user.id"]
username = ["message.chat.username"]

user_id = message.from_user.id
username = message.chat.username


Как подсчитать уровни поддержки\сопротивления на свечном графике программно
Хочу высчитывать уровни поддержки\сопротивления на C# для свечного графика, но так и не нашел готового решения на C# (если они есть, просьба поделиться), а пока пытаюсь переделать код из питона на C#.
Вот статься с которой брал информацию:
Статья
Код из статьи на GitHub
Первую часть я реализовал

using CalculateSupportsAndResistances;
using Signals.DataAccess;

var dbConnection = File.ReadAllText(@"E:\INFO\sqlLocalDbConnection.txt");

var cancellationTokenSource = new CancellationTokenSource();
var cancellationToken = cancellationTokenSource.Token;

using var db = await new DbAdapterConnection(dbConnection).OpenAsync(cancellationToken);

var myCandles = await db.ExecuteReaderAsync<MyCandle>(
    cancellationToken
    , @"
SELECT
    [Id]
    ,[CandleVolume] as [Volume]
    ,[CandleOpen] as [Open]
    ,[CandleHigh] as [High]
    ,[CandleLow] as [Low]
    ,[CandleClose] as [Close]
    ,[CandleDateTime] as [Date]
FROM [Test].[CandleData]
order by CandleDateTime desc
");

var myCandlesArray = myCandles.ToArray();

var linePoints = new List<LinePoint>();

for (var i = 2; i < myCandlesArray.Length - 2; i++)
{
    var item = myCandlesArray[i];

    if (IsSupport(myCandlesArray, i))
    {
        linePoints.Add(new LinePoint(
            item.Id
            , item.Date
            , item.Low
            , 2)
        );
    }
    else if (IsResistance(myCandlesArray, i))
    {
        linePoints.Add(new LinePoint(
            item.Id
            , item.Date
            , item.High
            , 1)
        );
    }
}

foreach (var linePoint in linePoints)
{
    Console.WriteLine(linePoint.Point);
}

Console.ReadKey();

static bool IsSupport(IReadOnlyList<MyCandle> myCandlesArray, int i)
{
    var result = myCandlesArray[i].Low < myCandlesArray[i - 1].Low
                 && myCandlesArray[i].Low < myCandlesArray[i + 1].Low
                 && myCandlesArray[i + 1].Low < myCandlesArray[i + 2].Low
                 && myCandlesArray[i - 1].Low < myCandlesArray[i - 2].Low;

    return result;
}

static bool IsResistance(IReadOnlyList<MyCandle> myCandlesArray, int i)
{
    var result = myCandlesArray[i].High > myCandlesArray[i - 1].High
                 && myCandlesArray[i].High > myCandlesArray[i + 1].High
                 && myCandlesArray[i+1].High > myCandlesArray[i + 2].High
                 && myCandlesArray[i-1].High > myCandlesArray[i - 2].High;

    return result;
}

А с второй проблемы (часть где убираем шумы).
На сколько я понял

s =  np.mean(df['High'] - df['Low'])

это среднее значение суммы всех элементов High-Low (если ошибся поправьте).
Т.е. что-то типа этого

decimal arraySumm = 0;

for (var i = 0; i < myCandlesArray.Length; i++)
{
    var currentCandle = myCandlesArray[i];
    var middle = currentCandle.High - currentCandle.Low;
    arraySumm += middle;
}

var s = arraySumm / myCandlesArray.Length;

А вот эту функцию так и не смог понять

def isFarFromLevel(l):
  return np.sum([abs(l-x) < s  for x in levels]) == 0

Помогите пожалуйста ее переделать в C#

def isFarFromLevel(l):
  return np.sum([abs(l-x) < s  for x in levels]) == 0
                 ^^^^^^^^^^^^ = 1 если True, = 0 если False

Тут используется один из трюков питона, состоящий в том, что булевы значения можно использовать в числовой арифметике. Фактически здесь проверяется, что в массиве
levels нет ни одного такого значения
x, что выполняется неравенство
abs(l-x) < s. Т.е. в
levels все значения лежат от
l дальше, чем величина
s. Собственно, название функции в переводе про это и говорит - "находятся далеко от уровня".
Можно и наоборот записать: для всех
x из массива
levels должно выполняться неравенство
abs(l-x) >= s. Теперь я думаю вы сможете записать это на
C#: просто делаете перебор элементов массива и проверяете условие, если условие не выполняется, то сразу делаете
return false, а в конце функции делаете
return true, если прошли весь цикл и условие ни разу не нарушилось.
И про
s = np.mean(df['High'] - df['Low']) вы правильно догадались,
mean - это "среднее арифметическое".


Как с помощью aiogram сделать команду 'Обнять'
У меня просьба, мне нужно сделать команду "обнять".
Но я не могу понять как это сделать, не могли бы вы помочь?
Как должна работать команда:
Ответ на сообщение -> Бот пишет текст (юзер человека который написал команду) Обнял (Юзер человека на чье сообщение ответили).
Заранее спасибо! Перерыл весь интернет, но не нашел ничего.

Вот так:
<code>
@dp.message_handler(text='обнять')
    async def send_hugg(message: types.Message):
      if message.reply_to_message:
        await message.answer(f' 🤗 | @{message.from_user.username} обнял(-а) @{message.reply_to_message.from_user.username}')
      else:
        pass
</code>


Как поставить текст на передний план Turtle
Нужно, чтобы текст находился поверх остальной анимации, вот сам код. Как это реализовать и есть ли вообще такая возможность в модуле туртл?
<code>
import turtle
import math

def xt(t):
    return 16 * math.sin(t) ** 3
def yt(t):
    return 13 * math.cos(t) - 5 \
           * math.cos(2 * t) - 2 * \
           math.cos(3 * t) - math.cos(4 * t)
t = turtle.Turtle()
turtle.color("pink")
turtle.write("сш я тя лю", True, align="center",font = ( "Verdana", 16, "normal" ))
turtle.colormode(255)
turtle.Screen().bgcolor(0, 0, 0)
t.speed(500)
for i in range(2550):
    t.goto((xt(i) * 20, yt(i) * 20))
    t.pencolor((255 - i) % 255, i % 255, (255 + i) // 2 % 255)
    t.goto(0, 0)

t.hideturtle()
turtle.update()
turtle.mainloop()
turtle.done()
</code>

Так как черепашка - это, по-сути, карандаш, то вариант один: каждый раз в цикле писать текст заново.
<code>
import turtle
import math

def xt(t):
    return 16 * math.sin(t) ** 3
def yt(t):
    return 13 * math.cos(t)     - \
            5 * math.cos(2 * t) - \
            2 * math.cos(3 * t) - \
                math.cos(4 * t)

turtle.color("pink")
turtle.colormode(255)
turtle.Screen().bgcolor(0, 0, 0)
turtle.hideturtle()
turtle.Screen().tracer(2) # чтобы рисовало побыстрее

t = turtle.Turtle()
t.hideturtle()
t.speed(500)
for i in range(2550):
    t.goto((xt(i) * 20, yt(i) * 20))
    t.pencolor((255 - i) % 255, i % 255, (255 + i) // 2 % 255)
    t.home()
    turtle.write("сш я тя лю", False, align="center",font = ( "Verdana", 16, "normal" ))

turtle.update()
turtle.mainloop()
turtle.done()
</code>


Не получается создать отдельный метод для soap запроса и вызвать его в тесте
Пытаюсь вынести отдельно soap команды  чтобы создать общий набор команд (с использованием библиотек suds) которые я могу вызвать и при необходимости передать параметры для запроса в тесте через pytest

from test_NBI.DATA_nbi import *
from suds.client import Client
from suds.wsse import *

class NbiCommands():
    def __init__(self):
        pass

    def wsse(self):
        self.client = Client(WSDL_NBI)
        self.security = Security()
        self.token = UsernameToken(LOGIN, PASSWORD)
        self.security.tokens.append(self.token)
        self.client.set_options(wsse=self.security)
        return self.client

    def soap_request(self, method, **params):
        response = self.client[method](**params)
        return response

    def GetVetsion():
        r = NbiCommands.soap_request("GetVetsion")

def test_1():
    response = NbiCommands.GetVetsion()
    print(response)

и получаю следующую ошибку

    def GetVetsion():
>       r = NbiCommands.soap_request("GetVetsion")
E       TypeError: NbiCommands.soap_request() missing 1 required positional argument: 'method'

Если из функции GetVetsion убрать "GetVetsion" я получу ошибку о том что пропущено 2 аргумента, self и method
я ожидаю что тест будет выглядеть примерно следующим образом

def test_1():
    response = NbiCommands.soap_request("GetVetsion", **params)
    print(response)

Я буду признателен любой помощи, т.к. я уже испробовал разные варианты которые я знаю и умею, спасибо!

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

nbi = NbiCommands()
response = nbi.soap_request("GetVersion", param1='val1', param2='val2')

Только, чтоб работало именно так, сначала нужно сделать, чтоб
self.client проинициализировался, можно это сделать в конструкторе:

    def __init__(self):
        self.wsse()

Ну или явно вызывать (что менее удобно):

nbi = NbiCommands()
nbi.wsse()
response = nbi.soap_request("GetVersion", param1='val1', param2='val2')

А уж если это
pytest, то удобнее всего сделать эту зависимость теста с помощью fixture:

import pytest

@pytest.fixture
def nbi():
  return NbiCommands()

def test_1(nbi):
    response = nbi.GetVersion(param1='val1', param2='val2')
    print(response)

pytest сам создаст фикстуру перед вызовом тестового метода.
Определение
NbiCommands как и фикстуры в таком случае имеет смысл положить в файл
conftest.py. фикстуры из него подтягиваются автоматически.


Содержит ли словарь хотя бы одно слово из строки/списка
Есть строка или список:
'i like girls'   или
 ['i', 'like', 'girls']
И словарь со словами
{'i': None, 'like': None, 'birds': None}
Есть ли быстрый способ проверить, есть ли хотя бы одно слово из строки/списка в этом словаре? В идеале за О(1)

Можно решить вот так.
<code>
my_list = ['i', 'like', 'girls']
my_dir = {'i': None, 'like': None, 'birds': None}

s1 = set(my_list)  # Множество различных слов в списке
s2 = set(my_dir.keys())  # Берем множество ключей словаря
if len(s1 & s1) > 0:  # Если размер пересечения больше 0 - то такое слово есть
    print('есть такое слово')
else:
    print('нет такого слова')
</code>


Как из списка словарей извлечь один из словарей
К примеру у нас есть список состоящий из трех словарей:

[
  {'one':1,'two':2},
  {'home':'Дом','Cat':'Кошка'},
  {'red':'красный','green':'Зеленый'}
]

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

<code>
list_dicts =  [{'one':1,'two':2},{'home':'Дом','Cat':'Кошка'},{'red':'красный','green':'Зеленый'}]
first_dict = list_dicts[0]
</code>
В чем проблема-то?


Нужно написать программу присваивания переменных к задаче в Python [закрыт]

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

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

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

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

Суть задачи - Две переменные типа A и B. Если их значения не равны, то присвоить каждой переменной большее из этих значений, а если равны, то присвоить переменным нулевые значения. Вывести новые значения переменных A и B..
Заранее спасибо вам за ответ!

Это наилегчайшая задача, но без лишних слов, вот код:
<code>
a, b = int(input()), int(input())

if a != b:
    c = max(a, b)
    a, b = c, c
else:
   a, b = 0, 0

print(a, b)
</code>


Как обратиться к элементу кортежа, который является значением словаря Python?
Есть словарь видов тренировки, его ключами являются коды видов тренировок, его значениями - кортеж из класса тренировки и числа полей (для каждого класса оно своё).
Задача: при несоответствии числа полей "на входе" заданному в классе выдавать предупреждение. Для этого необходимо сравнить число полей "на входе" с числом полей, заданным в каждом классе, то есть, получается, что нужно обратиться ко второму элементу кортежа, который является значением словаря.
<code>
WORKOUT_TYPES = {'SWM': (Swimming, len(dataclasses.fields(Swimming))),
                 'RUN': (Running, len(dataclasses.fields(Running))),
                 'WLK': (SportsWalking, len(dataclasses.fields(SportsWalking)))}

def read_package(workout_type: str, data: dict) -> Training:
    if workout_type not in WORKOUT_TYPES:
        raise ValueError(REPORT_TRAINING_ERROR.format(workout_type))
    if len(data) != WORKOUT_TYPES[workout_type]:
        raise ValueError(REPORT_DATA_ERROR.format(workout_type,
                         len(data), WORKOUT_TYPES[workout_type]))
    return  WORKOUT_TYPES[workout_type](*data)
</code>
Заранее всех благодарю!

Чтобы обратится к элементу кортежа, нужно указать в квадратных скобках его индекс.
То есть если у вас сам кортеж
WORKOUT_TYPES[workout_type], то к его второму элементу можно обратится так:
WORKOUT_TYPES[workout_type][1]
Впрочем, когда в коде идёт такое обращение по чиселкам, то становится сложно читать и понимать этот код. Можно заменить простой кортеж на именованный и тогда к его полям можно будет обращаться по понятным именам. Например так:

from collections import namedtuple

WtMeta = namedtuple('WtMeta', 'cls, fields_num')

WORKOUT_TYPES = {
    'SWM': WtMeta(
               Swimming, len(dataclasses.fields(Swimming))
           ),
    'RUN': WtMeta(
               Running, len(dataclasses.fields(Running))
           ),
    'WLK': WtMeta(
               SportsWalking, len(dataclasses.fields(SportsWalking))
           ),
}

print( WORKOUT_TYPES['RUN'].fields_num )    # Вот так вот

Впрочем, в данном случае вообще не понятно, зачем вам отдельно хранить количество полей рядом с классом, если вы просто в любом месте можете взять класс и дёрнуть для него
len(dataclasses.fields(...)). Так вам не нужно будет хранить кортеж, достаточно будет только хранить один класс, и код станет проще.