Как сделать цикл склейки имени и числа?
Есть два списка
prod_name = [ ] и
price = [ ]. В первый летит такое:

(item['title'],domen+item['href'])

В список прилетает такое значение:
Объявление «Playstation 4 Pro 1Tb (магазин, гарантия)» 3 фотографии,

ссылка, а во вторую летит ценник - допустим, 1000. Хочу сделать цикл склейки
prod_name и
price по индексу, то есть, примерно так:

print(prod_name[conut]+price[count])

, где
count - переменная со значением 0 по стандарту, но в последствии count увеличивается на 1 путём
count =+ 1.

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

lst_tovar = []
lst_img = ['foto1.jpg', 'foto2.jpg']
data_tovar = {
   'price': 100,
    'name': 'Playstation 4 Pro 1Tb (магазин, гарантия)',
    'lst_img': lst_img,
}
lst_tovar.append(data_tovar)

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

class Tovar():
    def __init__(self, price, name, lst_img_name):
        self.price = price
        self.name = name
        self.lst_img_name = lst_img_name
    def print_tovar_cena(self):
        print(f'Товар{self.name} \n Цена:{self.price}')

lst_objTovar = []
lst_img = ['foto1.jpg', 'foto2.jpg']
lst_objTovar.append(Tovar(price=100,
                      name='Playstation 4 Pro 1Tb (магазин, гарантия)',
                      lst_img_name=lst_img))

for tovar in lst_objTovar:
    tovar.print_tovar_cena()

А если хотите чтоб ID Вашего товара был:

for id, tovar in enumerate(lst_objTovar):
    print('id:', id)
    tovar.print_tovar_cena()


'dict' object has no attribute 'isdigit'
Есть такой вот скрипт

import json
import re

while True:
    print("1. Добавить новую запись")
    print("2. Поиск по записям")
    print("0. выйти из программы")
    cmd = input("Выберите пункт: ")

if cmd == "1":
  print ("Ввод данных")

  data = ''

  while (not data.isdigit()):
      data = {"ID": input('Введите ID: ')}
      print()
      if (not data.isdigit()):
          print('ID необходимо указать цифрами!')
      else:
          print("")

  data = int(data)

  print ("Введите ФИО")

  data["Name"] = input()

  print ("Введите email")

  data["Email"] = input()

  print ("Введите номер телефона")

  data["Phone"] = input()

  with open("users.json", "a+") as file:
           file.write('\n')
           json.dump(data, file,ensure_ascii=False )

elif cmd == "2":
       print ("Введите данные для поиска")
       w = input()
       with open("Users.json") as fin:
           for s in fin.readlines():
              if s.find(w) > -1:
                print(s.strip())

elif cmd == "0":
                break

Скрипт смотрит есть ли файл в директории, если нет создает, если есть дописывает. Так же поиск по уже имеющимся данным. Не получается сделать, что бы в поле ввода ID был ограничен ввод только числовыми значениями. При этом если вводится не число, выдается предупреждение и возвращаемся к вводу ID заново

if cmd == "1":

print ("Ввод данных")

  data = ''

  while (not data.isdigit()):
      data = {"ID": input('Введите ID: ')}
      print()
      if (not data.isdigit()):
          print('ID необходимо указать цифрами!')
      else:
          print("")

  data = int(data)

Вот на это участке вываливается ошибка

    Traceback (most recent call last):
  File "C:\Users\nkovalev\Desktop\Read-WriteReady.v0.3.1.py", line 24, in <module>
    if (not data.isdigit()):
AttributeError: 'dict' object has no attribute 'isdigit'

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

  data = '' # <-- СТРОКА!

  while (not data.isdigit()):
      data = {"ID": input('Введите ID: ')} # <-- СЛОВАРЬ!!!

Просто не нужно разные переменные называть одинаковыми именами. У вас переменная
data - это и строка, которую вы проверяете на
isdigit, и словарь, содержащий ключ
ID. Разделите эти сущности на две отдельные переменные - и не будет никаких проблем.
Ну, либо можете сразу сделать словарь и проверять его поле:

  data = {"ID": ''}

  while (not data["ID"].isdigit()):
      data = {"ID": input('Введите ID: ')}


Разница между List[Optional[str]] и Iterable[str]
Установил
mypy и при анализе строчки кода
",".join(ids[:50])

ids: List[Optional[str]] = ["text","test"]
error: Argument 1 to "join" of "str" has incompatible type "List[Optional[str]]"; expected "Iterable[str]"

Почему это ошибка? Разве список не итерируемый объект? Какая разница между списком и
Iterable и в каких случаях что выбирать?

Проблема не в
List/
Iterable, а в
Optional.
List[Optional[str]] подразумевает то, что список может содержать строки или
None, но
join не умеет соединять значения
None, требуемый тип принимаемого значения у него -
Iterable[str], т.е. итерируемый объект из строк (строго из строк, никаких
None). Если убрать
Optional, то ошибка исчезнет.
Пример кода:

from typing import List

ids: List[str] = ["text","test"]
print(", ".join(ids))

Вывод mypy:

Success: no issues found in 1 source file

mypy на
Optional ругается не просто так: ваша аннотация предполагает, что возможен список такого вида
["text", None], при применении
join к которому вылетит ошибка
TypeError: sequence item 1: expected str instance, NoneType found.


python перевод массы в кратные и дольные единицы
нужно написать программу перевода введенной массы в граммы, килограммы, тонны. Приставки, которые будет использовать программа: g – граммы, kg – килограммы, t – тонны.
Пример ввода:

12kg

Вывод:

12000g
0.012t

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

a = input()

if "kg" in a:
print(a/1000 + "t")
print(a*1000 + "g")

elif "g" in a:
print(a/1000 + "kg")
print(a/00000 + "t")

elif "t" in a:
print(a*1000 + "kg")
print(a/1000000 + "g")

По умолчанию
input() возвращает строковый тип
str.
Поэтому, даже если вы введете число, вы все равно не сможете проводить с ним математические операции, так как переменная будет являться текстом.

Допустим, мы вводим
12
Переменная
a будет иметь тип
str и содержать значение
'12'
Чтобы привести его к числовому типу
int достаточно применить к
input() встроенную функцию
int()

a = int(input())

Теперь
a имеет тип
int и значение
12

Однако вы вводите также единицы измерения, так что строку
'12kg', содержащую буквы привести к числу не получится.
Для отделения
'kg' можно воспользоваться стандартным методом
replace(), который первым аргументом принимает строку, которую нужно заменить, а вторым - строку, на которую нужно заменить.

'12kg'.replace('kg', '')

Даная строка примет значение
'12', которое уже можно привести к числу и выполнять операции.

Решение:

a = input()

value = int(a.replace('kg', '').replace('g', '').replace('t', ''))

if "kg" in a:
    print(str(value / 1000) + "t")
    print(str(value * 1000) + "g")

elif "g" in a:
    print(str(value / 1000) + "kg")
    print(str(value / 100000) + "t")

elif "t" in a:
    print(str(value * 1000) + "kg")
    print(str(value / 1000000) + "g")


Переливающийся текст. Tkinter
Я хочу, чтобы текст объекта
Label() постепенно менял цвет с синего на зелёный и потом обратно. Желательно чтобы смена цвета в одну сторону занимала примерно 5 секунд. Возможно ли это реализовать, и если да то как?

Как вариант.
<code>
import tkinter as tk

def change_color(step=0):
    g = abs((step*8) % 512 - 255)
    b = 255 - g
    lbl.configure(fg=f"#00{g:0>2x}{b:0>2x}")
    root.after(5000 * 8 // 256, lambda: change_color(step+1))

root = tk.Tk()
lbl = tk.Label(root, text="Переливающийся текст", font="-size 20")
lbl.pack(fill=tk.BOTH)
root.after(1, change_color)
root.mainloop()
</code>


Как найти число + фразу, используя регулярные выражения?
Необходимо вывести число, после которого следует фраза million или billion, используя регулярные выражения.
Почему такой синтаксис не даёт положительный результат?

text = '199.5 million, 100 million, 80 billion, 1.89 billion, 123 qwerty'
match = re.findall("[0-9]*\.?[0-9]+ \bmillion\b|\bbillion\b", text)
print(match)

должен вывести:

[199.5 million, 100 million, 80 billion, 1.89 billion]

import re
text = '199.5 million, 100 million, 80 billion, 1.89 billion, 123 qwerty'
match = re.findall(r"[\d.]+?\s*?[bm]illion", text)
print(match)
#['199.5 million', '100 million', '80 billion', '1.89 billion']


Ошибка в селект меню discord.py
Вот я сделал пару импортов

import discord
import json
import requests
import sqlite3
from discord.utils import get
from discord.ext import commands
from discord_components import DiscordComponents, Button, ButtonStyle, component, ComponentsBot, Select, SelectOption
from discord_components import *

После этого я добавил эти строки:

@bot.event
async def on_ready():
  DiscordComponents(bot)
  print('BOT CONECTED')

Дале сделал команду хелпа и приделал к этой команде селект меню, кто не знает что это, лучше загуглите, так вот сам код:

#Основная команда ХЕЛП
@bot.command()
async def help(ctx, comname: str = None):
  embed = discord.Embed(
        color = 0xff9900,
        title="Команды **LiteBot**",
        description="Для более детальной информации о команде, просто напишите >help (команда)\n**<:clipboard:920714709932593182> Основное**\n`>help` - все команды бота\n`>info` - информация о боте\n`>addbot` - добавить бота\n**<:shield:920714733278077010> Модерация**\n`>clear` - очистка сообщений\n`>mute` - заглушить пользователя\n`>unmute` - размутить пользователя\n`>kick` - выгнать пользователя\n`>ban` - забанить пользователя\n`>niсk` - сменить ник пользователю\n**<:wrench:920715659481075734> Утилиты**\n`>avatar` - просмотр аватара\n`>say` - писать от имени бота\n`>embsay` - писать вебхуком\n**<:smile:920714719873105951> Развлечения**\n`>fox` - рандомные фото лисичек\n`>dog` - рандомные фото собачек\n`>cat` - рандомные фото кошек\n**<:gear:920714911049478204> Настройки**\n`>automode` - вкл/выкл автомодерацию на мат",
        )
  embed.set_thumbnail(url = bot.user.avatar_url)
  embed.set_footer(text = 'halflite © 2021 Все права защищены')
  embinf = discord.Embed(title='`Информация о команде >info`', description='**Описание:**\nИнформация о данном боте', color=0xff9900)
  embinf.set_thumbnail(url = bot.user.avatar_url)
  if comname is None:
    await ctx.reply(embed=embed)
  else:
      if comname == 'info':
        await ctx.reply(embed=embinf)
      elif comname == 'addbot':
          embbod = discord.Embed(
          title='`Информация о команде >addbot`',
          description='**Описание:**\nКоманда для добавления бота на свой сервер',
          color=0xff9900
          )
          await ctx.reply(embed=embbod)
      elif comname == 'clear':
            embcle = discord.Embed(
            title='`Информация о команде >clear`',
            description='**Описание:**\nКоманда для очистки сообщений в чате\n**Использование:**\n>clear (кол-во сообщений)',
            color=0xff9900
            )
            embcle.set_footer(text='() - обязательный аргумент')
            await ctx.reply(embed=embcle)

      elif comname == 'mute':
           embmut = discord.Embed(
           title='`Информация о команде >mute`',
           description='**Описание:**\nКоманда чтобы заглушить участника\n**Использование:**\n>mute (@участник) <причина>',
           color=0xff9900
           )
           embmut.set_footer(text='() - обязательно, <> - необязательно')
           await ctx.reply(embed=embmut)

      elif comname == 'unmute':
           embenm = discord.Embed(
           title='`Информация о команде >unmute`',
           description='**Описание:**\nКомнда чтобы снять ограничение чата с участника\n**Использование:**\n>unmute (@участник)',
           color=0xff9900
           )
           embenm.set_footer(text='() - обязательно')
           await ctx.reply(embed=embenm)

      elif comname == 'kick':
           embkik = discord.Embed(
           title='`Информация о команде >kick`',
           description='**Описание:**\nИзгнание пользователя с сервера\n**Использование:**\n>kick (@участник) <причина>'
           )
           emkik.set_footer(text='() - обязательно, <> - необязательно')
           await ctx.reply(embed=embkik)

      elif comname == 'ban':
          embban = discord.Embed(
          title='`Информация о команде >ban`',
          description='**Описание:**\nКоманда для блокировки пользователя\n**Использование:**\n>ban (@участник) <причина>',
          color=0xff9900
          )
          embban.set_footer(text='() - обязательно, <> - необязательно')
          await ctx.reply(embed=embban)

      elif comname == 'nick':
          embnik = discord.Embed(
          title='`Информация о команде >nick`',
          description='**Описание:**\nКоманда для изменения ника пользователю\n**Использование:**\n>nick (@участник) <новый ник>',
          color=0xff9900
          )
          embnik.set_footer(text='() - обязательно, <> - обязательно')
          await ctx.reply(embed=embnik)

      elif comname == 'avatar':
          embava = discord.Embed(
          title='`Информация о команде >avatar`',
          description='**Описание:**\nКоманда для просмотра аватара пользователя\n**Использование:**\n>avatar (@участник)',
          color=0xff9900
          )
          embava.set_footer(text='() - необязательно')
          await ctx.reply(embed=embava)

      elif comname == 'say':
          embsay = discord.Embed(
          title='`Информация о команде >say`',
          description='**Описание:**\nКоманда для письма сообщений от имени бота\n**Использование:**\n>say (сообщение)',
          color=0xff9900
          )
          embsay.set_footer(text='() - обязательно')
          await ctx.reply(embed=embsay)

      elif comname == 'embsay':
          embemb = discord.Embed(
          title='`Информация о команде >embsay`',
          description='**Описание:**\nКоманда для для письма от имени бота, вебхуком\n**Использование:**\n>embsay (сообщение)',
          color=0xff9900
          )
          embemb.set_footer(text='() - обязательно')
          await ctx.reply(embed=embemb)

      elif comname == 'automode':
          embnun = discord.Embed(
          title='`Информация о команде >automode`',
          description='**Описание:**\nКоманда для включение и выключения автомодерации на мат\n**Использование:**\n>automode',
          color=0xff9900
          )
          await ctx.reply(embed=embnun)

      elif comname == 'fox':
          embfox = discord.Embed(
          title='`Информация о команде >fox`',
          description='**Описание:**\nРандомные фото лисичек',
          color=0xff9900
          )
          await ctx.reply (embed=embfox)

      elif comname == 'dog':
          embdog = discord.Embed(
          title='`Информация о команде >dog`',
          description='**Описание:**\nРандомные фото собачек',
          color=0xff9900
          )
          await ctx.reply (embed=embdog)

      elif comname == 'cat':
          embcat = discord.Embed(
          title='`Информация о команде >cat`',
          description='**Описание:**\nРандомные фото котиков',
          color=0xff9900
          )
          await ctx.reply (embed=embcat)
          components = [
          Select(
          placeholder = 'SelectMenu',
          options = [
          SelectOption(label="SelectMenu1", value="value1",),
          SelectOption(label="SelectMenu2", value="value2"),
          SelectOption(label="SelectMenu3", value="value3"),
          SelectOption(label = "SelectMenu4", value = "value4"),
          SelectOption(label="SelectMenu5", value="value5"),
          SelectOption(label="SelectMenu6", value="value6"),
          SelectOption(label = "SelectMenu7", value = "value7"),
          SelectOption(label = "SelectMenu8", value = "value8")
          ])]

@bot.event
async def on_select_option(interaction):
    await interaction.respond(type=6)
    if interaction.values[0] == "value1":
        await interaction.author.send("Menu 1")
    elif interaction.values[0] == "value2":
        await interaction.author.send("Menu 2")

Если кому надо полный код бота, а он большой 600+ строк, то если он нужен то могу скинь файлом в дискорде, мой дискорд halflite#5696
Вдруг чего, это никакой не пиар!

await ctx.reply(embed=embcat,
    components=[
        Select(
            placeholder='SelectMenu',
            options=[
                SelectOption(label="SelectMenu1", value="value1",),
                SelectOption(label="SelectMenu2", value="value2"),
                SelectOption(label="SelectMenu3", value="value3"),
                SelectOption(label="SelectMenu4", value="value4"),
                SelectOption(label="SelectMenu5", value="value5"),
                SelectOption(label="SelectMenu6", value="value6"),
                SelectOption(label="SelectMenu7", value="value7"),
                SelectOption(label="SelectMenu8", value="value8")
            ]
        )
    ]
)


Функция для создание датафрэйма
<code>
import pandas as pd
import glob
import re

path1 = r'C:\Users\77081\Desktop\sweeps_D20'
path2 = r'C:\Users\77081\Desktop\sweeps_D40'
path3 = r'C:\Users\77081\Desktop\sweeps_D60'
path4 = r'C:\Users\77081\Desktop\sweeps_D80'
path5 = r'C:\Users\77081\Desktop\sweeps_D100'
path6 = r'C:\Users\77081\Desktop\sweeps_D120'
path7 = r'C:\Users\77081\Desktop\sweeps_D140'
files1 = glob.glob(path1 + "/*.S2P")
files2 = glob.glob(path2 + "/*.S2P")
files3 = glob.glob(path3 + "/*.S2P")
files4 = glob.glob(path4 + "/*.S2P")
files5 = glob.glob(path5 + "/*.S2P")
files6 = glob.glob(path6 + "/*.S2P")
files7 = glob.glob(path7 + "/*.S2P")

new_list1 = []
for filename in files1:
    df = pd.read_csv(filename, sep='\s+', skiprows= 11, header=None)
    df['V'] = filename
    df['T'] = 20
    new_list1.append(df)
dataset1 = pd.concat(new_list1, axis=0, ignore_index=True)
dataset1[['V1','V2','V3']] = dataset1['V'].str.split('=',n=2, expand=True)
dataset1.drop(['V','V1'], axis=1, inplace=True)
dataset1['V2'] = dataset1['V2'].str.replace('V_VDS', '')
dataset1['V3'] = dataset1['V3'].str.replace('V.S2P', '')
dataset1.columns = [  'F', 'A1', 'A2', 'A3', 'A4','A5', 'A6','A7', 'A8', 'T', 'B', 'C']
column_names = ['T', 'B', 'C', "F",'A1', 'A2', 'A3', 'A4','A5', 'A6','A7', 'A8']
dataset1 = dataset1.reindex(columns=column_names)

</code>
У меня есть 7 files. И из каждого files1, files2, ..., files7 я создаю датафрэйм и объединим их. Можете помочь создать функцию что бы оно создавало датафрэйм из каждого files и объединим их. filename это имя файла files1,...,7 это список из файлов.

Аналогичное решение. Попробуйте (я не тестировал):
<code>
import pandas as pd
from functools import partial

f = partial(pd.read_csv, sep=',', skiprows= 10, header=None)

def read_df(file_names):
    return pd.concat(map(f, file_names)))

df1 = read_df(files1)
df2 = read_df(files2)
# и так далее
</code>


Как сделать так чтобы бот в дискорде рандомил людей в канале? Discord.py
Например, Я пишу команду в канал !random
И в этом канале 8 человек он рандомит двух людей: красный -@N/A, синий - @N/A. И в этом же сообщении он пишет всех участников канала например:
Синий - @N/A
Красный - @N/A
Все участники:
Player @Player
Player1 @Player1
Player2 @Player2. И так далее, и главное чтобы бот именно смотрел канал в котором сидит тот кто написал команду. Как это можно сделать?

from random import shuffle

@bot.command()
async def random(ctx):
    all_players = ctx.author.voice.channel.members
    shuffle(all_players)
    team_1 = all_players[:len(all_players) // 2]
    team_2 = all_players[len(all_players) // 2:]
    await ctx.send("Team1:\n" + "\n".join(str(i) for i in team_1))
    await ctx.send("Team2:\n" + "\n".join(str(i) for i in team_2))


Конвертер строк
Хочу написать функцию, которая будет писать строчку в нужном падеже в зависимости от числа, пример:
<code>
1 сервер
2 сервера
3 сервера
4 сервера
5 серверов
6 серверов
7 серверов
8 серверов
9 серверов
10 серверов
11 серверов
<...>
21 сервер
22 сервера
23 сервера
24 сервера
25 серверов
26 серверов
27 серверов
28 серверов
29 серверов
30 серверов
31 сервер
32 сервера
33 сервера
34 сервера
35 серверов
<...>
110 серверов
111 серверов
115 серверов
121 сервер
122 сервера
</code>
Пока что 0 идей как можно это реализовать, так как в зависимости от десятков и сотен окончания всегда разные.
Помогите, пожалуйста.

На самом деле все проще. Есть всего 4 условия:

Числа-исключения
11,
12,
13 и
14 -
Серверов

Для всех остальных чисел:

Если на конце
1, значит
Сервер (1, 21, 31, 531)
Если на конце
2,
3 или
4, значит
Сервера (2, 34, 53)
Если на конце
5,
6,
7,
8,
9 или
0, значит тоже
Серверов (0, 100, 57, 39, 10005)

Чтобы получить последнюю цифру числа, достаточно получить остаток от деления этого числа на
10.
В
Python это записывается через оператор
%.

155 % 10; 155 делить на 10 будет 15, остаток 5. Смотрим 4 условие -
155 Серверов

Ну а далее делаем несложную функцию:

def word_form(value):
    if value in [11, 12, 13, 14]:
        return 'Серверов'
    elif value % 10 == 1:
        return 'Сервер'
    elif value % 10 in [2, 3, 4]:
        return 'Сервера'
    elif value % 10 in [5, 6, 7, 8, 9, 0]:
        return 'Серверов'

Функция выше проще читается, но компактнее это можно записать так:

def word_form(value):
    if (value % 100 in (11, 12, 13, 14)) or (value % 10 in (5, 6, 7, 8, 9, 0)):
        return 'Серверов'
    return 'Сервер' if (value % 10 == 1) else 'Сервера'


Не запускается команда на Discord - Python
У меня есть маленький код бота Discord:

#Статистика дискoрд бота МОЕГО
@bot.command()
async def stat(ctx, user: discord.Member=None):
    if user == None:
        user = ctx.author
    await ctx.send(
    embed = discord.Embed(
    title='Статистика LiteBot',
    description=f'**Основная**\n**Серверов:** {len(bot.guilds)}\n**Пользователей:** {len(guild.members)}\n**Каналов:** {len(guild.channels)}\n**Платформа**\n**Задержка:** {round(bot.latency * 1000)}mc\n**Запущен**: <t:1635770881:D>',
    color= 0xff9900))

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

{len(bot.channels)}

И вот это:

{len(bot.members)}

Команда перестала работать, а в консоли никаких ошибок нету. Не знаю, как исправить.

@bot.command()
async def stat(ctx, member: discord.Member=None):
    member = ctx.author if not member else member
    bot_members = sum([len(guild.members) for guild in bot.guilds])
    await ctx.send(
    embed = discord.Embed(
    title='Статистика LiteBot',
    description=f'**Основная**\n**Серверов:** {len(bot.guilds)}\n**Пользователей:** {bot_members}\n**Каналов:** {len(guild.channels)}\n**Платформа**\n**Задержка:** {round(bot.latency * 1000)}mc\n**Запущен**: <t:1635770881:D>',
    color= 0xff9900))


Как сделать вывод фото в telebot
Есть код и я хочу что бы вместо текста фото1 и т.д. были какие либо фотографии и они воспроизводились случайным образом когда нажималась кнопка фото

import telebot
import random
from telebot import types
from PIL import Image
sl={
    '1':'фото1',
    '2':'фото2',
    '3':'фото3',
    '4':'фото4',
    '5':'фото5',
    '6':'фото6',
    '7':'фото7',
    '8':'фото8',
    '9':'фото9'
    }
sk ={
    '1':'текст1',
    '2':'текст2',
    '3':'текст3',
    '4':'текст4',
    '5':'текст5',
    '6':'текст6',
    '7':'текст7',
    '8':'текст8',
    '9':'текст9'
}
bot = telebot.TeleBot('TOKEN');
def ds (message):
    markup = types.InlineKeyboardMarkup()
    item1 = types.InlineKeyboardButton('Фото', callback_data='yes')
    item2 = types.InlineKeyboardButton('Милые слова', callback_data='no')
    markup.add(item1, item2)
    bot.send_message(message.chat.id, text='Выбрать действие:', reply_markup=markup)
@bot.callback_query_handler(func=lambda call:True)
def callback(call):
    if call.message:
        if call.data == 'yes':
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= sl[str(random.randint(1,9))])
        elif call.data == 'no':
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= sk[str(random.randint(1,9))])
bot.polling(none_stop=True, interval=0)

Как мне нужно написать
if call.data == 'yes': bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= sl[str(random.randint(1,9))])  вот эту команду что бы работала с фото?

Сделайте так:

Замените словарь
sl на следующий:

sl={
    '1':'путь к фото1',
    '2':'путь к фото2',
    ...
    }

Замените код отправки на следующий:

if call.data == 'yes':
    bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= sk[str(random.randint(1,9))])
    bot.send_photo(message.chat.id, open(sl[str(random.randint(1,9))])

Функция
send_photo() отправляет в чат фотографию.


Как вывести только не совпадающие данные в pandas?
Сравниваю две таблицы excel:

df1 = pd.read_excel(self.filename, skiprows=2, header=None, usecols=[3,4,5,20])
df2 = pd.read_excel(self.filename1, skiprows=2, header=None, usecols=[3,4,5,20])
difference = df1[df1 != df2]

результат сравнения вывожу в третью таблицу:

df1.to_excel(r"C:\Users\User\Desktop\Результат.xlsx")

но в неё попадают все строки. Как их убрать, оставив лишь те, которые не совпали с первой таблицей?
Исходные данные

Если наименования столбцов в обоих фреймах совпадают, то можно попробовать сделать так:

diff = df1.loc[df1.ne(df2).any(axis=1)]

Пример решения для данных по ссылке:

In [105]: df2.loc[df1.ne(df2).any(axis=1)]
Out[105]:
   №     Товар  Цена
0  0  Карандаш    70
3  3  Резинка     50


Как из словаря взять нужное?
У меня есть код:

def main():
    ip = str(input("ip: "))
    time = str(input("time (max 250): "))
    port = str(input("port: "))
    method = str(input("method (CLDAP, NTP, DNS): "))
    return ip, time, port, method

if __name__ == "__main__":
    print(main())

Он возвращает
('1284', '250', '234', 'DNS').
Как мне отделить элементы, то есть, сделать как-то так:

if __name__ == "__main__":
   ip = main().ip
   time = main().time
   port = main().port
   method = main().method

Функция main возвращает кортеж из 4 элементов: ip, time, port, method.
Чтобы этим значениям присвоить собственную переменную, нужно добавить при вызове main следующее:

    ip, time, port, method = main()

В итоге получим:

def main():
    ip = str(input("ip: "))
    time = str(input("time (max 250): "))
    port = str(input("port: "))
    method = str(input("method (CLDAP, NTP, DNS): "))
    return ip, time, port, method

if __name__ == "__main__":
    ip, time, port, method = main()
    print(ip, time, port, method)


Python 3.9 keyboard.record()
Возник вопрос:
В модуле
keyboard имеется функция записи действий с клавиатуры (
start_recording - stop_recording), по окончании записи данные представляются в типе
list и их можно записать в переменную.
Вопрос в том, как бы записать эти данные с записи в файл, да так чтоб при открытии в следующий раз
list сохранился для чтения модулем
keyboard (функция:
play()). Или же имеются способы по восстановлению
list из строки?...

import keyboard,json
#нажмите k для активации записи клавиш с клавиатуры пк
keyboard.wait('k')
keyboard.start_recording()
keyboard.wait('l')
a=keyboard.stop_recording()
# здесь тип переменной a list
with open('name.txt','w') as f:
    f.write(str(a))
with open('name.txt','r') as f:
    b = f.read(json.loads(f.read()))
#при присваивании b ошибка.

keyboard устанавливается на win:
pip install keyboard.

допустим

events = [keyboard.KeyboardEvent(0,0)]

тогда можно сохранить как

with open('list.txt', 'w', encoding='utf-8') as f:
    f.writelines( [ ke.to_json()+'\n' for ke in events ] )

прочитать обратно

import json

with open('list.txt', 'r', encoding='utf-8') as f:
    events = [ keyboard.KeyboardEvent(**json.loads(js)) for js in f.readlines()]


как узнать высшую роль на сервере Discord py
Мне надо, чтобы бот мог определить высшую роль пользователя и создать роль на одну выше, допустим чтобы выдать ему цвет

Аттрибутом top_role
<code>
@bot.command()
async def highest_role(ctx, member: discord.Member=None):
    member = ctx.author if not member else member
    await ctx.send(member.top_role)
</code>


Ошибка в коде бота telebot [закрыт]

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

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

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

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

<code>
import telebot
import random
from telebot import types
bot = telebot.TeleBot('TOKEN');
@bot.message_handler(commands=['start'])
def love (message):
    bot.send_message(message.chat.id, 'Диана, я тебя люблю💗')
    @bot.message_handler(content_types=['text'])
    def ds (message):
        markup = types.InlineKeyboardMarkup()
        item1 = types.InlineKeyboardButton('Фото', callback_data='yes')
        item2 = types.InlineKeyboardButton('Милые слова', callback_data='no')
        markup.add(item1, item2)
        bot.send_message(message.chat.id, text='Выбрать действие:', reply_markup=markup)
        @bot.callback_query_handler(func=lambda call:True)
        def callback(call):
            if call.message:
                if call.data == 'yes':
                    x=random.randint(1,9)
                    if x==1:
                        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= 'Текст 1')
                    if x==2:
                        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= 'Текст 2')
                    if x==3:
                        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= 'Текст 3')
                    if x==4:
                        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= 'Текст 4')
                    if x==5:
                        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= 'Текст 5')
                    if x==6:
                        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= 'Текст 6')
                        if x==7
                        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= 'Текст 7')
                        if x== 8
                        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= 'Текст 8')
                        if x==9
                        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= 'Текст 9')
                    elif call.data == 'no':
                        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= 'Пока друг')
                        bot.polling(none_stop=True, interval=0)

</code>

Я уже давал ответ! Ошибка в коде telebot Хорошо, продублирую
У Вас огромные проблемы с отступами. К тому же, ваш код можно заметно сократить (всё работает, проверил):

import telebot
import random
from telebot import types
sl={
    '1':'текст1',
    '2':'текст2'
    }
bot = telebot.TeleBot('5011985177:AAF-fiMp7siTDaCnC8y1BH4eax1dM-hfzEI');
@bot.message_handler(commands=['start'])
def love (message):
    bot.send_message(message.chat.id, 'Диана, я тебя люблю💗')
@bot.message_handler(content_types=['text'])
def ds (message):
    markup = types.InlineKeyboardMarkup()
    item1 = types.InlineKeyboardButton('Фото', callback_data='yes')
    item2 = types.InlineKeyboardButton('Милые слова', callback_data='no')
    markup.add(item1, item2)
    bot.send_message(message.chat.id, text='Выбрать действие:', reply_markup=markup)
@bot.callback_query_handler(func=lambda call:True)
def callback(call):
    if call.message:
        if call.data == 'yes':
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= sl[str(random.randint(1,9))])
        elif call.data == 'no':
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text= 'Пока друг')
bot.polling(none_stop=True, interval=0)

Добавляйте в
sl новые значения от 1 до 9, изменяйте тексты.


Распознание объектов, ошибка при запуске
Я использовал mask_rcnn_coco.h5 в качестве предварительно обученной модели.
И я получаю такую ошибку при запуске.

Traceback (most recent call last):
  File "C:\Users\Damir\IdeaProjects\namber\tenzer.py", line 12, in <module>
    main()
  File "C:\Users\Damir\IdeaProjects\namber\tenzer.py", line 10, in main
    obg()
  File "C:\Users\Damir\IdeaProjects\namber\tenzer.py", line 5, in obg
    segment.load_model(r'C:\Users\Damir\IdeaProjects\namber\mask_rcnn_balloon.h5')
  File "C:\Users\Damir\IdeaProjects\nero\venv\lib\site-packages\pixellib\instance\__init__.py", line 65, in load_model
    self.model.load_weights(model_path, by_name= True)
  File "C:\Users\Damir\IdeaProjects\nero\venv\lib\site-packages\pixellib\instance\mask_rcnn.py", line 2110, in load_weights
    hdf5_format.load_weights_from_hdf5_group_by_name(f, layers)
  File "C:\Users\Damir\IdeaProjects\nero\venv\lib\site-packages\tensorflow\python\keras\saving\hdf5_format.py", line 790, in load_weights_from_hdf5_group_by_name
    raise ValueError('Layer #' + str(k) +' (named "' + layer.name +
ValueError: Layer #389 (named "mrcnn_bbox_fc"), weight <tf.Variable 'mrcnn_bbox_fc/kernel:0' shape=(1024, 324) dtype=float32> has shape (1024, 324), but the saved weight has shape (1024, 8).

Process finished with exit code 1

код:

from  pixellib.instance import instance_segmentation

def obg():
    segment = instance_segmentation()
    segment.load_model(r'C:\Users\Damir\IdeaProjects\namber\mask_rcnn_balloon.h5')
    segment.segmentImage(image_path='images.jfif',output_image_name='12345.jpg',show_bboxes=True)

def main ():
    obg()
if __name__=='__main__':
    main()

я конечно не уверен, но может из за этого: has shape (1024, 324), but the saved weight has shape (1024, 8)


бот не выдаёт роль участнику (discord.py)
выходит такая ошибка:

author = bot.get_member(637...)
AttributeError:
'Bot' object has no attribute 'get_member'

вот команда:
<code>
@bot.command()
async def close(ctx):
    author = bot.get_member(637...)
    guild = bot.get_guild(824...)
    role = guild.get_role(869...)

    await author.add_roles(role)
    await ctx.send(
        embed=discord.Embed(
            description=f"**нехороший человек закрылся**",
            color=discord.Color.red(),
        )
    )
</code>

Откройте список методов объекта
discord.ext.commands.Bot и увидите, что никакого метода
get_member() у вашего бота нет.
Об этом же говорится в тексте ошибки

AttributeError: 'Bot' object has no attribute 'get_member'

Чтобы получить участника сервера, воспользуйтесь функцией
discord.utils.get

member = discord.utils.get(guild.members, id=637...)

Или через объект сервера:

member = guild.get_member(637...)

Чтобы каждый раз не получать участника через
id, можно передать его в качестве аргумента команды. Подробнее здесь.

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


Бот не выводит ранее указанное значение
Недавно начал кодить телеграмм ботов c базой данных на Python, используя библиотеки pytelegrambotAPI и sqlite3, и столкнулся с проблемой. Код не выводит значение, указаное пользователем. Код:
<code>
import sqlite3

token =
bot = telebot.TeleBot(token)

db = sqlite3.connect('data.db', check_same_thread=False)
cursor = db.cursor()

cursor.execute('''CREATE TABLE IF NOT EXISTS tbl(
    user_id integer,
    status string
)''')

@bot.message_handler(commands=['start'])

def welcome(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item1 = types.KeyboardButton("test func")
    markup.add(item1)
    bot.send_message(message.chat.id, "Привет, {0.first_name}!\nЯ - {1.first_name}!".format(message.from_user, bot.get_me()), reply_markup=markup)

@bot.message_handler(content_types=['text'])

def main(message):
    if message.chat.type == 'private':
        if message.text == "Назад":
            markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
            item1 = types.KeyboardButton("test func")

            markup.add(item1)
            bot.send_message(message.chat.id, "Назад".format(message.from_user, bot.get_me()), reply_markup=markup)
        elif message.text == "test func":
            cursor.execute(f"SELECT `status` FROM `tbl` WHERE `user_id` = '{message.from_user.id}'")
            if cursor.fetchone() is None:
                markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
                item1 = types.KeyboardButton("1а")
                item2 = types.KeyboardButton("2а")
                back = types.KeyboardButton("Назад")

                markup.add(item1, item2, back)
                bot.send_message(message.chat.id, "test func".format(message.from_user, bot.get_me()), reply_markup=markup)

            elif cursor.fetchone() == '1':
                markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
                back = types.KeyboardButton("Назад")

                markup.add(back)
                bot.send_message(message.chat.id, "1".format(message.from_user, bot.get_me()), reply_markup=markup)
            elif cursor.fetchone() == "2":
                markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
                back = types.KeyboardButton("Назад")

                markup.add(back)
                bot.send_message(message.chat.id, "2".format(message.from_user, bot.get_me()), reply_markup=markup)
        elif message.text == "1а":
            cursor.execute('INSERT INTO tbl VALUES (?, ?)', (message.from_user.id, '1'))
            db.commit()
            markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
            back = types.KeyboardButton("Назад")

            markup.add(back)
            bot.send_message(message.chat.id, "1".format(message.from_user, bot.get_me()), reply_markup=markup)
        elif message.text == "2а":
            cursor.execute('INSERT INTO tbl VALUES (?, ?)', (message.from_user.id, '2'))
            db.commit()
            markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
            back = types.KeyboardButton("Назад")

            markup.add(back)
            bot.send_message(message.chat.id, "2".format(message.from_user, bot.get_me()), reply_markup=markup)

bot.polling(none_stop=True)
</code>
При выполнении test func первый раз код должен записать данные которые введёт юзер, и когда функция будет выполнятся второй раз он должен вывести значение, которое юзер указал в первый раз когда её использовал. Бот не выводит. Заранее благодарю.

Функция
fetchone возвращает кортеж для существующих данных, поэтому ваша проверка, типа
cursor.fetchone() == '1' (например, если статус
'1', то проверка была бы
('1',) == '1'), всегда будет
False
Я бы поменял код на вот так:

        elif message.text == "test func":
            sql = "SELECT `status` FROM `tbl` WHERE `user_id` = ?"
            result = cursor.execute(sql, [message.from_user.id]).fetchone()
            status = result[0] if result else None

            if status is None:
                markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
                item1 = types.KeyboardButton("1а")
                item2 = types.KeyboardButton("2а")
                back = types.KeyboardButton("Назад")

                markup.add(item1, item2, back)
                bot.send_message(message.chat.id, "test func".format(message.from_user, bot.get_me()), reply_markup=markup)

            elif status == '1':
                markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
                back = types.KeyboardButton("Назад")

                markup.add(back)
                bot.send_message(message.chat.id, "1".format(message.from_user, bot.get_me()), reply_markup=markup)

            elif status == "2":
                ...


Задать параллельный запуск подпроцесса Python
Задача, сделать несколько рендеров параллельно. Из инструментов Python и Blender.
Есть скрипт, который запускает рендер Blender через консоль один за другим. Один рендер длиться приблизительно 1 минуту. Этот скрипт можно свести сейчас к двум строкам:

sh = ['blender', "-b", 'file.blend', "-P", 'script.py')]
proc = subprocess.run(sh)

Где script.py это файл где хранятся настройки сцены для одного рендера.
Так как рендеринг это довольно затратное дело, то я хочу запустить скрипт в отдельном процессе, по этому использую библиотеку multiprocessing. В итоге код стал выглядеть примерно так:

procs = []
for num in range(len(camera_points)):
    sh = ['blender', "-b", 'file.blend', "-P", f'script_{num}.py')]
    proc = Process(target=subprocess.run, args=(sh,))
    procs.append(proc)
    proc.start()

for proc in procs:
    proc.join()

После того как я получу рендеры, я хочу их загрузить на s3 bucket, по этому я жду окончания этих процессов.
Я ожидал получить прирост скорости хотя бы в х4, так как теперь вместо одного рендера на одну минуту, будет проходить условно 5 рендеров за одну минуту. Однако в реальности 5 процессов запустились одновременно, один за другим записали результат в папку и суммарное время выполнение, составило 5 минут. В то время когда я ожидал что время выполнения сократиться хотя бы до 2.
Рендеринг проводился на AWS на сервере g3.16xlarge, с установленными и активированными драйверами GRID. В процессе рендеринга, половина GPU большую часть времени простаивала.

Не надо запускать процессы по числу кадров. Они конкурируют за ресурсы которых явно меньше чем нужно. multiprocessing.Pool запустит несколько процессов и распределит кадры между ними:
<code>
import multiprocessing
import subprocess

def render(num):
    print('start', num)
    subprocess.run(['blender', '-b', 'file.blend', "-P", f'script_{num}.py'])
    print('stop', num)

if __name__ == '__main__':
    n_cameras = 100
    with multiprocessing.Pool() as p:
        p.map(render, range(n_cameras))
    print('done')
</code>


как преобразовать object в int64 Python
как преобразовать столбец "data" из object в int64,  вот данные df
<code>
import numpy as np
import pandas as pd

df = pd.read_excel("df.xlsx")

# пробую так, но выдает ошибку.
df["data"].values.astype(np.int64)

Traceback (most recent call last):
  File "<ipython-input-143-763b952fb481>", line 1, in <module>
    df["data"].values.astype(np.int64)
ValueError: invalid literal for int() with base 10: '1 246'

</code>

Воспользуйтесь методом pd.to_numeric():
<code>
df["new"] = pd.to_numeric(df["data"].str.replace(r"[^\d\-]", ""), errors="coerce")
</code>


Как соединить словари? \\ Python
У меня есть два словаря с разными значениями и ключами.
Как мне из них сделать один словарь и в этом словаре будут значения и ключ как с первого словаря, так и со второго

Работать будет только в Python 3.5 и выше.
<code>
a = {'a':1, 'b':2, 'c':3} #Создаем словарь a
b = {'d':100, 'e':23, 'f':998} #Создаем словарь b
c = {**a, **b} #Соеденяем словари в переменную c
</code>


Минимальная сумма 2 чисел, составленныхх из всех значений массива
Дан массив цифр. Нужно составить из этих цифр два числа таких, что их сумма минимальна. На выход выдать эту сумму. Каждая цифра из массива должна использоваться ровно 1 раз.
Например,
min_digits_sum([1,2,3]) = 12 + 3 = 15, а
min_digits_sum([3,2,1,4,5,6,9,8,7,0]) = 16047
Попробовал составлять числа из наибольших и наименьших значений массива:

s_arr = sorted(arr)

if len(s_arr) % 2 == 0:
    ss1 = ''.join(map(str, s_arr[:(len(s_arr)//2):]))
    ss2 = ''.join(map(str, s_arr[(len(s_arr)//2)::]))
    s = int(ss1) + int(ss2)
else:
    ss1 = ''.join(map(str, s_arr[:(len(s_arr)//2)+1:]))
    ss2 = ''.join(map(str, s_arr[(len(s_arr)//2)+1::]))
    s = int(ss1) + int(ss2)

print(s)

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

Также думал о том, что самые большие цифры должны уходить в младшие разряды, но не знаю, верно ли это.

Да, это верно. Вы шли по правильному пути :)) Но тут можно обойтись без функций
map,
join и так далее.
Итак, вот ваш код:

s_arr = [3,2,1,4,5,6,9,8,7,0]
n = len(s_arr)
s_arr = sorted(s_arr)
num1 = num2 = 0
for i in range(n):
    if i % 2 == 0:
        num1 = num1 * 10 + s_arr[i]
    else:
        num2 = num2 * 10 + s_arr[i]
print(num1+num2)

Алгоритм:

приравниваем
n к длине
s_arr
сортируем
s_arr по возрастанию
приравниваем
num1 и
num2 значение 0
повторить
n раз:

если шаг делится на 2:

num1 = num1 * 10 + s_arr[i]

иначе:

num2 = num2 * 10 + s_arr[i]

печатаем сумму
num и
num2

Вывод:

16047

Помог ли мой ответ?


Как сделать чтобы бот из списка рандомно выбирал слово и отправлял его? discord.py [закрыт]

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

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

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

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

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

Данную функцию выполняет модуль random у которого есть метод choice. Он выбирает случайное значение из переданного ему списка
<code>
import random

words_list = ["word1", "word2", "word3", "word4"]

random_word = random.choice(words_list)

print(random_word)
</code>


subprocess run искажает параметр. Как узнать что именно получается при запуске?
Я в python запускаю внешнюю программу с параметрами, используя функцию run модуля subprocess. Передаю туда первый параметр типа list. Но программа не запускается, т.к. subprocess искажает один параметр который является путём. Возникают ошибки типа "нет доступа к d:" или какие то другие, если я пробую экспериментировать с кавычками.
Как мне понять, какой конечный путь составляет subprocess, какой путь запускает в ОС? Сторонними средствами или как можно узнать это?

Все заработало.
Решил упростить и уменьшить пример, чтобы внести код в студию, по просьбе @AlexeyTen. И этот упрощенный код заработал без ошибок.
Я использовал апострофы для обертки одного из параметров, который является путем и они портили результат. Убрал эти апострофы и все заработало.


как отсортировать значения в словаре?
Пусть имеется словарь:

{'+7': 2345678901, '+4': 3456789012, '+5': 5678901234, '+12': 78901234}

Необходимо вывести телефонные номера по убыванию чисел, указанных в ключах, то есть, в порядке:
+4, +5, +7, +12
пробовал использовать функцию
sorted(), но ничего не получалось


Python. Двоичное дерево
Задача состоит в том, чтобы реализовать классическое бинарное дерево, где у каждого узла могут быть два потомка. Используя метод insert() каждое последующее значение должно добавляться слева-направо. К сожалению, мне так и не удалось придумать каким образом это реализовать. В момем коде я попытался сделать это рекурсирно, но этот код все равно не проходит. Есть идеи по решению задачи через использования уровней потомков, т.е присвоения порядкого номера каждому последующему ряду потомков и применения списка.
<code>
class TreeNode:
    def __init__(self, key=None):
        self.key = key
        self.left = None
        self.right = None

    def insert(self, key):
        if self.key == None:
            self.key = key
        elif self.left == None:
            self.left = TreeNode(key)
        elif self.right == None:
            self.right = TreeNode(key)
        else:
            if type(self.left.left) != 'TreeNode':
                node = self.left
                node.left = TreeNode()
                node.left.insert(key)

tree = TreeNode()
tree.insert(9)
tree.insert(17)
tree.insert(4)
tree.insert(3)
tree.insert(6)
print(tree.key)
print(tree.left.key)
print(tree.right.key)
print(tree.left.left.key)
print(tree.left.left.left.key)
</code>

Вот вариант на рекурсии.
Сначала, сравнив добавляемое значение с текущим, надо решить куда идти - налево или направо. Ну а потом, если там
None, то добавляем новый узел. Иначе проваливаемся вглубь (вызываем
insert у дочернего элемента) и там всё повторяется сначала. Вроде ничего сложного.

class TreeNode:
    def __init__(self, key=None):
        self.key = key
        self.left = None
        self.right = None

    def __str__(self):
        return f"TreeNode({self.key})"

    def insert(self, key):
        if self.key is None:
            self.key = key
            return

        if key < self.key:
            if self.left is None:
                self.left = TreeNode(key)
            else:
                self.left.insert(key)
        elif key > self.key:
            if self.right is None:
                self.right = TreeNode(key)
            else:
                self.right.insert(key)
        else:
            raise ValueError(f"Key {key} already exists")

    def print_hierarchy(self, dir="root", level=0):
        print(f"[{dir}] #{level} = {self.key} | left = {self.left} | right = {self.right}")
        if self.left  is not None: self.left.print_hierarchy("left", level+1)
        if self.right is not None: self.right.print_hierarchy("right", level+1)

tree = TreeNode()
tree.insert(9)
tree.insert(17)
tree.insert(4)
tree.insert(3)
tree.insert(6)
tree.print_hierarchy()
tree.insert(3) # exception

[root] #0 = 9 | left = TreeNode(4) | right = TreeNode(17)
[left] #1 = 4 | left = TreeNode(3) | right = TreeNode(6)
[left] #2 = 3 | left = None | right = None
[right] #2 = 6 | left = None | right = None
[right] #1 = 17 | left = None | right = None
ValueError: Key 3 already exists

Или вариант добавления без рекурсии, простым проходом по дереву в цикле.

    def insert(self, key):
        if self.key is None:
            self.key = key
            return

        current = self
        while True:
            if key < current.key:
                if current.left is None:
                    current.left = TreeNode(key)
                    break
                current = current.left
            elif key > current.key:
                if current.right is None:
                    current.right = TreeNode(key)
                    break
                current = current.right
            else:
                raise ValueError(f"Key {key} already exists")


telegramBOT. Вывод определенных полей с Message
есть сообщение от Бота:

print(message)
{'content_type': 'text', 'id': 1797, 'message_id': 1797, 'from_user': {'id': 51665305, 'is_bot': False, 'first_name': 'Smart', 'username': 'Smart_777', 'last_name': None, 'language_code': 'en', 'can_join_groups': None, 'can_read_all_group_messages': None, 'supports_inline_queries': None},  'text': '1001'}}

Но как из этих сообщений вывести нужные данные. Например:
username,
first_name,
id,
text и тогдали

Например,
id можно вывести так:

print(message['from_user']['id'])

Или так (это вы встретите везде):

print(message.from_user.id)

(короче)
Вывод:

51665305

И заменяйте
['id'] на
['username'],
['first_name'],
['text'] и "тогдали" :))


Как сделать так, чтобы бот ставил реакцию на свое сообщение?
Можете показать, на этом примере, пожалуйста
<code>
@commands.command(name='play', description=config.HELP_YT_LONG, help=config.HELP_YT_SHORT, aliases=['p', 'yt', 'pl'])
async def _play_song(self, ctx, *, track: str):

    current_guild = utils.get_guild(self.bot, ctx.message)
    audiocontroller = utils.guild_to_audiocontroller[current_guild]

    if(await utils.is_connected(ctx) == None):
        if await audiocontroller.uconnect(ctx) == False:
            return

    if track.isspace() or not track:
        return

    if await utils.play_check(ctx) == False:
        return

    # reset timer
    audiocontroller.timer.cancel()
    audiocontroller.timer = utils.Timer(audiocontroller.timeout_handler)

    if audiocontroller.playlist.loop == True:
        await ctx.send("Повтор включен! Используйте {}loop, чтобы отключить".format(config.BOT_PREFIX))
        return

    song = await audiocontroller.process_song(track)

    if song is None:
        await ctx.send(config.SONGINFO_ERROR)
        return

    if song.origin == linkutils.Origins.Default:

        if audiocontroller.current_song != None and len(audiocontroller.playlist.playque) == 0:
            await ctx.send(embed=song.info.format_output(config.SONGINFO_NOW_PLAYING))
        else:
            await ctx.send(embed=song.info.format_output(config.SONGINFO_QUEUE_ADDED))

    elif song.origin == linkutils.Origins.Playlist:
        await ctx.send(config.SONGINFO_PLAYLIST_QUEUED)
</code>

@commands.command():
async def test(self, ctx):
    await ctx.message.add_reaction('✔')

Если хотите сделать плеер, то лучше использовать
lavalink


Как достать текст из entry Python
Я создаю большое количество entry (использую tkinter) вот код -
<code>
for i in range(1,31):
    entries["EntryNumber{0}".format(i)]=Entry().place(relx=x_for_entry, rely=y_for_entry, anchor="c")
</code>
Далее мне нужно из каждого entry вытаскивать текст , так же в цикле . Как мне это реализовать?

Создание:

for i in range(1,31):
    entries[f"EntryNumber{i}"] = Entry()  # чтобы сохранить ссылку на виджет
    entries[f"EntryNumber{i}"].place(relx=x_for_entry, rely=y_for_entry, anchor="c")

Получение содержимого:

for i in range(1,31):
    print( entries[f"EntryNumber{i}"].get() )


CallbackQuery' object has no attribute 'message_id

@dp.callback_query_handler(text = "button1")
async def inline_button1(message: types.Message):
    await bot.delete_message(message.chat.id, message.message_id)
    await bot.send_message(message.from_user.id, "ИНФОРМАЦИЯ_ПАК_1")

Не работает именно удаление сообщения, что тут не так?

Выбивает ошибку:
Updates were skipped successfully.
Task exception was never retrieved
future: <Task finished name='Task-14' coro=<Dispatcher._process_polling_updates() done, defined at C:\Users\kukuk\PycharmProjects\telegabot\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py:407> exception=AttributeError("'CallbackQuery' object has no attribute 'message_id'")>
Traceback (most recent call last):
  File "C:\Users\kukuk\PycharmProjects\telegabot\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 415, in _process_polling_updates
    for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
  File "C:\Users\kukuk\PycharmProjects\telegabot\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates
    return await asyncio.gather(*tasks)
  File "C:\Users\kukuk\PycharmProjects\telegabot\venv\lib\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
    response = await handler_obj.handler(*args, **partial_data)
  File "C:\Users\kukuk\PycharmProjects\telegabot\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 283, in process_update
    return await self.callback_query_handlers.notify(update.callback_query)
  File "C:\Users\kukuk\PycharmProjects\telegabot\venv\lib\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
    response = await handler_obj.handler(*args, **partial_data)
  File "C:\Users\kukuk\PycharmProjects\telegabot\main.py", line 27, in inline_button1
    await bot.delete_message(message.from_user.id, message.message_id)
AttributeError: 'CallbackQuery' object has no attribute 'message_id'
Goodbye!

Если Вы обрабатываете CallbackQuery, то и приходит в обработчик объект CallbackQuery, а не Message.

@dp.callback_query_handler(text="button1")
async def inline_button1(query: types.CallbackQuery):
    user_id = query.message.from_user.id
    await query.message.delete()
    await bot.send_message(user_id, "ИНФОРМАЦИЯ_ПАК_1")

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

@dp.callback_query_handler(text="button1")
async def inline_button1(query: types.CallbackQuery):
    await query.message.edit_text("ИНФОРМАЦИЯ_ПАК_1")


Не запускается код. ModuleNotFoundError: No module named 'tkinter'
Traceback (most recent call last):
File "/home/egor-lyadsky/PycharmProjects/pythonProject/main.py", line 1, in
from tkinter import *
ModuleNotFoundError: No module named 'tkinter'

Поскольку у Вас вывод указывает на исполнение в *NIX системе, осмелюсь предположить, что используется Debian подобный дистрибутив. В таком случае просто запустите

sudo apt install python3-tk

Если у Вас Arch, то

sudo pacman -S python3-tk

В иных случаях смотрите менеджер пакетов своей OS.


Воспользуйтесь методом конвертации pandas:

df['date'] = pd.to_datetime(df['date'], unit='s')

Обратите внимание на параметр
unit - если вы не укажите его, у вас расчет будет в наносекундах с начала эпохи Unix, и вы получите неверные даты.


ModuleNotFoundError: No module named 'lab_3'
Написал небольшой графический интерфейс используя библиотеку PyQt5.
app_window.py:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):

...

app_main_window.py:

import sys
from PyQt5 import QtWidgets, uic
from lab_3.gui_6.app_window import Ui_MainWindow
#lab_3.gui_6 - это расположение файла app_window
class myApp (QtWidgets.QMainWindow):
    def __init__(self):
        super(myApp, self).__init__()
        #Before executin this attribute should be initialized
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        #self.ui = uic.loadUi('./app_window.ui', self)
app = QtWidgets.QApplication([])
window = myApp()
window. show ()
sys.exit (app.exec())

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

Traceback (most recent call last):
 File "c:\...\Pyt\lab_3\gui_6\app_main_window.py", line 3,in <module>
  from lab_3.gui_6.app_window import Ui_MainWindow
ModuleNotFoundError: No module named 'lab_3'

Кто знает как решить эту проблему?

Я так понимаю, что модули
app_main_window.py и
app_window.py лежат в одном каталоге
c:\...\Pyt\lab_3\gui_6\
а запускаете вы приложение так:

python c:\...\Pyt\lab_3\gui_6\app_main_window.py

Тогда попробуйте импорт:

from app_window import Ui_MainWindow

вместо:

from lab_3.gui_6.app_window import Ui_MainWindow


Как сформировать список списков Python
Час добрый
Подскажите пожалуйста как можно создать список списков в Python для следующего набора списков:

name = ['John']
sname = ['Black']
money = ['10', '20', '15']
car = ['red', 'blue', 'white']
car_num = ['221', '152', '612154']

Чтобы получить таблицу вида:

--------------------------------------
name | sname | money| car  | car_num |
-------------------------------------
John | Black | 10   | red  | 221     |
     |       | 20   | blue | 152     |
     |       | 15   | white| 612154  |
--------------------------------------

Т.е. чтобы появился список с этими данными, который можно записать в csv файл при помощи команды пандаса:

df = pd.DataFrame(data, columns=["name","sname","money","car","car_num"])

В списке name и sname всегда будет по 1 элементу, который будет состоять из нескольких слов. К примеру за место John будет записано

 name = ['John from NewYork']

В списках money, car, car_num всегда будет равное количество элементов, до 40 шт. (в примере всего лишь 3 накидал)
Так же подскажите пожалуйста как потом сие чудо сохранить в csv, чтобы по итогу появилась таблица из примера

Если я правильно понял, что вы хотите:

находим максимальную длину списков
добиваем пустыми строками до нужной длины те списки, которые могут быть недостаточно длинными (иначе
Pandas будет ругаться, что это неправильная таблица)

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

import pandas as pd

name = ['John from NewYork']
sname = ['Black']
money = ['10', '20', '15']
car = ['red', 'blue', 'white']
car_num = ['221', '152', '612154']

max_len = max(map(len, [name, sname, money, car, car_num]))
pad_list = lambda x,n: x + [''] * (n - len(x))

df = pd.DataFrame({
    'name': pad_list(name, max_len),
    'sname': pad_list(sname, max_len),
    'money': money,
    'car': car,
    'car_num': car_num,
})

df

Вывод:

                 name   sname   money     car   car_num
0   John from NewYork   Black      10     red       221
1                                  20    blue       152
2                                  15   white    612154


Пояснение по итераторам и генераторам python
Прошу совета/пояснения: Где лучше использовать генератор, а где итератор.
Допустим есть итератор:

class MyIter1:
    def __init__(self, num):
        self.num = num

    def __iter__(self):
        return self

    def __next__(self):
        if self.num > 0:
            self.num -= 1
            return self.num
        raise StopIteration

И цикл for:

for i in MyIter1(10):
    print(i)

В цикле у
MyIter1 вызывается метод
__next__  и используется значение, которое он вернул.
И есть генератор:

def gen(num):
    for x in range(num):
        if num > 0:
            num -= 1
            yield num

И к нему такой же цикл for:

for i in gen(10):
    print(i)

В цикле у
gen вызывается
next() и используется значение, которое он вернул.
И вот вопросы:
Чем различаются эти 2 способа (просто на мой взгляд они примерно одинаковые), где лучше использовать каждый из них и в каких ситуациях они будут существенно различаться (желательно с примерами).
P.S. Я знаком с генераторами и понимаю принцип их работы, что их применяют для потоковой обработки данных, но я не до конца понимаю в чём разница, ведь это можно сделать и итератором, просто вызывая у него
__next__() тогда, когда это требуется.

Пример использования генератора:
<code>
def flatten(sequence):
    for element in sequence:
        if hasattr(element, '__iter__'):
            yield from flatten(element)
        else:
            yield element

print(*flatten([1, [2], [3, [4]]]), sep=' ')
'''
1 2 3 4
</code>
А как бы вы реализовали это с помощью итератора?


Как проверить в какой тип возможно преобразовать переменную Python
Всем привет, столкнулся с такой проблемой. Я считываю файл Excel, в котором имеются данные разных типов (Дата, Число, Число с плавающей запятой и Строка). Считываю при помощи библиотеки xlrd, и разумеется все данные считываются в строку. Далее, мне необходимо преобразовать эту строку, в тот тип данных, в котором они были в Excel, другими словами, мне необходимо проверить, возможно ли преобразовать считанную строку в int, float или datetime. Я написал вот такой код, и он работает.
<code>
workbook = xlrd.open_workbook('input.xlsx', 0)
sh = workbook.sheet_by_index(0)
for i in range(11, 12):
    for j in range(sh.ncols - 1):
        cll = sh.cell_value(rowx=i, colx=j)
        try:
            # Сначала проверяем можно ли сделать из этого дату старше 2010 года
            # Если да, то записываем
            if xlrd.xldate.xldate_as_datetime(sh.cell_value(rowx=i, colx=j), workbook.datemode).year > 2010:
                cll = xlrd.xldate.xldate_as_datetime(sh.cell_value(rowx=i, colx=j), workbook.datemode)
            else:
                raise TypeError
        except TypeError:
            try:
                # Теперь проверяем можно ли из этого сделать Int
                cll = int(sh.cell_value(rowx=i, colx=j))
            except ValueError:
                try:
                    # Теперь проверяем, можно ли из этого сделать Float
                    cll = float(sh.cell_value(rowx=i, colx=j))
                except ValueError:
                    # Если ничего не получилось, оставляем строкой
                    cll = str(cll)
        print(cll, type(cll))
</code>
Однако, я думаю этот код можно написать как нибудь проще, тем более, количество разных типов может увеличиться, и придется еще и еще увеличивать уровень вложенности. Подскажите, возможно ли как - нибудь проще реализовать проверку, в какой тип данных возможно преобразовать строковую переменную? Заранее спасибо всем за ответы.

Откройте для себя Pandas:

import pandas as pd

df = pd.read_excel("filename.xlsx")
print(df) # данные
print(df.dtypes) # типы данных столбцов

PS Pandas хорошо угадывает правильные типы данных столбцов для числовых и строковых данных. Для дат нужно указать список наименований столбцов, которые нужно парсить как дату/время:

df = pd.read_excel("filename.xlsx", parse_dates=[0,3,5]) # Pandas попытается спарсить столбцы 1, 4 и 6 как дату/время


Шаблон для регулярки из цифр и одного дефиса
Нужен шаблон для регулярного выражения, который ищет в списке номера из любого количества цифр и ровно одного дефиса в любом месте. Попробовала вот такое, но оно не работает
<code>
for i in list:
    reg = re.findall(r'\d+-{1}\d+', i)
</code>

Попробуйте такую регулярку:

^\d+-\d+$

Демо.
Объяснение:

^ - начало строки

\d+ - последовательность цифр в количестве от одной до бесконечности

- - символ дефиса

$ - конец строки


Помогите с разобраться с тестом)
Напиши программу для принтера
make_stickers, которая принимает число
details_count и строку
robot_part. Функция должна возвращать список строк в следующем формате:
{robot_part} detail #{n}.
Примеры:
если
make_stickers(3, 'Body') вернуть функция должна
['Body detail #1', 'Body detail #2', 'Body detail #3'].
Задачка по теме списки.
Hачало функции:

def make_stickers(details_count: int, robot_part: str) -> list:
    # write you code here

пока что все до чего додумался это

 res = '[]'
    for i in range(details_count):
        n = i + 1
        res = f"[{robot_part} detail #{n}]"
        return res
    if details_count == 0:
        return res

но дает только 1 результат Получено:
[Hand detail #1]

У вас ошибка в формате строки и возвращаете вы неправильно, нужно вернуть список
Исправил:

def make_stickers(details_count: int, robot_part: str) -> list:
    items = []
    for i in range(details_count):
        items.append(f"{robot_part} detail #{i+1}")
    return items

В одну строку:

    return [f"{robot_part} detail #{i+1}" for i in range(details_count)]


Выдаёт ошибку KeyError: 'simp'
Когда пишу команду rep то выдаёт эту ошибку, не понимаю как пофиксить. Облазил много сайтов, смотрел видео на ютубе, у всех всё работает, но так и не понял как это сделать. Ошибка >KeyError: 'simp'. Линкая пользователя, пишет эту ошибку.
<code>
class simpat(commands.Cog):
        def __init__(self,client):
            self.client = client

        os.chdir(r'C:\Users\Максим\Desktop\bot rune')

        @commands.Cog.listener()
        async def on_member_join(self,member):
            with open('users.json', 'r') as f:
                users = json.load(f)
            async def update_data(users, user):
                if not user.id in users:
                    users[user.id] = {}
                    users[user.id]['simp'] = 0

            await update_data(users,member)

            with open('users.json', 'w') as f:
                users = json.load(f)

        @commands.Cog.listener()
        async def on_message(self,message):
            with open('users.json', 'r') as f:
                users = json.load(f)

                async def update_data(users, user):
                    if not f'{user.id}' in users:
                        users[user.id] = {}
                        users[user.id]['simp'] = 0

                await update_data(users, message.author)

            with open('users.json', 'w') as f:
                json.dump(users, f)

        @commands.command(aliases = ['rep', 'симп'])
        async def _simpatia(self,ctx,member:discord.Member):
            with open('users.json', 'r') as f:
                users = json.load(f)
            async def update_data(users, user):
                users[user.id] = {}
                users[user.id]['simp'] += 1
            await update_data(users,member)

            with open('users.json', 'w') as f:
                json.dump(users, f)

    def setup(client):
        client.add_cog(simpat(client))
</code>

Ошибка должна быть тут
users[user.id]['simp'] += 1, т.к. чтобы инкрементировать значение из
'simp', его сначала нужно достать, пример:

users[user.id]['simp'] = users[user.id]['simp'] + 1

Вот тут работать будет, т.к. это только добавление/установка ключа:

users[user.id]['simp'] = 0

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

if 'simp' not in users[user.id]:
    users[user.id]['simp'] = 0
users[user.id]['simp'] += 1

Или через
get с значением по умолчанию:

users[user.id]['simp'] = users[user.id].get('simp', 0) + 1

Или через
defaultdict:

from collections import defaultdict
...

users[user.id] = defaultdict(int)
users[user.id]['simp'] += 1


Как работает overlaps в superwires?
Возникла проблема с пониманием метода overlaps в модуле superwires. Данный модуль используется для обучения по книге Майкла Доусона "Программируем на Python". И в процессе изучения я столкнулся с проблемой того что информации по этой функции крайне мало. Вопрос заключается в следующем, объявляя функцию внутри класса я должен ее указывать как self.overlaps передавая ей объект self и название класса с которым проверяю столкновения? Если так то вот код и он не работает так.
Вот два класса в которых я проверяю столкновения:
Класс блока
<code>
class Block(games.Sprite):

    image = games.load_image("Block.png")

    def __init__(self, x, y):

        super(Block, self).__init__(image = Block.image,
                                    x = x, y = y, is_collideable = True)

    def update(self):
        self.check_collision()

    """Проверка на столкновения, здесь и кроется проблема"""
    def check_collision(self):
        if self.overlaps(Pong()): #Вот здесь проблема, почему не срабатывает?
            self.destroy()

class Pong(games.Sprite):

    image = games.load_image("Ball.png")
    speed = 1

    def __init__(self):
        super(Pong, self).__init__(image = Pong.image,
                                   x = games.screen.width/2,
                                   y = 350, dx = Pong.speed, dy = Pong.speed,
                                   is_collideable = True)

    def __str__(self):
        return "Мяч для пинг-понга"

    def update(self):
        self.check_collision()
    def change_direction(self, side):
        if side == "bottom" or side == "top":
            self.dy = -self.dy
        elif side == "left" or side == "right":
            self.dx = -self.dx
    def check_collision(self):
        if self.x > games.screen.width or self.x < 0:
            self.change_direction("left")
        elif self.y < 0:
            self.change_direction("top")
        elif self.y > games.screen.height:
            game_over()

        for sprite in self.overlapping_sprites:
            if isinstance(sprite, Block):
                Player.score.value += 10
                if(self.top <= sprite.bottom and
                   self.top > sprite.x):
                    self.change_direction("bottom")
                elif(self.bottom < sprite.x and
                     self.bottom >= sprite.top):
                    self.change_direction("top")
                elif(self.right >= sprite.left and
                     self.right < sprite.y):
                    self.change_direction("left")
                elif(self.left >= sprite.right and
                     self.right < sprite.y):
                    self.change_direction("right")
            elif isinstance(sprite, Player):
                self.change_direction("top")
</code>
Если я правильно понимаю метод принимает два объекта и если они пересекаются то он возвращает True, но в моем случае шарик застревает в блоке и блок не уничтожается, то есть не происходит перехода в True. Когда я в скобках указываю self.overlaps(self, Pong()) то он выдает ошибку overlaps() takes 2 positional arguments but 3 were given. Объясните пожалуйста что я делаю не так, как этот метод работает и что ему нужно передавать?

if self.overlaps(Pong())

Таким образом вы создаёте новый объект
Pong и проверяете столкновение с ним. Это явно не то, что вам нужно. Скорее всего вам нужно создать управляющий объект более высокого уровня, который обычно называют
GameObject. И вот в этом объекте вы создаёте блоки и проверяете коллизии:

class GameObject():

    def __init__(self):

        self.blocks = [
            Block(x1, y1),
            Block(x2, y2),
            ...
        ]
        self.pong = Pong()

    def update(self):
        # возможно, тут ещё нужно сначала вызвать `update`
        # у всех блоков и у pong, я не уверен кто их вызывает
        # и затем проверить коллизии всех блоков с шариком
        for block in self.blocks:
            block.check_collision(self.pong)

Ну а внутри
block.check_collision уже проверяете так:

    def check_collision(self, pong):
        if self.overlaps(pong):
            self.destroy()

Как-то так должно всё получиться.


Работа с csv формирование таблиц Python
Час добрый!
Подскажите пожалуйста как можно сформировать  следующую таблицу при помощи Python?
Вижу примерно так (сама таблица):
<code>
            user_dump = {
                "Channel": title,
                "About": description,
                "Links": {
                    "link#1",
                    "link#2",
                },

                "video_links": {
                    "link#1",
                    "link#2",
                },

                "data": {
                    "data#1"
                    "data#2"
                },
                "video_description": {
                    "description#1"
                    "description#2"
                }
            }
</code>
Дальше ее просто наполнять на каждом новом проходе по каналам. Единственный вопрос, как записать список ссылок, чтобы в таблице они были каждая в новой строке, а не все в одной?

По-моему, проще всего здесь будет воспользоваться модулем Pandas.
Сначала надо будет подготовить данные в виде списка списков, чтобы получилась таблица:

data = [
  ["channel_name_1", "channel_description_1", "video1_link", "video1_date", "video1_desc"],
  ["channel_name_1", "channel_description_1", "video2_link", "video2_date", "video2_desc"],
  ["channel_name_1", "channel_description_1", "video3_link", "video3_date", "video3_desc"],
  ["channel_name_2", "channel_description_2", "video1_link", "video1_date", "video1_desc"],
  ["channel_name_2", "channel_description_2", "video2_link", "video2_date", "video2_desc"],
]

после этого можно создать Pandas DataFrame:

import pandas as pd

df = pd.DataFrame(data, columns=["channel","chnl_desc","video_link","video_date","video_desc"])

результат:

In [141]: df
Out[141]:
          channel              chnl_desc   video_link   video_date   video_desc
0  channel_name_1  channel_description_1  video1_link  video1_date  video1_desc
1  channel_name_1  channel_description_1  video2_link  video2_date  video2_desc
2  channel_name_1  channel_description_1  video3_link  video3_date  video3_desc
3  channel_name_2  channel_description_2  video1_link  video1_date  video1_desc
4  channel_name_2  channel_description_2  video2_link  video2_date  video2_desc

далее этот DataFrame можно сохранить в Excel файл:

df.set_index(["channel","chnl_desc"]).to_excel("result.xlsx")


Срабатывание else в цикле for
Даны два множества. В условии сказано, что если в этих множествах есть общие аргументы, то надо вывести их на экран, в противном случае, вывести
EMPTY. Не могу догадаться, почему не работает этот код.
else срабатывает всегда. Через
True тоже не сработало.

for i in list1 & list2:
    print(i)
else:
    print('EMPTY')

Можно и в одну строчку:
<code>
print(*list1 & list2 or ["EMPTY"], sep=" ")
</code>


Нужно вывести всю информацию и найти среднее значение зарплаты всех сотрудников
Создайте класс
Employee с параметрами:

name

age

salary

__init__(self,name, age, salary)

def printData() // Данная функция возвращает все данные работника.

Создайте 2 класса которые наследуют от класса
Employee:

    1 – Programmer

    programmingLanguage

__init__(self,name, age, salary, programmingLanguage)

Переопределите функцию
printData() , относительно их параметрам.
2 – DataAnalytics
databaseTool

__init__(self,name, age, salary, databaseTool)

Переопределите функцию
printData() , относительно их параметрам.
В основном классе вы должны создать несколько объектов класса Programmer, DataAnalytics и добавить их в общий список для Employee.
Нужно вывести всю информацию и найти среднее значение зарплаты всех сотрудников.

Вот, что сделал я:
1й файл:

class Employee:

    def __init__(self, name, age, salary):
        self.name = name
        self.age = age
        self.salary = salary

    def print_data(self):
        return "Employee => " + self.name + " " + str(self.age) + " " + str(self.salary)

class Programmer(Employee):

    def __init__(self, name, age, salary, programmingLanguage):
        super().__init__(name, age, salary)
        self.programmingLanguage = programmingLanguage

    def print_data(self):
        return "Programmer => " + self.name + " " + str(self.age) + " " + str(self.salary) + " " + self.programmingLanguage

class DataAnalytics(Employee):

    def __init__(self, name, age, salary, databaseTool):
        super().__init__(name, age, salary)
        self.databaseTool = databaseTool

    def print_data(self):
        return "DataAnalytics => " + self.name + " " + str(self.age) + " " + str(self.salary) + " " + self.databaseTool

2ой файл:

from employee import Employee, Programmer, DataAnalytics

e1 = Employee('Victor', 29, 200000)
p2 = Programmer('Alexandra', 24, 300000, 'Java')
d3 = DataAnalytics('Ben', 27, 400000, 'SQL')
print(e1.print_data())
print(p2.print_data())
print(d3.print_data())

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

Создаем функцию, принимающую список юзеров и в ней вызываем у каждого юзера
print_data и подсчитываем среднюю зарплату
Пример:

def print_all_data(users):
    for u in users:
        print(u.print_data())

    print()

    salaries = [u.salary for u in users]
    mean_salary = sum(salaries) / len(salaries)
    print(f'Средняя зарплата: {mean_salary}')

e1 = Employee('Victor', 29, 200000)
p2 = Programmer('Alexandra', 24, 300000, 'Java')
d3 = DataAnalytics('Ben', 27, 400000, 'SQL')
users = [e1, p2, d3]
print_all_data(users)

Результат:

Employee => Victor 29 200000
Programmer => Alexandra 24 300000 Java
DataAnalytics => Ben 27 400000 SQL

Средняя зарплата: 300000.0

PS.
Для большей читаемости кода, можно параметру функции
print_all_data указать тип, пример:

from typing import List

def print_all_data(users: List[Employee]):
    ...


Как сериализировать вложенный dict в python
Имеется список списков

params = {
    'foo': {1: 0},
    'bar': {2: 1}
}

необходимо преобразовать его в JSON, при этом сохраняя именно такой вид вложенности данных, т.к. в последствии этот список будет использоваться в UNIT-тесте для передачи через fastapi

params = {
    'foo': {44, 55},
    'bar': {baz[0].baz_id, 66}
}
fastapi_client.put('/some/url/is/here/', json=params)

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

TypeError: Object of type set is not JSON serializable

set в list переделай. написано же. у тебя пример это "список списков". а ниже у тебя "список" сетов.
Сеты нельзя, а можно листы:

params = {
    'foo': [44, 55],
    'bar': [baz[0].baz_id, 66]
}
fastapi_client.put('/some/url/is/here/', json=params)

а если ты все таки хотел "список списков" то двоеточие забыл

params = {
    'foo': {44: 55},
    'bar': {baz[0].baz_id: 66}
}
fastapi_client.put('/some/url/is/here/', json=params)

И замечу что в твоем случае "список списков" это на самом деле словарь словарей)


append() заменят элементы в списке, а не добавляет их
Есть код на Python

name_dict = {}

def thesaurus(*name):
    for i in name:
        first_vowel = i[0:1]
        name_dict[first_vowel] = []
        name_dict[first_vowel].append(i)
    print(name_dict)

thesaurus('Юлия', "Николай", "Юрий", "Сергей", "Никита", "Савелий")

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

{'Ю': ['Юрий', 'Юлия'], 'Н': ['Никита', 'Николай'], 'С': ['Савелий', 'Сергей']}

А получается это:

{'Ю': ['Юрий'], 'Н': ['Никита'], 'С': ['Савелий']}

Вместо того, чтобы добавить новый элемент в список, функция append() заменяет предыдущее значение с каждым новым циклом.
Хотелось бы понять причину этого явления, а заодно и получить правильный код.
P.S. Это мой первый вопрос на данном сайте, если я что-то сделал неправильно, не ругайте сильно!

Вот рабочий вариант:

def my_func(names: list) -> dict:
    name_dict = {}
    for name in names:
        name_dict[name[0]] = []
    for name in names:
        name_dict[name[0]].append(name)

    return name_dict

my_func(['Юлия', "Николай", "Юрий", "Сергей", "Никита", "Савелий"])

Ваша ошибка в том, что вы обнуляете список. Из за этого в него попадают только последние имена:

name_dict[first_vowel] = []
name_dict[first_vowel].append(i)


Как реализовать диалог между 2 пользователями через бота Телеграм
Как реализовать диалог между 2 пользователями через бота Телеграм Python.
Возможно использование библиотек PyTelegramBotAPI или AioGram.
Нужно чтобы пользователь заходил в бота, писал сообщение и оно отправлялось другому пользователю в чат бота. То есть, обычный чат, но с посредником в виде бота.
Если можно, то пример реализации или кода. Спасибо!

В самом начале придется получить и прописать в коде chat_id обоих собеседников, а дальше довольно просто.
<code>
user1_chat_id = "chat_id"
user2_chat_id = "chat_id"

@bot.message_handler(content_types=["text"])
def messanger(message):
    if message.from_user.chat_id == user1_chat_id:
        bot.send_message(user2_chat_id, message.text)
    else:
        bot.send_message(user1_chat_id, message.text)
</code>
Это что касается только текстовых сообщений, но можно тоже самое для остальных видов сообщений сделать


Как вывести ответ только в случае, когда a = 2, и b = 4 при максимальном i?
<code>
for i in range(0, 1000000):
    x = i
    a = 0
    b = 0
    while x > 0:
        if x % 2 == 0:
            a += 1
        else:
            b += x % 10
        x = x // 10
</code>

т.е. задача "найти натуральное число такое у которого 2 цифры чётные и сумма нечетных цифр равно 4"
очевидно что нечетные цифры - это или
1, 1, 1, 1 или
1, 3, таким образом максимально возможное число - это

881111

а касательно самого вопроса - идите с конца:

for i in range(1000000, 0, -1):
    x = i
    a = 0
    b = 0
    while x > 0:
        if x % 2 == 0:
            a += 1
        else:
            b += x % 10
        x = x // 10

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

ну или если чуть покороче :)

for i in range(1000000, 0, -1):
    a, b, x = 0, 0, i

    while x > 0:
        a, b, x = (a + 1, b, x // 10) if x % 2 == 0 else (a, b + x % 10, x // 10)

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


Парсер по данным
Имеется следующая таблица

import pandas as pd

data = {'id' : ['12', '13', '14'],
        'object' : ['[[[""], [""], [""]]]', '[[["13.21"], ["10.11"], ["11.01"]]]', '[[["3.1"], ["5.1"], ["7.1"]]]']}
data = pd.DataFrame(data)
data

Необходимо для каждого id вытащить из столбика object цифры или None.
Ожидаемый результат:

data = {'id' : ['12', '13', '14'],
        'ans1' : [None, 13.21, 3.1],
        'ans2' : [None, 10.11, 5.1],
        'ans3' : [None, 11.01, 7.1]}
data = pd.DataFrame(data)
data

Спасибо!


Заархивировать множество папок а также потом заархивировать корневую папку в python
Не могли бы подсказать как можно заархивировать при следующем сценарии.
Есть такая ирерархия файлов.
/ExamFolder/ содержит подпапки Test1Folder, Test2Folder, Test3Folder с различными файлами внутри каждой.
необходимо сделать zip архивы каждой Test1Folder.zip, Test2Folder.zip Test3Folder.zip а потом это положить в корневой архив ExamFolder.zip. Тем самым сначала зипуем подпапки индивидуально а потом это все в еще раз зипуем в главный архив.
пробовал функцию
<code>

    def zipfolder(foldername, target_dir):
        zipobj = zipfile.ZipFile(foldername + '.zip', 'w', zipfile.ZIP_DEFLATED)
        rootlen = len(target_dir) + 1
        for base, dirs, files in os.walk(target_dir):
            for file in files:
                fn = os.path.join(base, file)
                zipobj.write(fn, fn[rootlen:])

</code>
Но данная функйия при вызове архивирует только главную папку, а подпапки остаються в архиве не .zip.

Наверное можно сделать лучше и красивее, но я придумал такой вариант:
<code>
import zipfile
import os
import shutil

def zip_dir(path):
    os.mkdir("zip_tmp_dir")
    dir_name = os.path.split(path)[1]
    for _, dirs, _ in os.walk(path):
        for d in dirs:
            dr = zipfile.ZipFile(os.path.join("zip_tmp_dir", f'{d}.zip'), 'w', zipfile.ZIP_DEFLATED)
            for _, _, files in os.walk(os.path.join(path, d)):
                for file in files:
                    dr.write(os.path.join(path, d, file), os.path.join(d, str(file)))
            dr.close()

    main_zip_dir = zipfile.ZipFile(f'{dir_name}.zip', 'w', zipfile.ZIP_DEFLATED)
    for _, _, files in os.walk("zip_tmp_dir"):
        for file in files:
            main_zip_dir.write(os.path.join("zip_tmp_dir/", file), str(file))
    main_zip_dir.close()
    shutil.rmtree("zip_tmp_dir", True)

if __name__ == '__main__':
    zip_dir('test_1')
</code>


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

[10.10.2021, 10.10.2021, 11.10.2021, 12.10.2021]

Желаемый результат

[2,1,1]##

Код:

file_path="E://Jobs//pcap_data//Nan.pcap"
f = open(file_path, 'rb')
list_time = []
pc = dpkt.pcap.Reader(f)
for timestamp, packet in pc:
    list_time.append(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(timestamp)))

    new_list =[]
    for i in range(len(list_time)-1):
        new_list.append((list_time[i] == list_time[i+1]))
    new_list

Ответ:

    {[False,
     True,
     True,
     True,
     True,
     True,
     True,
     True,
     True,
     True,
     False,}


Нужен дискорд бот
Мне нужно чтобы бот "видел" реакцию :white_check_mark: в определённом канале. И если он "увидит" реакцию, то должен выдать роль. пишу на discord.py. Т.к новичок в работе с дискорд ботами не сильно знаю как это сделать.

...
@client.event
async def on_reaction_add(reaction, user):
  channel_id = '<id>' # замени на реальное айди
  if reaction.message.channel.id != channel_id:
      return
  if reaction.emoji == "✓":
      role = discord.utils.get(user.server.roles, name="<rolename>") # замени на настоящие имя роли
      await client.add_roles(user, role)
...


Разбиение данных на части заданного размера при записи
Пишу программу, которая разбивает текст на части по 10000 символов и записывает эти символы в файл.
Как сделать, чтобы автоматически создавались новые файлы и в них записывалось 10000 символов. Например, у меня текст в 40000 символов, я хочу его разбить на 4 файла по 10000 символов. Помогите, пожалуйста.
вот код:
<code>
count = 1
sim_count = 1
temp_sim = ""
with open("5815016.txt", "r") as file:
    temp = file.read()
for simvol in temp:
    temp_sim += simvol
    str(count)
    if sim_count >= 10000:
        with open("result/part.txt", "w") as file_write:
            file_write.write(temp_sim)
    count += 1
    sim_count += 1
</code>

Как вариант считать количество символов, и проверять, если оно кратно 10000, то создавать новый файл, и к названию прибавлять номер( я номером сделал результат деления количества символов на 10000), и по нужному срезу записывать строку в файл
<code>
count = 0
for simvol in temp:
    if count % 10000 == 0:
        with open("part.txt" + str(count // 10000), "w") as file_write:
                file_write.write(temp[count - 10000:count])
    count += 1
</code>


Ввод даты и времени с клавы
Задача "На ввод вам дан файл состоящий из пар временных отметок, для каждой последовательной пары отметок вам нужно подсчитать абсолютную разницу во времени в секундах"
Вводные данные (берутся из .txt):
<code>
Sun 10 May 2021 13:54:36 -0700
Sun 10 May 2021 13:54:36 -0000
Sat 02 May 2021 19:54:36 +0530
Fri 01 May 2021 13:54:36 -0000
</code>
Не могу понять как сделать ввод конкретно этой даты

Если не охота заморачиваться с маской для strptime то можно так.

from dateutil.parser import parse

text = 'Sun 10 May 2021 13:54:36 -0700'

print(parse(text))
# 2021-05-10 13:54:36-07:00
print(repr(parse(text)))
# datetime.datetime(2021, 5, 10, 13, 54, 36, tzinfo=tzoffset(None, -25200)

Но если прям очень захочется то:

from datetime import datetime

text = 'Sun 10 May 2021 13:54:36 -0700'

pattern = '%a %d %b %Y %X %z'

print(datetime.strptime(text, pattern))
print(repr(datetime.strptime(text, pattern)))

#2021-05-10 13:54:36-07:00
#datetime.datetime(2021, 5, 10, 13, 54, 36, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=61200)))

# UPD
from datetime import datetime

pattern = '%a %d %b %Y %X %z'

with open('data.txt', 'r', encoding='utf-8') as file:
    for line in file.readlines():
        print(datetime.strptime(line.strip(), pattern))
#2021-05-10 13:54:36-07:00
#2021-05-10 13:54:36+00:00
#2021-05-02 19:54:36+05:30
#2021-05-01 13:54:36+00:0

from datetime import datetime

pattern = '%a %d %b %Y %X %z'

with open('data.txt', 'r', encoding='utf-8') as file:
    dates = [
        *map(
            lambda x: datetime.strptime(x.strip(), pattern),
            filter(lambda x: bool(x.strip()), file.readlines())
        )
    ]

for f, s in zip(dates[::2], dates[1::2]):
    print(abs(int(f.timestamp() - s.timestamp())))

Datetime parsing patterns

Directive
Meaning
Example
Notes

%a
Weekday as locale’s abbreviated name.
Sun, Mon, …, Sat (en_US); So, Mo, …, Sa (de_DE)
(1)

%A
Weekday as locale’s full name.
Sunday, Monday, …, Saturday (en_US); Sonntag, Montag, …, Samstag (de_DE)
(1)

%w
Weekday as a decimal number, where 0 is Sunday and 6 is Saturday.
0, 1, …, 6

%d
Day of the month as a zero-padded decimal number.
01, 02, …, 31
(9)

%b
Month as locale’s abbreviated name.
Jan, Feb, …, Dec (en_US); Jan, Feb, …, Dez (de_DE)
(1)

%B
Month as locale’s full name.
January, February, …, December (en_US); Januar, Februar, …, Dezember (de_DE)
(1)

%m
Month as a zero-padded decimal number.
01, 02, …, 12
(9)

%y
Year without century as a zero-padded decimal number.
00, 01, …, 99
(9)

%Y
Year with century as a decimal number.
0001, 0002, …, 2013, 2014, …, 9998, 9999
(2)

%H
Hour (24-hour clock) as a zero-padded decimal number.
00, 01, …, 23
(9)

%I
Hour (12-hour clock) as a zero-padded decimal number.
01, 02, …, 12
(9)

%p
Locale’s equivalent of either AM or PM.
AM, PM (en_US); am, pm (de_DE)
(1), (3)

%M
Minute as a zero-padded decimal number.
00, 01, …, 59
(9)

%S
Second as a zero-padded decimal number.
00, 01, …, 59
(4), (9)

%f
Microsecond as a decimal number, zero-padded on the left.
000000, 000001, …, 999999
(5)

%z
UTC offset in the form
±HHMM[SS[.ffffff]] (empty string if the object is naive).
(empty), +0000, -0400, +1030, +063415, -030712.345216
(6)

%Z
Time zone name (empty string if the object is naive).
(empty), UTC, GMT
(6)

%j
Day of the year as a zero-padded decimal number.
001, 002, …, 366
(9)

%U
Week number of the year (Sunday as the first day of the week) as a zero padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0.
00, 01, …, 53
(7), (9)

%W
Week number of the year (Monday as the first day of the week) as a decimal number. All days in a new year preceding the first Monday are considered to be in week 0.
00, 01, …, 53
(7), (9)

%c
Locale’s appropriate date and time representation.
Tue Aug 16 21:30:00 1988 (en_US); Di 16 Aug 21:30:00 1988 (de_DE)
(1)

%x
Locale’s appropriate date representation.
08/16/88 (None); 08/16/1988 (en_US); 16.08.1988 (de_DE)
(1)

%X
Locale’s appropriate time representation.
21:30:00 (en_US); 21:30:00 (de_DE)
(1)

%%
A literal
'%' character.
%

Several additional directives not required by the C89 standard are included for convenience. These parameters all correspond to ISO 8601 date values.

Directive
Meaning
Example
Notes

%G
ISO 8601 year with century representing the year that contains the greater part of the ISO week (
%V).
0001, 0002, …, 2013, 2014, …, 9998, 9999
(8)

%g
ISO 8601 year without century as a zero-padded decimal number representing the year that contains the greater part of the ISO week (
%V).
01, 02, ..., 13, 14, ..., 98, 99

%u
ISO 8601 weekday as a decimal number where 1 is Monday.
1, 2, …, 7

%V
ISO 8601 week as a decimal number with Monday as the first day of the week. Week 01 is the week containing Jan 4.
01, 02, …, 53
(8), (9)


Как найти количество пар чисел среди списка, сумма которых кратна 117
Список состоит из 10000 чисел, каждое число не превышает 10000.
То, что я пытался, наверняка кардинально не правильно, но вот:
<code>
f = open('filename')
a = f.readlines()
a = list(map(int, a))

count = 0
for i in range(len(a) - 1):
    if (a[i] + a[i + 1]) / 117 == range(0, 100):
        count += 1
    print(count)
</code>

Для поиска количества пар любых чисел, а не только соседних, использовать вложенные циклы или составлять комбинации неоптимально. Воспользуемся тем свойством, что остаток от деления на Х суммы двух числе равен сумме остатков от деления каждого из этих чисел на Х. Т.е. нам нужно подсчитать количество разных остатков от деления на 117, и перемножить соответствующие пары.
<code>
from collections import Counter

f = open(file)
a = f.readlines()
a = list(map(int, a))

a_mod = [i % 117 for i in a] # список остатков от деления на 117

a_mod_dict = Counter(a_mod) # общее количество разных остатков

total = 0
for key in range(1,59):
    n1 = a_mod_dict[key]
    n2 = a_mod_dict[117-key]
    total += n1*n2

# учитываем числа, которые сами делятся на 117 без остатка
total += (a_mod_dict[0]*(a_mod_dict[0]-1)/2)

print(total)
</code>


Python - не работает удаление строки
Подскажите пожалуйста в чем проблема. Первые две функции - то есть чтение из файла и запись в него вроде работают, тут разобрался. Но никак не могу понять почему у меня не получается удаление, пробовал разные методы-результат плохой, либо удаляется все полностью после первой строчки, либо вообще все данные. Спасибо
<code>
import sys,time

data_base = ('adress_book_project.txt')
phone_book=[]
file = open('adress_book_project.txt')
file.close()

print('!!!It is your PhoneBook - you can check/add/del userdata. Or print exit!!!')
command=input('Enter command please -> ')
if command=='exit':
        print('Program Exit...')
        sys.exit()
elif command =='check':
        file=open(data_base,'r')
        line = file.read()
        if len(line)==0:
                print('File is empty...')
        else:
                print('<-Info from your Phonebook->')
                print(line)

elif command == 'add':
        file=open(data_base,'a')
        add_name=input('Please enter name -> ')
        add_phone=input('Please enter phone -> ')
        phone_book.append(add_name)
        phone_book.append(add_phone)
        print('Was added info... Name->',add_name,',phone->',add_phone)
        file.write((str(phone_book))+'\n')
        file.close()

elif command == 'del':
        delete=input('Please enter user name,it will be deleted -> ')
        file=open(data_base,'r')
        line = file.readline()
        if line !=delete:
                file=open(data_base,'w')
                file.write(line)
                print('Information about',delete,'was deleted')
        file.close()
else:
        print('Please enter the correct command...')

</code>

Попробуйте следующее (перед этим импортируйте библиотеку
fileinput):

import fileinput

elif command == 'del':
        delete=input('Please enter user name,it will be deleted -> ')
        for line in fileinput.input(data_base, inplace=True):
            if delete in line:
                continue
            print(line, end='')
else:
        print('Please enter the correct command...')


Вывести номера недель (год) в каждом периоде (месяц)
Есть цикл который выводит номера недель каждого месяца нужное количество раз.
И вот если к примеру, мы выберем начало недели - понедельник freq='W-MON', а месяц начинается не в понедельник. то цикл выводит номера недель с ПЕРВОГО ПОНЕДЕЛЬНИКА месяца, а нужно с номера недели куда попадает 01 число.
К примеру декабрь 2021г. начинается в среду - 48 неделя, НО цикл первой печатает 49 неделю, с 06.12.2021. - Это логично.
Но мне нужно что бы он показывал номер недели относящийся к промежуточным неделям. т.е что бы в декабре 2021 вывод начался с 48 неделе.
<code>
    # количество повторений
    n_repeat = 1
    # полученный период
    month_year = '11.2021'
    month_year = '01.' + str(month_year)
    month_year = datetime.strptime(month_year, '%d.%m.%Y')

    # Получаем первый и последний день месяца отчета
    first_day = pd.to_datetime(month_year).replace(day=1)
    last_day = (pd.to_datetime(first_day) + pd.offsets.MonthEnd()).date()

    for dt in pd.date_range(start=first_day, end = last_day, freq='W-MON').repeat(n_repeat).sort_values():
        datss = dt.date()
        print(datss.strftime('%W'))
        print(datss)#.strftime('%W')
</code>


Как обойти блокировку бота flood control RetryAfter в aiogram?
Пишу бота для телеграм, который кидает картинки в группу. Иногда происходит ситуация, что картинок много и бот выхватывает ошибку "flood control". Я понимаю, что можно обработать ошибку try:except или dp.error_handler и бот не прекратит работу, но при возникновении этой ошибки он и прекратит отправлять картинки на время указанное в сообщении.
Можно ли как-то предотвратить вызов этой ошибки, к примеру поставив asyncio.sleep(1) или больше по времени? Есть ли какой-то способ?
Часть кода:
<code>
...
for i in photo_list:
    photo = types.InputFile(i)
    try:
        await bot.send_photo(chat_id, photo=photo)
    except RetryAfter:
        await asyncio.sleep(1)
...
</code>

У исключения
RetryAfter есть поле timeout
Я бы сделал задержку на значение этого поля
Пример:

for i in photo_list:
    photo = types.InputFile(i)
    try:
        await bot.send_photo(chat_id, photo=photo)
    except RetryAfter as e:
        await asyncio.sleep(e.timeout)


Вызов функции из другой функции. Python
Мне нужно вызвать функцию, но есть одно "но"...
Вот код:

def accountMenu():
   def menu():
      'какой либо код'

Как мне вызвать функцию menu(), не вызывая её из функции accountMenu()?
Чтобы вы могли понять о чём речь, то попробую донести это вот так:
Я предполагал что может сработает вот это
accountMenu.menu(), но нет.
Я мог бы просто сделать вот так:

def accountMenu():
   def menu():
      'какой либо код'
    menu()
   'другой код который вызывать повторно нельзя'

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

Как вариант сделать
accountMenu классом, и внутри него объявить функцию
menu, но все равно это неправильно с точки зрения логики, и даже Python выдаст тебе предупреждение

class AccountMenu:
    def menu():
        return 'какой либо код'

print(AccountMenu.menu())