Разделить строку по заданным индексам
Простейшее задание, но поверхностный поиск не дал ответа, потому пришлось задавать вопрос.
Итак, у нас есть строка: "pythoniscool,isn'tit?"
есть список цифр: [6, 8, 12, 13, 18]
Необходимо разбить строку по индексам, указанным в списке:
["python", "is", "cool", ",", "isn't", "it?"]
Вот мое решение:
<code>
s = "pythoniscool,isn'tit?"
a = [6, 8, 12, 13, 18]
a = [0]+ a + [len(s)]
print([s[a[i]:a[i+1]] for i in range(len(a) - 1)])
</code>
уверен, что оно "некрасивое" и не оптимальное, может уважаемые пользователи подскажут еще?

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

import numpy as np
arr = ''.join(np.insert(np.array(list(s)), a, " ")).split()

arr:

['python', 'is', 'cool', ',', "isn't", 'it?']

но эти решения вряд ли будут более элегантными.


Вывести рамку с диагоналями из звездочек Python
Задано натуральное число n. Вывести квадратную рамку с диагоналями размера n*n из звездочек, как показано в примере.
Должно работать для n>=40

При n = 7:
Программа должна вывести:

*******
**   **
* * * *
*  *  *
* * * *
**   **
*******

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

n = int(input())
for i in range(1,n+1):
    if i == 1 or i == n:
        print("*" * n)
    else:
        if i == 2 or i == (n-1):
            print("*" + "*" + " " * (n-4) + "*"+"*")
        else:
            print("*" + " " * (i-2) + "*")

Вывод:
*******
**   **
* *
*  *
*   *
**   **
*******

Можно так сделать:
<code>
n = 40

for i in range(n):
    if i in (0, n-1):
        print('*'*n)
    else:
        print('*', end='')
        for j in range(1, n-1):
            print('*' if j in (i, n-i-1) else ' ', end='')
        print('*')
</code>


entity = Entity(pygame.Surface((100, 100))) TypeError: Entity() takes no arguments
<code>
import pygame

pygame.init()

W = 800
H = 600

screen = pygame.display.set_mode((W, H))

FPS = 60
clock = pygame.time.Clock()
font_path = 'mario_font.ttf'
font_large = pygame.font.Font(font_path, 48)
font_small = pygame.font.Font(font_path, 24)

game_over = False
retry_text = font_small.render('Нажмите любую клавишу', True, (255, 255, 255))
retry_rect = retry_text.get_rect()

retry_rect.midtop = (W // 2, H // 2)

class Entity:
    def _init_(self, image):
        self.image = image
        self.rect = self.image.get_rect()
        self.x_speed = 0
        self.y_speed = 0
        self.speed = 5
        self.is_out = False
        self.is_dead = False
        self.jump_speed = -12
        self.gravity = 0.5
        self.is_grounded = False

    def handle_input(self):
        pass

    def kill(self, dead_image):
        self.image = dead_image
        self.is_dead = True
        self.x_speed = -self.x_speed
        self.y_speed = self.jump_speed

    def update(self):
        self.rect.x += self.x_speed
        self.y_speed += self.gravity
        self.rect.y += self.y_speed

    def draw(self, surface):
        surface.blit(self.image, self.rect)

entity = Entity(pygame.Surface((100, 100)))

running = True
while running:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            running = False

    clock.tick(FPS)

    screen.fill((92, 148, 252))
    entity.update()
    entity.draw(screen)
    pygame.display.flip()
quit()
</code>

    def _init_(self, image):
        ^^^^^^

Entity() takes no arguments

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

    def __init__(self, image):


Воспрос не сложный, но я на нем застряд на 3 часа. Связан с if, elif и else
Нужно, чтобы слово "программист" склонялось к числам от 0 до 1000.  Например: 1 программист, 2 программиста, 5 программистов.
Я перепробовал казалось бы все, что можно, и конвертировать в строку и не делать этого и с "x % 10", но ничего не помогает. Буду безгранично благодарен за ответ и, если не сложно, за рекомендацию по поводу того, как нужно было правильно загуглить или сформулировать этот вопрос.
<code>
_count = int(input())
_str = str(_count)
lastStr = int(_str[-1:])

if lastStr == 1:
    print('программист')
elif lastStr == 2 or 3 or 4:
    print('программиста')
elif lastStr == 0 or 5 or 6 or 7 or 8 or 9:
    print('программистов')
</code>

У вас недоработана грамматика. Числительные с 11 по 14 (а также 111, 10013 и т.п.), хоть и оканчиваются на 1/2/3/4, но склоняться должны как "программистов". Т.е., логика должна быть несколько сложнее.

конструкция
_str[-1:] вернет срез, начинающийся с символа с индексом -1 (то бишь, последнего) и оканчивающийся символом с индексом 0, то бишь первым. Не находите, что это похоже не бред? Достаточно просто
_str[-1].


Как сделать интерактивную карту с маршрутами на Python
Мне нужно сделать карту, я знаю про folium и osmnx, но мне нужно, чтобы карта могла и офлайн работать.

Здраствуйте! Попробуйте Planet.osm


Если у вас в
y_pred есть индексы исходного датафрейма, то всё должно быть несколько проще:

df_to_predict.loc[y_pred.index, "stock_2021"] = y_pred


как запустить параллельную работу нескольких ботов на сервере при помощи systemd
При помощи systemd запустил работу бота телеграмм.
В файле bot.service путь для запуска ExecStart=/usr/bin/python3 /usr/local/bin/bot/main.py
Как сюда добавить еще одного бота? Приписать еще одну команду типа ExecStart = ? или нужно по другому сделать

Необходимо создать еще один файл systemd.service прописать в нем новый путь для запуска бота, далее прописать по очереди две команды systemctl daemon-reload и systemctl enable #имя бота.
Ну и запустить его systemctl start #имя бота


Перевести числа в обычную запись (К и М заменить на нули)
Числа записаны вот так К это 1000, М это 1000000

0        110.5M
1           77M
2        118.5M
3           72M
4          102M
          ...
18202       60K
18203       60K
18204       60K
18205       60K
18206       60K
Name: Value, Length: 18207, dtype: object

Как привести к обычным числам весь столбец?

def m_k(row):
        if 'M' in row:
            return ((row.str.replace("[^\d\.]", "", regex=True).astype('float'))*1000000)
        elif 'K' in row:
            return ((row.str.replace("[^\d\.]", "", regex=True).astype('float'))*1000)

так не получается

Вот рабочий вариант, переделанный из вашего:

import pandas as pd

def m_k(row):
        if 'M' in row:
            return float(row.replace("M", "")) * 1_000_000
        elif 'K' in row:
            return float(row.replace("K", "")) * 1_000

df = pd.DataFrame({'data': ['4.5M', '600K']})
print(df['data'].apply(m_k))

Вывод:

0    4500000.0
1     600000.0
Name: data, dtype: float64


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

    for i in [prices]:
    nick = [i][0][0]["data"][0]["advertiser"]["nickName"]

    print(nick)

Мне нужно вывести 500 имен. Если запустить код как есть, то выведется первое имя. А еще я могу сделать так:

    for i in [prices]:
    nick_1 = [i][0][0]["data"][0]["advertiser"]["nickName"]
    nick_2 = [i][0][1]["data"][0]["advertiser"]["nickName"]
    nick_3 = [i][0][2]["data"][0]["advertiser"]["nickName"]
    *******
    nick_500 = [i][0][499]["data"][0]["advertiser"]["nickName"]

    print(nick_1, nick_2, nick_3, .... nick_500)

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

так подойдет?
<code>
res = [[i][0][j]["data"][0]["advertiser"]["nickName"] for j in range(500)]
print(*res)
</code>


Ошибка IndexError: string index out of range программа переводит строку по типу '[7,1,15]' в числа 7, 1 и 15
подскажите, пожалуйста, где у меня ошибка в коде, программа переводит строку по типу '[7,1,15]' в числа 7, 1 и 15
<code>
val_preds[1] = [7, 1, 15]
s = str(val_preds([1]))
s = s.replace('[','')
s = s.replace(']','')
s = s.replace(',','')
array_of_numbers = []
i = 0
for t in range(3):
  st = ''
  while s[i] != ' ':
      st += s[i]
      i += 1
  i += 1
  array_of_numbers.append(int(st))

print(array_of_numbers)
</code>

проверку на выход за границу строки не сделали:

while i < len(s) and s[i] != ' ':

кстати ваш код мог бы выглядеть так:

s = str([7, 1, 15])

array_of_numbers = list(map(int, s[1:-1].split(', ')))

или так (но тут аккуратнее надо быть):

import re

array_of_numbers = list(map(int, re.findall(r'\d+', s)))

или так:

import json

array_of_numbers = json.loads(s)

или так:

import ast

array_of_numbers = ast.literal_eval(s)


Как сделать анимацию времени в python?
Задача такая: сделать так, что бы время на python каждую секунду менялось.
Как это сделать через модуль time?
Есть такой код:

import time

a = time.ctime()
print("Текущее время: ", a)

Но он выводит текущее время, не меняя его

Текущее время:  Thu Oct 13 21:18:18 2022

Помогите чем сможете

import time

while True:
    a = time.ctime()
    print("Текущее время: ", a, end='\t\r', flush=True)
    time.sleep(1/24)


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

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

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

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

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

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя

tio.run
<code>
for s in ["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"]:
  print(s)
</code>


Закрашивание дат в QCalendarWidget?
Всем привет, у меня такой вопрос.
У меня дан список дат, к примеру

['2022-10-05', '2022-10-13',  '2022-10-14',  '2022-10-15']

Как мне их закрасить в календаре?

from PyQt5.QtWidgets import QWidget, QApplication, QListWidgetItem, QMessageBox, QCalendarWidget
from PyQt5.uic import loadUi
from PyQt5 import QtCore

import sys
import tmp

class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        loadUi("main.ui", self)

        self.calendarWidget.selectionChanged.connect(self.calendar_date_changed)
        self.calendar_date_changed()
        self.saveButton.clicked.connect(self.save_changes)
        self.addButton.clicked.connect(self.add_new_task)

    def calendar_date_changed(self):
        dateSelected = self.calendarWidget.selectedDate().toPyDate()
        self.update_task_list(dateSelected)

    def update_task_list(self, date):
        self.tasksListWidget.clear()

        user_id = 0
        if (str(user_id) in tmp.read()["data"]["tasks"].keys()) and (str(date) in tmp.read()["data"]["tasks"][str(user_id)].keys()):
            results = tmp.read()["data"]["tasks"][str(user_id)][str(date)]
            for key in results.keys():
                item = QListWidgetItem(key)
                item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
                if results[key] is True:
                    item.setCheckState(QtCore.Qt.Checked)
                elif results[key] is False:
                    item.setCheckState(QtCore.Qt.Unchecked)
                self.tasksListWidget.addItem(item)

    def add_new_task(self):

        user_id = 0
        task = str(self.taskLineEdit.text())
        date = self.calendarWidget.selectedDate().toPyDate()
        stat = False
        tmp.add_task(user_id, date, task, stat)
        self.update_task_list(date)
        self.taskLineEdit.clear()

    def save_changes(self):
        user_id = 0
        date = self.calendarWidget.selectedDate().toPyDate()

        for i in range(self.tasksListWidget.count()):
            item = self.tasksListWidget.item(i)
            task = item.text()
            if item.checkState() == QtCore.Qt.Checked:
                tmp.edit_task_status(str(user_id), date, task, True)
            else:
                tmp.edit_task_status(str(user_id), date, task, False)

        messageBox = QMessageBox()
        messageBox.setText("Changes saved.")
        messageBox.setStandardButtons(QMessageBox.Ok)
        messageBox.exec()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec())

Вы должны унаследовать от
QCalendarWidget и перезаписать метод
paintCell,
эта функция имеет 3 параметра:

painter - это
QPainter, который помогает нам рисовать,

rect - это
QRect, который является прямоугольником, который представляет ячейку,

date - это
QDate, которая дает нам информацию даты, связанной с ячейкой.

import sys
from PyQt5.QtCore    import Qt, QRectF
from PyQt5.QtGui     import QPainter, QFont, QColor
from PyQt5.QtWidgets import QCalendarWidget, QApplication

class CalendarWidget(QCalendarWidget):

    def paintCell(self, painter, rect, date):
        painter.setRenderHint(QPainter.Antialiasing, True)

        _date = '{}-{:02}-{:02}'.format(* date.getDate())
        if _date in  ['2022-10-05', '2022-10-13',  '2022-10-14',  '2022-10-15']:
            painter.save()
            painter.drawEllipse(rect)
            painter.setPen(QColor(208, 34, 3))
            painter.setFont(QFont('Decorative', 12))
            painter.drawText(QRectF(rect), Qt.TextSingleLine|Qt.AlignCenter, str(date.day()))
            painter.restore()
        else:
            QCalendarWidget.paintCell(self, painter, rect, date)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = CalendarWidget()
    w.resize(330, 300)
    w.show()
    sys.exit(app.exec_())

Пожалуйста, ВСЕГДА предоставьте минимальный воспроизводимый пример, который демонстрирует проблему.


Подсчет суммы длин между пунктами на графе
сделал программу, которая считает количество путей на графе из точки 1 в точку N через точку M. Попробовал изменить ее чтобы вместо количества путей считалось расстояние, но у меня не вышло. Расстояние между точками всегда = 1. Граф ориентированный. Начав движение из какого-либо пункта, невозможно вернуться назад в тот же пункт. Может ли кто-то предложить свое решение для данной задачи, чтобы вместо количества путей считалось сумма длин путей?
N - количество городов
M - количество дорог.
Далее вводятся сами дороги, например, дорога из 1 города во город 2 записывается как 1 2
Программа ниже считает количество путей
<code>
def ways(start,end,karta,zapret):
    if start in zapret: return 0
    if start==end: return 1
    r=0
    for i in range(len(karta[start])):
        r += ways(karta[start][i],end,karta,zapret)
    return r

a = {}
n,m = map(int, input().split())
for i in range(m):
    start, end = map(int, input().split())     #Делаю словарь
                                             #(ключ - город, значение - в какие города можно попасть из города start
    if str(start) in a.keys():
        s = str(end)
        d_elements = a.get(str(start))
        if int(s) > int(d_elements):
            s = str(d_elements) + s
        else:
            s += str(d_elements)
        del a[str(start)]
        a[str(start)] = s
    else:
        a[str(start)] = str(end)
    sorted_a = sorted(a.items(), key=lambda x: x[0])
    a = dict(sorted_a)

for i in range(1,n+1):
    print((ways('1',str(n),a, '') - ways('1',str(n),a,str(i))))
</code>

Выполняете два поиска в ширину или глубину. Один из вершины 1 до вершины M, второй из вершины M до вершины N.
При поиске передаёте аргумент - пройденное расстояние от начала поиска, на следующий уровень передавать расстояние+1.
Нашли целевую вершину - в общий результат добавляете пройденный путь.
Примерно так (учитывая, что граф по условию ацикличен):
<code>
def ways(start,end,karta, distance):
    if start==end:
        global summa
        summa += distance
        return
    for i in range(len(karta[start])):
        ways(karta[start][i],end,karta,distance+1)
</code>


Как в порядке исключить числа кратные 3?

Ввести с клавиатуры целое число n.
Получить сумму кубов всех целых чисел от 1 до n(включая n).
Исключения составляют все числа кратные цифре 3.
Реализовать в 2-х вариантах: используя цикл while и цикл for

<code>
value = 1
num = int(input("Число: "))
for item in range(value, num +1):
   print(item)
result = sum(item ** 3 for item in range(value, num + 1))
print(result)
</code>
Как в этом порядке исключить числа кратные 3?

Вариант:
<code>
value = 1
result = 0
num = int(input("Число: "))

for item in range(value, num+1):
    if item % 3 != 0:
        result += item ** 3

print(f'Res: {result}')

result = 0
while num > 0:
    if num % 3 != 0:
        result += num ** 3
    num -= 1

print(f'Res: {result}')
</code>
Число: 6
Res: 198
Res: 198


Не понятно, как работать с циклом в Python
Помогите пожалуйста с простейшей задачей ♥
Дан список q, например,
q = [0, 196, 2, 6, 25, 2]
Нужно создать список Q, в котором все элементы, начиная с
Q[2], определяются по формуле:

Q[i] = q[i]*Q[i-1]+Q[i-2]
а первые два элемента
Q[0] = 1, Q[1] = 0.
Заполнять список Q нужно до тех пор, пока его крайний элемент не станет равен некому f.
Казалось бы, все просто, но ни черта не работает. Я попробовала написать так:

f = 131040
q = [0, 196, 2, 6, 25, 2]
Q = [1,0]
while Q[i] != f:
  for i in range (2,100000):
    Q[i] = q[i]*Q[i-1]+Q[i-2]

Пишет list assignment index out of range и еще много очевидных вещей. Я не знаю, как реализовать это иначе, хелп
P.S. я не являюсь программистом


Оптимизация кода подсчета вхождений
Создаю из списка словарь с подсчетом вхождений. Можно ли этот код преобразовать в одну строку?
<code>
nums = [9,4,9,8,4,9]
ndict = {}

for i in nums:
    if i not in ndict:
        ndict[i] = 1
    else:
        ndict[i] += 1

print(ndict)
</code>
на выходе получаем:
{9: 3, 4: 2, 8: 1}

вариант 1:

ndict = {}

for i in nums:
    ndict[i] = ndict.get(i, 0) + 1

вариант 2:

ndict = {}

for i in nums:
    ndict[i] = ndict.setdefault(i, 0) + 1

вариант 3:

import collections

ndict = dict(collections.Counter(nums))

вариант 4:

ndict = dict().fromkeys(nums, 0)

for i in nums:
    ndict[i] += 1

вариант 5:

ndict = {}

for i in nums:
    ndict[i] = nums.count(i)

вариант 5.1:

ndict = {i: nums.count(i) for i in nums}

вариант 5.2:

ndict = {i: nums.count(i) for i in set(nums)}

вариант 6:

ndict = dict(zip(nums, map(nums.count, nums)))


Итерация по Б-дереву
В моем дереве находится структура данных и мне нужно реализовать поиск по определенному полю, для чего надо пройтись по всему дереву. Функция поиска просто игнорирует одну из веток
<code>
class _Node:
    def __init__(self, is_leaf=False):
        self.is_leaf = is_leaf
        self.keys = []
        self.child = []

class BTree:
    def __init__(self, t=2):
        self.root = _Node(True)
        self.t = t  # defines the range for number of keys

    def search_by_record_book(self, value, node):
        for i in range(len(node.keys)):
            #print(node.keys[i].record_book)
            if value == node.keys[i].record_book:
                print("Node was found:", node.keys[i])
                return
            # elif node.is_leaf:
            #     return self.search_by_record_book(value, node.child[i])
        if len(node.child) > 0:
            for x in node.child:
                return self.search_by_record_book(value, x)

</code>

или делаете

arr = [key for key in i.record_book]

или используете i как индекс

for i in range(len(node.keys)):

но при этом нельзя менять переменную цикла внутри него же (
i += 1), и вам, вероятно, требуется

arr = [key for key in node.keys[i+1].record_book]


Можно ли через python скрипт запустить с++?
Мне нужно запустить из питоновского (который потом будет ехешным) скрипта скрипт на с++
Это как ни будь можно сделать?
может можно как то сделать срр в ехе с помощью смд?
пример:
starter_cpp.py :

def start_cpp_script():
    ...

start_cpp_script('hello.cpp')
#и запускается hello.cpp

hello.cpp :

#include <iostream>

int main() {
    std::cout << "Hello World!";
    return 0;
}

Вы можете пойти несколькими путями:

Создать динамическую библиотеку и использовать методы/классы из нее в python (примеры тут и тут)
Скомпилировать с++ exe и запустить его из python с помощью subprocess (примеры тут и тут)

cpp в exe можно с помощью компилятора g++, например. Либо у Вас уже есть установленный Visual Studio / QtCreator / CodeBlocks ... которые предоставляют возможность установить компилятор при установке IDE.
Если же у Вас ничего из этого нет, то вот гайд
по шагам на все платформы
Дальше Вы уже сможете найти в интернете как им пользоваться. Дерзайте, и Вы все осилите)


django registration redux не работает почта
setting.py

ACCOUNT_ACTIVATION_DAYS= 7
REGISTRATION_AUTO_LOGIN= True

LOGIN_REDIRECT_URL= '/home'

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = ''
EMAIL_PORT = '587'
EMAIL_USE_TLS = True

EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''

urls.py

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

urlpatterns = [
    path(r'^admin/', admin.site.urls),
    path(r'^accounts/', include('registration.backends.default.urls')),
    path(r'^blog/', include('blog.urls')),
]

почта прихожит от webmaster@localhost хотя SMTP настроен, почта стоит на домене. Как сделать чтобы сообщения приходили с моей почты?

Надо в конце файла добавить DEFAULT_FROM_EMAIL = 'email' где email это ваша корпоративная почта


Не могу перезаписать сообщение telegram bot aiogram
Система должна работать так:
При нажатии на /start должно появиться сообщение "Обратный отсчёт до нового года, господа."
После одной или более секунд оно должно отредактироваться и каждую секунду обновляться с текстом:
До нового года: столько-то времени осталось.
Не могу понять, как сделать.
<code>
from aiogram import Bot, Dispatcher, types
import datetime
import asyncio
import time

bot = Bot(token='mytoken')
dp = Dispatcher(bot)

@dp.message_handler(commands=["start"])
async def cmd_start(message: types.Message):
    message1 = bot.send_message(message.from_user.id, "Обратный отсчёт до нового года, господа.")
    while True:
        time.sleep(1)
        now = datetime.datetime.today()
        NY = datetime.datetime(2023, 1, 1)
        d = NY-now
        mm, ss = divmod(d.seconds, 60)
        hh, mm = divmod(mm, 60)
        bot.edit_message_text("До нового года: {} д. {} ч. {} м. {} с.".format(d.days, hh, mm, ss), message.from_user.id)

async def main():
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())

</code>

Вам нужно добавить
await в свою функцию, а также
message_id в метод
edit_message:

from aiogram import Bot, Dispatcher, types
import datetime
import asyncio
import time

bot = Bot(token='mytoken')
dp = Dispatcher(bot)

@dp.message_handler(commands=["start"])
async def cmd_start(message: types.Message):
    message1 = bot.send_message(message.from_user.id, "Обратный отсчёт до нового года, господа.")
    # !!!
    mesagge_object = await message1
    # !!!
    while True:
        time.sleep(1)
        now = datetime.datetime.today()
        NY = datetime.datetime(2023, 1, 1)
        d = NY - now
        mm, ss = divmod(d.seconds, 60)
        hh, mm = divmod(mm, 60)
        await bot.edit_message_text(
            "До нового года: {} д. {} ч. {} м. {} с.".format(d.days, hh, mm, ss),
            # !!!
            message_id=mesagge_object.message_id,
            # !!!
            chat_id=message.from_user.id,
        )

async def main():
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())

P.S.: Рекомендую поподробнее ознакомиться с корутинами в документации.


Импортировать библиотеку NLTK и тексты из электронного архива текстов Project Gutenberg
Вот как я загрузил или импортировал необходимый текстовый файл. Я просто не понимаю, как с ним работать.
<code>
from nltk.corpus import gutenberg
import nltk

nltk.download('gutenberg')

brown1 = gutenberg.fileids()
print(brown1)
</code>
Мне нужно обработать текстовый файл chesterton-brown.txt.
Определите количество слов в тексте.
Определите 10 наиболее часто употребляемых слов в тексте, постройте по этим данным гистограмму.
Удалить из текста стоп-слова и пунктуацию, снова найти 10 наиболее часто употребляемых слов в тексте и построить на их основе гистограмму.
Я хотел бы видеть текст, который я обрабатываю, я видел следующую функцию, используемую для этого brown = gutenberg.words('chesterton-brown.txt') Но она возвращает 6 слов, действительно ли в этом файле 6 слов?
Также для определения 10 наиболее используемых слов мне нужно провести токенизацию, насколько я понимаю, затем удалить стоп-слова и сделать это снова. Но я не понимаю, как присвоить содержимое текстового файла переменной для выполнения этих операций. В общем, тема показалась мне очень сложной, и поиск информации не дает мне большего понимания. Было бы здорово, если бы кто-нибудь рассказал мне, как это вообще работает, какие функции лучше использовать.

В документе chesterton-brown.txt не 6 слов.
Полный текст можно увидеть, например, так:
<code>
from nltk.corpus import gutenberg
import nltk

nltk.download('gutenberg')
words = []
for i in gutenberg.words('chesterton-brown.txt'):
    words.append(i)
print(' '.join(words))
</code>
Насчёт выполнения задания вы все верно пишете: токенизация, удаление стоп-слов. Возможно, после этого следует ещё сделать стемминг или лемматизацию, т.е. привести слова к одной форме, иначе разные формы слов у вас будут считаться как разные слова.
По поводу функций вам лучше смотреть документацию и примеры кода.
По nltk есть целая книга для Питона. Там всё очень подробно расписано с примерами кода. В том числе под ваши задания там всё есть (например, 2 глава).
Книга по nltk
Также есть перевод статьи, где описаны основные функции с примерами кода, в том числе для вашего задания.
Перевод статьи
Код из этой статьи есть в оригинальной статье: Оригинал статьи


Помогите ускорить задачу на Python. Конный забег
ит три целых числа N, M и K — количество лошадей, количество смен позиций,
Вот мой код, делает довольно медленно, подскажите, пожалуйста, что нужно изменить в алгоритме, чтобы задача решалась быстро. Можно использовать NumPy.
<code>
def swap(index_fg, index_sg):
    h = a[index_fg]
    a[index_fg] = a[index_sg]
    a[index_sg] = h

n, m, k = map(int, input().split())
a = [i for i in range(1,n+1)]
for _ in range(m):
    f = False
    fg, sg = map(int, input().split())
    swap(a.index(fg),a.index(sg))
    for j in range(len(a)):
        if abs(a[j] - (j + 1)) > k:
            f = True
            print('1')
            break
    if f == False:
        print('0')
</code>

Не уверен, но я бы как-то так делал
<code>
def check(old, new, k):
    """
    Проверяем, происходит ли при замене изменение числа лошадей, поддерживающих интерес
    """
    if (abs(old) <= k) and (abs(new) > k):
        return 1
    elif (abs(old) > k) and (abs(new) <= k):
        return -1
    return 0

n, m, k = map(int, input().split())
a = [i for i in range(n)]

interes = 0

for _ in range(m):
    fg, sg = map(int, input().split())
    # для простоты кода будем работать в python'овских индексах
    fg -= 1
    sg -= 1
    interes += check(a[fg]-fg, a[sg]-fg, k)
    interes += check(a[sg]-sg, a[fg]-sg, k)
    a[fg], a[sg] = a[sg], a[fg]
    # interes - число лошадей в "интересной позиции"
    print(int(bool(interes)))
</code>


Как разрешить вводить неопределённые данные input в python?
Нужно сделать код, в котором пользователь будет выбирать сервис, с которым будет работать, например, StuckOverflow:
<code>
A = input("Что выбираете? [StuckOv./YouTube]: ")
</code>
Нужно, что бы пользователь мог не вводить полностью название сервиса, а сокращать (Ст.Ов/St.Ov), или, например, "по-русски" написать сервис (Ютуб, стаковерфлоу), и желательно, что бы на регистр тоже не обращалось внимания. При этом, если он напишет другой сервис (Гитхаб, например), то программа выводила ошибку. Возможно ли сделать это? Или придётся делать словарь определённых слов?

Чтобы не мучать пользователя предлагаю реализовать как меню:
<code>
print("Сервис:")
print("1. StuckOv")
print("2. YouTube")
A = input("Что выбираете? : ")
</code>
тут уже обрабатывать введённое значение 1 или 2 иначе - ошибка


Почему переменная "k" не принимает новые значения? Почему со второго цикла переменная становится постоянной?
Задача: Получить список, в моём случае [5,3,2,2].
Проблема: Проблема с переменной k, которая после второго цикла становится постоянной.
Вопросы: Можно ли исправить положение переменной k так чтобы я получил вышеизложенный список?
Пожелание: Какую информацию почитать чтобы такой ошибки больше не было?
Исходный код:
<code>
a = [2,3,5,7]
c = []
n = 50
while len(a) != 0:
    b = a[0]
    k = 0
    while b <= n:
        k = k + 1
        n = n // b
    print(k)
    del a[0]
    c.append(k)
    print("")
print(c)
</code>
Если код фигня, то предложите свой более правильный.
Заранее Благодарю !

Ошибка не в
k ошибка в
n. Т.к после первого выполнения второго
while
n = 1, и так до окончания всех циклов, необходимо былло ввести дополнительную переменную.
Я ввел новую переменную
z  и у меня всё получилось.
Вот правильный код:

a = [2,3,5,7]
c = []
n = 50
while len(a) != 0:
    b = a[0]
    k = 0
    z = n
    while b <= z:
        k = k + 1
        z = z // b
    del a[0]
    c.append(k)
print(c)

Таким образом посмотрел на код со стороны и нашел проблему)


Несанкционированное удаление содержимого файла - aiofiles (асинхронная работа с Json)
Код:

import json
import typing as t

import ramda
import aiofiles

async def update(file_name: str, keys: list, new_value: t.Any) -> None:
    async with aiofiles.open(f"{file_name}.json", "r") as file:
        data = await file.read()

    async with aiofiles.open(f"{file_name}.json", "w") as file:
        await file.write(
            json.dumps(
                ramda.assoc_path(keys, new_value, json.loads(data)),
                indent=4
            )
        )

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

Необходимо прочитать содержимое файла и сохранить в переменную
data.

{
    "key": "value",
    "key2": "value2",
    "ke3": "value3"
}

Дальше, полученный словарь в виде строки
'{"key": "value"}' преобразуется в словарь.

json.loads(data)  # -> {'key': 'value'}

Изменение значения на новое.

ramda.assoc_path(keys, new_value, json.loads(data))  # new_value допустим заменяется на True

Преобразование в формат для записи в файл.

json.dumps(
    ramda.assoc_path(keys, new_value, json.loads(data)),
    indent=4
)  # -> '{\n    "key": true\n}'

Содержимое файла обнуляется, он просто становится пустым. Из-за этого выдаёт ошибку
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) в строке с ramda.assoc_path() + перед тем как эта ошибка вылезает, в блоке кода где читается файл возвращается пустая строка.
Всё это происходит спонтанно. То есть, это решение может работать без перебоев несколько минут, но потом внезапно плюнуть ошибкой и удалить содержимое.

Решил эту проблему не решая её. Перенёс всю работу в SQLite. Хотя с этой ошибкой при работе с файлами до сих пор непонятно.
Теперь (получение значение):

Значение в ключевой колонке (и некоторые другие дополнительные данные) передаются модулю для работы с базой данных;
Если имя колонки совпадает с именем той, где храниться Json (в данный момент в качестве строки), значение парсится и преобразуется в словарь, возможно как-то изменяясь.

Обновление информации по тому же принципу.
Скорее всего, в SQLite есть встроенные возможности для работы с Json, про это ещё почитаю и если что перепишу, пока что так.
UPD:
Поскольку асинхронность требуется чтобы работать с данными использующимися в процессе работы Discord бота, соответственно ничего не блокируя, я буду использовать MongoDB, а Json для хранения настроек. Я думаю так надёжней.


Задача в python
<code>
autoshop1 = {
'BMW': [5000],
'Kia': [6500],
'Lada': [2000],
'Ford': [3000],
'Skoda': [4200],
'Audi': [6700],
'Honda': [2500],
'Mazda': [3600],
'Renault': [8800],
'Toyota': [5350]
 }
autoshop2 = autoshop1.copy()
price_list = []
min_price = 0
for price_year_list in autoshop2.values():
      price_list.append(price_year_list[0])
min_price = min(price_list)
for key_name_car, price_year_list in list(autoshop2.items()):
      if price_year_list[0] == min_price:
del autoshop2[key_name_car]
else:
      price_year_list[0] = round(random.uniform(1000, 25500))
autoshop2.update({'Volkswagen': [55555]})
print(autoshop2)`
</code>
Сделал все, никак не получается решить последний вопрос: реализует функцию, которая по введенной марке автомобиля выводит название магазина, в котором этот автомобиль дешевле и его цену в этом магазине.

В оригинальном коде ничего не менял, кроме
copy на
deepcopy (иначе цены во всех магазинах на одинаковые марки всегда будут равны) - см. поверхностное и глубокое копирование объектов, а также отступов
del...else.
Комментарии в коде.

import random
from copy import deepcopy

autoshop1 = {
    'BMW': [5000],
    'Kia': [6500],
    'Lada': [2000],
    'Ford': [3000],
    'Skoda': [4200],
    'Audi': [6700],
    'Honda': [2500],
    'Mazda': [3600],
    'Renault': [8800],
    'Toyota': [5350]
}
autoshop2 = deepcopy(autoshop1)
price_list = []
min_price = 0
for price_year_list in autoshop2.values():
    price_list.append(price_year_list[0])
min_price = min(price_list)
for key_name_car, price_year_list in list(autoshop2.items()):
    if price_year_list[0] == min_price:
        del autoshop2[key_name_car]
    else:
        price_year_list[0] = round(random.randint(1000, 25500))
autoshop2.update({'Volkswagen': [55555]})
print(autoshop2)

# новый код
shops = {'Железный конь': autoshop1, 'Эх, прокачу': autoshop2} # создаем словарь с магазинами, а не список, чтобы оперировать с названиями магазинов
marka = input('Введите марку: ')
min_price, min_shop = None, '' # задаем стартовые значения минимальной цены и дешевого магазина
for shop, models in shops.items(): #перебираем магазины
    # если марки нет в текущем магазине, переходим к следующему
    # если есть и цена не инициализирована (None), инициализируем первой попавшейся ценой на марку
    # если есть и цена инициализирована, сравниваем и, если она меньше, чем ранее, запоминаем цену и магазин
    if marka in models and (min_price is None or models[marka][0] < min_price):
        min_price, min_shop = models[marka][0], shop
if min_price is not None: # если цена была инициализирована, то такая марка была найдена, выводим
    print(f'Автомобиль `{marka}` дешевле всего в `{min_shop}`: {min_price}')
else: # иначе сообщаем, что поиск неудачен
    print(f'Автомобиля `{marka}` нет ни в одном из магазинов: {"; ".join(shops.keys())}')


Как оптимизировать процесс упаковки битов в байты на python?
Дано: Длинная байтовая последовательность, количество байтов в которой кратно 8.
Необходимо: Из каждого байта выделить старший бит и получившуюся последовательность упаковать в новый массив в виде байтов.
Используемое решение:
<code>
import struct

bar = b'\xa0\x74\x80\x4a\xd0\x69\xd1\x2f' * 100000
foo = []
for i in range(0, len(bar), 8):
    temp = ''
    for j in range(0, 8, 1):
        temp += str((bar[i + j] >> 7) & 0b1)
    foo.append(struct.pack('B', int(temp, 2)))
</code>
Проблема: Введение строковой переменной для сбора битов, как мне представляется, не лучшим образом влияет на время исполнения кода ввиду действительно большого количества данных (пример кода упрощен, в реальной задаче речь идет о гигабайтах информации).
Вопрос: Как это можно реализовать без "костыля" в виде строковой переменной для ускорения выполнения кода?

а почему бы не продолжить работать с числами?

foo = []
for i in range(0, len(bar), 8):
    temp = 0
    for j in range(8):
        temp = temp * 2 + (bar[i + j] >> 7 & 0b1)
    foo.append(temp)

ну или так:

foo = [sum((bar[i + j] >> 7 & 0b1) * 2**j for j in range(8)) for i in range(0, len(bar), 8)]


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

Один из вариантов.

Делаем выстрел, запоминаем время - t1
Узнаем текущее время - t2
Если t2 - t1 > интервала, стреляем, если меньше не стреляем.
И так в цикле.


Сделать static метод, который распарсит строку в Python
Необходимо создать статический метод some_string(), который распарсит строку и присвоит содержащие атрибуты нужным свойствам. Свойства будут разделены тире.
<code>
class Employee:

    def __init__(self, firstname, lastname, salary):
        self.firstname = firstname
        self.lastname = lastname
        self.salary = salary

    @staticmethod
    def some_string(parse_stirng):
        firstname, lastname, salary =  parse_stirng.split("-")
        return firstname, lastname, salary

emp1 = Employee("Sam", "Ragnarson", 35000)
print(emp1.firstname)
print(emp1.salary)

emp2 = Employee("Sam", "Ragnarson", 35000)
print(emp2.from_string("Mary-Steve-40000"))
</code>
Результат кода должен быть следующим:
emp1.firstname ➞ "Sam"
emp1.salary ➞ 35000
emp2.firstname ➞ "Mary"
emp2.lastname ➞ "Steve"
Не могу разобраться как из статического метода присвоить со строки соответствующие значения в свойства экземпляра класса firstname, lastname, salary ведь static существует вне зависимости от класса и объекта класса.

Подобный статический метод должен создавать новый объект с заданными свойствами, вызывая конструктор класса. Можно сказать - альтернативный способ создания объекта
<code>
class Employee:

    def __init__(self, firstname, lastname, salary):
        self.firstname = firstname
        self.lastname = lastname
        self.salary = salary

    @staticmethod
    def from_string(parse_stirng):
        firstname, lastname, salary = parse_stirng.split("-")

        # Создаем объект Employee и возвращаем его
        return Employee(firstname, lastname, salary)

emp2 = Employee.from_string("Mary-Steve-40000")

print(emp2.firstname)
</code>


Как работает Protocol в asyncio?
Как работает Protocol в asyncio при каждом подключении клиента создается новая таска? нужно ли мне например писать в подключении к БД asyncio.create_task()? Или это уже и будет таска?

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

class EchoServerProtocol(asyncio.Protocol):
    def connection_made(self, transport):
        self.transport = transport

    async def data_received_async(self, data):
        await asyncio.sleep(1)
        self.transport.write(data)

    def data_received(self, data):
        asyncio.create_task(self.data_received_async(data))

Подходит на протоколы "запрос-ответ",например, RADIUS, DNS, NTP, HTTP. В случае UDP сойдет, в случае стрима в синхронном коллбэке нужно собрать буфер по протоколу уровня приложения и уже передавать в обработку.
Посложнее - создавать таск на конекшн.
Пример с обработкой в очереди. Тут уже можно слать клиенту всякое в независимости от запросов.

import asyncio

class EchoServerProtocol(asyncio.Protocol):
    def connection_made(self, transport):
        peername = transport.get_extra_info('peername')
        print('Connection from {}'.format(peername))

        self.queue = asyncio.Queue()
        self.task = asyncio.create_task(self.connection_task(transport))
        self.ping_task = asyncio.create_task(self.ping(transport))

    def connection_lost(self, exc):
        print('The server closed the connection')
        self.ping_task.cancel()
        if not self.task.done():
            self.task.cancel()

    async def ping(self,transport):
        while True:
            await asyncio.sleep(1)
            transport.write(b"ping\n")

    async def connection_task(self, transport):
        transport.write(b"hello\n")
        while True:
            message = await self.queue.get()
            await asyncio.sleep(5)
            transport.write(message.upper().encode())
            self.queue.task_done()
        transport.close()

    def data_received(self, data):
        message = data.decode()
        self.queue.put_nowait(message)

async def main():
    # Get a reference to the event loop as we plan to use
    # low-level APIs.
    loop = asyncio.get_running_loop()

    server = await loop.create_server(
        lambda: EchoServerProtocol(),
        '127.0.0.1', 8888)

    async with server:
        await server.serve_forever()

asyncio.run(main())

Таск нужно вытащить наружу если асинхронный ресурс не поддерживает обработку нескольких запросов.
Например COM порт или железяка.


Перебор id пользователей для отправки сообщения для бота вк
Пишу бота для вк на vk_api. И столкнулся с проблемой, что не могу перебрать id пользователей для массовой рассылки. Пробовал перебор в разные места вставлять, но без успешно.

def rassilka(message):
    with open('all.txt', 'r') as f:
        for i in f:
            user_id = f.readline(int(i))

            vk.method('messages.send', {'user_id': user_id, 'message': message, 'random_id': 0})

При вызове функции выдает ошибку

vk_api.exceptions.ApiError: [100] One of the parameters specified was missing or invalid: you should specify peer_id, user_id, domain, chat_id or user_ids param

Читал в интернете про данную ошибку, но все без успешно. Ничего не помогло
В файле all.txt хранятся id пользователей

Попробуйте сделать так:
<code>
with open('all.txt', 'r') as file:
    users = file.readlines()
for user in users:
    vk.method(
        'messages.send',
        {'user_id': int(user),
        'message': message,
        'random_id': 0}
    )
</code>


Как получать несколько фото в одном хендлере Aiogram 3
Аналог этого вопроса для 3-ой версии Aiogram, так как были большие изменения.

Делаем мидлварь

import asyncio
from typing import Callable, Any, Awaitable, Union

from aiogram import BaseMiddleware
from aiogram.types import Message

class SomeMiddleware(BaseMiddleware):
    album_data: dict = {}

    def __init__(self, latency: Union[int, float] = 0.01):
        self.latency = latency

    async def __call__(
            self,
            handler: Callable[[Message, dict[str, Any]], Awaitable[Any]],
            message: Message,
            data: dict[str, Any]
    ) -> Any:
        if not message.media_group_id:
            await handler(message, data)
            return
        try:
            self.album_data[message.media_group_id].append(message)
        except KeyError:
            self.album_data[message.media_group_id] = [message]
            await asyncio.sleep(self.latency)

            data['_is_last'] = True
            data["album"] = self.album_data[message.media_group_id]
            await handler(message, data)

        if message.media_group_id and data.get("_is_last"):
            del self.album_data[message.media_group_id]
            del data['_is_last']

регистрируем её до регистрации хендлеров

dp.message.middleware(SomeMiddleware())

применяем

from aiogram import F
from aiogram.types import Message, InputMediaPhoto, InputMedia, ContentType as CT

# пример отправки тех же данных в виде медиагруппы
@dp.message(F.content_type.in_([CT.PHOTO, CT.VIDEO, CT.AUDIO, CT.DOCUMENT]))
async def handle_albums(message: Message, album: list[Message]):
    media_group = []
    for msg in album:
        if msg.photo:
            file_id = msg.photo[-1].file_id
            media_group.append(InputMediaPhoto(media=file_id))
        else:
            obj_dict = msg.dict()
            file_id = obj_dict[msg.content_type]['file_id']
            media_group.append(InputMedia(media=file_id))

    await message.answer_media_group(media_group)


Нумерация вывода в python [дубликат]

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

Как пронумеровать каждый вывод print?

                                (3 ответа)

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

Возможно глупый вопрос, есть вывод в питоне формата множества строк, нужно сделать так чтобы у всех строк была нумерация
1.
2.
3.
И т.д
Думал сделать это через цикл while но не получилось

Используйте enumerate
<code>
strings=['str1', 'str2', 'str3']

#если надо вывести в консоль
for num, st in enumerate(strings, 1):
    print(f'{num}. {st}')

#если надо создать лист строк
lis=[]
for num, st in enumerate(strings, 1):
    lis.append(f'{num}. {st}')

#если надо запихнуть все в 1 строку
endstr=''
for num, st in enumerate(strings, 1):
    endstr+=f'{num}. {st}\n'
</code>


Почему внутренняя функция декоратора запускается без ее вызова?

def decorator(func):
    def inner():
        print("start decorator")
        func()
        print("end decorator")
    return inner

@decorator
def function():
    print("Start function")
    print("End function")

function()

Почему функция inner запускается без ее вызова inner(), и как проходит цепочка действий при вызове декоратора?
Насколько я знаю запись @decorator равносильно function = decorator(function), и при вызове функции function() мы вызываем decorator() с аргументом function, но почему запускается inner()? Если мы по сути просто возвращаем на нее адрес >return inner
И почему нельзя записать код без внутренней функции следующим образом:

def decorator(func):
    print("start decorator")
    func()
    print("end decorator")

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

def decorator(func):
    print("start decorator")
    def inner():
        print("start inner")
        func()
        print("end inner")
    print("end decorator")
    return inner

print('call decorator')
@decorator
def function():
    print("Start function")
    print("End function")

print('call function')
function()

Вывод:

call decorator
start decorator
end decorator
call function
start inner
Start function
End function
end inner

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

def decorator(func):
    print("start decorator")
    func()
    print("end decorator")

print('call decorator')
@decorator
def function():
    print("Start function")
    print("End function")

print('call function')
function()

Вывод:

call decorator
start decorator
Start function
End function
end decorator
call function
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-89751d3d1e3a> in <module>
     11
     12 print('call function')
---> 13 function()

TypeError: 'NoneType' object is not callable

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

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


Есть ли стандартная функция сложения словарей по ключам?
Есть ли стандартный обработчик данного функционала? Или более быстрый функционал?
<code>
def summ_dict(*args):
    cash = {}
    for el_d in args:
        for key, val in el_d.items():
            if key not in cash:
                cash[key] = 0
            cash[key] += val
    return cash

d1 = {'B': 2, 'A': 3}
d2 = {'B': 2, 'A': 3, 'C': 10}

print(summ_dict(d1, d2))
</code>

Конечно есть:
<code>
from collections import Counter

d1 = {'B': 2, 'A': 3}
d2 = {'B': 2, 'A': 3, 'C': 10}

d = Counter(d1) + Counter(d2)
print(dict(d))

{'B': 4, 'A': 6, 'C': 10}
</code>


Найти год в строке

def find_years(text: str) -> list:
    """
    Учитывая текст строки, вернуть список всех 4-значных чисел (годов) в этой строке.

     Годами здесь считаются только четырехзначные числа.
     Если есть 5-значное число, то это не считается годом,
     и не даст два года. Таким образом, вы не можете разделить их.

     Годы должны быть найдены с помощью регулярного выражения.

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

     :param text: заданная строка для поиска лет от
     :return: список лет (целых чисел), найденных в данной строке
    """
    result = re.findall(r"[0-9]{4}", text)
    return result

print(find_years("1998sef672387fh3f87fh83777f777f7777f73wfj893w8938434343"))
    # [1998, 7777]

при запуске кода выходит такой ответ
['1998', '6723', '8377', '7777', '8938', '4343']
. Как изменить, чтобы он выписывал только 4 значные числа?

Выводит только 4 значные числа из строки:
<code>
(?<!\d)\d{4}(?!\d)
</code>


Как записать числа из текстового файла в переменные?
Я только начал изучать пайтон, поэтому вопрос может быть слишком уж простым. Есть задача, в которой нужно для легендарного fizzbuzz брать числа из другого текстового файла. Изначально я написал программу, которая берет числа из input. Как теперь в нее подключить чтение чисел из другого файла? Если что, то это задание после изучения модуля sys
<code>
fizz = int(input())
print("Buzz:")
buzz = int(input())
print("3 number:")
num = int(input())
i = 1
while i <= num:
    if i % fizz == 0 and i % buzz == 0:
        print("FB")
    elif i % fizz == 0:
        print("F")
    elif i % buzz == 0:
        print("B")
    else:
        print(i)
    i+=1
</code>

Ну если после sys, то:
<code>
import sys

original_stdin = sys.stdin

filein = open("data.txt", 'r')
sys.stdin = filein

for x in range(0, 20):
    fizz = int(input())
    print("Buzz:")
    buzz = int(input())
    print("3 number:")
    num = int(input())
    i = 1
    while i <= num:
        if i % fizz == 0 and i % buzz == 0:
            print("FB")
        elif i % fizz == 0:
            print("F")
        elif i % buzz == 0:
            print("B")
        else:
            print(i)
        i+=1

filein.close()
sys.stdin = original_stdin
</code>
Данные из файла data.txt


Сколько банок разного объема понадобиться, чтобы закрасить указанную пользователем площадь (Есть ли алгоритм?)
Пользователь вводит площадь поверхности, которую надо ему закрасить, есть 3 банки с разным объемом

[
{"id":"1","Цена":"2691.0000","Эта банка закрашивает площадь":"7"},
  {"id":"2","Цена":"5520.0000","Эта банка закрашивает площадь":"17.5"},
  {"id":"3","Цена":"9260.0000","Эта банка закрашивает площадь":"31.5"}
]

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

К примеру, пользователь указал 60 кв/м значит нужно 2 банки по 31.5 Есть какой ни будь алгоритм для нахождения самого оптимального варианта?

Нужно посчитать сколько банок какого объема нужно, что бы закрасить указанную пользователем площадь.
Пытаюсь написать функцию с входными данными

function (paints: json, area: double)

где paints это банки с красками

[
{"id":"1","Цена":"2691.0000","Эта банка закрашивает площадь":"7"},
  {"id":"2","Цена":"5520.0000","Эта банка закрашивает площадь":"17.5"},
  {"id":"3","Цена":"9260.0000","Эта банка закрашивает площадь":"31.5"}
]

а area это площадь, которую указал пользователь.
Выходные данные массив id банок, которые нужны для закрашивания заданной площади

["3","3","2"]

Функция подойдет на любом языке программирования

Вам наверное нужно минимальное количество банок (для оптимизации цены)? Напишите что значит оптимально - дешевле?
Если нет условия, что банки должны быть использованы полностью, то алгоритм простой:

делим площадь на площадь покраски самой большой банки нацело. Получаем количество больших банок и остаток незакрашенной площади (остаток от деления).
делим незакрашенную площадь на площадь покраски средней банки нацело. Получаем количество средних банок и остаток незакрашенной площади.
делим незакрашенную площадь на площадь покраски маленькой банки нацело. Получаем количество маленьких банок и делаем +1 на остаток незакрашенной площади.


Как фильтровать месседжи/колбеки в Aiogram 3
Требуется фильтр в декораторе типа
text_startswith.
В аиограме нет такого. Посмотрел в документации про
magic-filters. Все равно не работает. Тип коллбека -
name:first:second

На будущее, всегда пишите версию айограма, так как 3 и 2 довольно сильно отличаются.
Чтобы сделать тот фильтр который вам нужен, стоит импортировать модуль
Text из
aiogram.filters
Примерно так.

from aiogram.filters import Text

@dp.message(Text(text_startswith="name"))
async def handker_name(message: types.Message):
    ...

В 3-ей версии больше нету фильтров в самом декораторе, как во 2-ой версии. Теперь только импортировать.


Как подлючиться к Wifi?
Как при помощи python.
Подлючится к Wifi на любой операционной системе. Зная пароль, название интернета.

Нашел решение для linux/windows - pywifi
Пример кода:
<code>
import pywifi

profile = pywifi.Profile()
profile.ssid = 'testap' #ssid сети
profile.auth = pywifi.const.AUTH_ALG_OPEN #алгоритм аутентификации сети
profile.akm.append(pywifi.const.AKM_TYPE_WPA2PSK) #тип кей-менеджмента сети
profile.cipher = pywifi.const.CIPHER_TYPE_CCMP #тип шифрования сети
profile.key = '12345678' #пароль сети

wifi = pywifi.PyWiFi()
iface = wifi.interfaces()[0]
profile = iface.add_network_profile(profile)
iface.connect(profile)
</code>
А вот ссылочка на документацию


Почему html-тег 'meta description' не переведен?
У меня есть этот код Python, который работает очень хорошо.
Я могу перевести все свои HTML-теги, кроме одного:
<meta name="description" content="...">
может ли кто-нибудь помочь мне с решением? Я не знаю, почему не работает.

from bs4 import BeautifulSoup
from bs4.formatter import HTMLFormatter
from googletrans import Translator
import requests

translator = Translator()

class UnsortedAttributes(HTMLFormatter):
    def attributes(self, tag):
        for k, v in tag.attrs.items():
            yield k, v

files_from_folder = r"c:\carte\1"

use_translate_folder = True

destination_language = 'fr'

extension_file = ".html"

import os

directory = os.fsencode(files_from_folder)

def recursively_translate(node):
    for x in range(len(node.contents)):
        if isinstance(node.contents[x], str):
            if node.contents[x].strip() != '':
                try:
                    node.contents[x].replaceWith(translator.translate(node.contents[x], dest=destination_language).text)
                except:
                    pass
        elif node.contents[x] != None:
            recursively_translate(node.contents[x])

amount = 1
for file in os.listdir(directory):
    filename = os.fsdecode(file)
    print(filename)
    if filename == 'y_key_e479323ce281e459.html' or filename == 'directory.html':
        continue
    if filename.endswith(extension_file):
        with open(os.path.join(files_from_folder, filename), encoding='utf-8') as html:
            soup = BeautifulSoup('<pre>' + html.read() + '</pre>', 'html.parser')
            for title in soup.findAll('title'):
                recursively_translate(title)

            for meta in soup.findAll('meta', {'name':'description'}):
                try:
                    meta['content'] = recursively_translate(meta['content'])
                except:
                    pass

            for p in soup.findAll('p', class_='text_obisnuit2'):
                    recursively_translate(p)

        print(f'{filename} translated ({amount})')
        amount += 1
        soup = soup.encode(formatter=UnsortedAttributes()).decode('utf-8')
        new_filename = f'{filename.split(".")[0]}_{destination_language}.html'
        if use_translate_folder:
            try:
                with open(os.path.join(files_from_folder+r'\translated', new_filename), 'w', encoding='utf-8') as new_html:
                    new_html.write(soup[5:-6])
            except:
                os.mkdir(files_from_folder+r'\translated')
                with open(os.path.join(files_from_folder+r'\translated', new_filename), 'w', encoding='utf-8') as new_html:
                    new_html.write(soup[5:-6])
        else:
            with open(os.path.join(files_from_folder, new_filename), 'w', encoding='utf-8') as html:
                html.write(soup[5:-6])

test.html

<html>
<head>

    <title>It really helps me do great things for her</title>

    <meta name="description" content="What I LOVE to do and what I don't love">

    <p class="text_obisnuit2"><em>Buckingham has a new book called Love</em></p>

</body>
</html>

изменить с помощью этой строки вместо фактической строки:

node.contents[x].replaceWith(translator.translate(node.contents[x], dest=destination_language).text)

и эта часть:

        for meta in soup.findAll('meta', {'name':'description'}):
            try:
                meta['content'] = translator.translate(meta['content'], dest=destination_language).text
            except:
                pass

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

# pip install googletrans==4.0.0rc1

from bs4 import BeautifulSoup
from bs4.formatter import HTMLFormatter
from googletrans import Translator
import requests

translator = Translator()

class UnsortedAttributes(HTMLFormatter):
    def attributes(self, tag):
        for k, v in tag.attrs.items():
            yield k, v

files_from_folder = r"c:\carte"

use_translate_folder = True

destination_language = 'fr'

extension_file = ".html"

import os

directory = os.fsencode(files_from_folder)

def recursively_translate(node):
    for x in range(len(node.contents)):
        if isinstance(node.contents[x], str):
            if node.contents[x].strip() != '':
                try:
                    node.contents[x].replaceWith(translator.translate(node.contents[x], dest=destination_language).text)
                except:
                    pass
        elif node.contents[x] != None:
            recursively_translate(node.contents[x])

amount = 1
for file in os.listdir(directory):
    filename = os.fsdecode(file)
    print(filename)
    if filename == 'y_key_e479323ce281e459.html' or filename == 'directory.html':
        continue
    if filename.endswith(extension_file):
        with open(os.path.join(files_from_folder, filename), encoding='utf-8') as html:
            soup = BeautifulSoup('<pre>' + html.read() + '</pre>', 'html.parser')
            for title in soup.findAll('title'):
                recursively_translate(title)

            for meta in soup.findAll('meta', {'name':'description'}):
                try:
                    meta['content'] = translator.translate(meta['content'], dest=destination_language).text
                except:
                    pass

# translate the html tag <h1 class="den_articol" itemprop="name">Text Text</h1>

            for h1 in soup.findAll('h1', {'itemprop':'name'}, class_='den_articol'):
                    recursively_translate(h1)

# translate the html tag <p class="text_obisnuit">Text Text</p>

            for p in soup.findAll('p', class_='text_obisnuit'):

                    recursively_translate(p)

# translate the html tag <p class="DONO">Text Text</p>

            for p in soup.findAll('p', class_='DONO'):

                    recursively_translate(p)

        print(f'{filename} translated ({amount})')
        amount += 1
        soup = soup.encode(formatter=UnsortedAttributes()).decode('utf-8')
        new_filename = f'{filename.split(".")[0]}_{destination_language}.html'
        if use_translate_folder:
            try:
                with open(os.path.join(files_from_folder+r'\translated', new_filename), 'w', encoding='utf-8') as new_html:
                    new_html.write(soup[5:-6])
            except:
                os.mkdir(files_from_folder+r'\translated')
                with open(os.path.join(files_from_folder+r'\translated', new_filename), 'w', encoding='utf-8') as new_html:
                    new_html.write(soup[5:-6])
        else:
            with open(os.path.join(files_from_folder, new_filename), 'w', encoding='utf-8') as html:
                html.write(soup[5:-6])


Python. Вычислить лайфтайм по месяцам
Есть таблица вида
<code>
df = pd.DataFrame([['a','2021-03-01','2021-11-01'], ['b','2021-03-01','2021-11-01'],
                   ['c','2021-03-01','2021-05-01'], ['d','2022-01-01','2022-01-01'],
                   ['e','2022-04-01','2022-06-01']], columns=['id','min_dt', 'max_dt'])
</code>
Необходимо добавить столбец, вычислив лайфтайм в месяцах. При простом вычитании получается интервал в количество дней, можно ли его преобразовать в количество месяцев?


Проблема с преобразованием кодировки из 'iso8859-1' в 'Windows-1251'
Доброго времени суток как перекодировать на python из 'iso8859-1'  в кодировку 'Windows-1251', если данные приходят как тип bytes.
Пример:

Данные отправки: Êëèåíò: 007 (Test test) âåðíóëñÿ.

Отображения в консоли Pycharm: b'\xc3\x8a\xc3\xab\xc3\xa8\xc3\xa5\xc3\xad\xc3\xb2: 007 (Test test) \xc3\xa2\xc3\xa5\xc3\xb0\xc3\xad\xc3\xb3\xc3\xab\xc3\xb1\xc3\xbf.'

В нормальный вид: Клиент: 007 (Test test) вернулся.

помогите пожалуйста:
вот пример кода:

@app.route('/test', methods=['POST'])
def respond():
    d = request.data
    return Response(d, status=200)

Ну если Вы уже попали в такую ситуацию, то вот можно примерно так:
<code>
data = b'\xc3\x8a\xc3\xab\xc3\xa8\xc3\xa5\xc3\xad\xc3\xb2: 007 (Test test)'
print(data.decode().encode('iso8859-1').decode('cp1251'))
</code>


как из большого json сделать вывод по строкам в текстовый файл в Python
Имею Json со статистикой nmap по открытым портам в организации. Json такого вида:

{
    "nmap": {
        "row": [
            {
                "service": {
                    "_port": "443",
                    "_version": ""
                },
                "_status": "alive",
                "_name": "SRV-PROD-01",
                "_device_type": "",
                "_ip": "192.168.0.58",
                "_mac": "00:00:00:00:00:00",
                "_has_http": "0",
                "_is_http8080": "0",
                "_has_https": "0",
                "_has_ftp": "0",
                "_has_rdp": "0",
                "_sIsDNSScan": "0",
                "_expanded": "0"
            },
            {
                "service": [
                    {
                        "_port": "3389",
                        "_version": "Tunnel is Microsoft SChannel TLS: unknown service"
                    },
                    {
                        "_port": "54299",
                        "_version": "uTorrent utserver web interface"
                    },
                    {
                        "_port": "58000",
                        "_version": ""
                    }
                ],
                "_status": "alive",
                "_name": "SRV-PROD-02",
                "_os_version": "Linux",
                "_ip": "192.168.0.59",
                "_mac": "00:00:00:00:00:00",
                "_has_http": "0",
                "_is_http8080": "0",
                "_has_https": "0",
                "_has_ftp": "0",
                "_has_rdp": "1",
                "_rdp_version": "Tunnel is Microsoft SChannel TLS: unknown service",
                "_sIsDNSScan": "0",
                "_expanded": "0"
            },

Можете подсказать парсер JSON на питоне, чтобы вывод был такого формата:

IP Port Port Port
IP Port Port Port
IP Port Port Port

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

for item in data['nmap']['row']:
    ip = item['_ip']
    if not 'service' in item:
        print(ip)
        continue
    service = item['service']
    if isinstance(service, dict):
        ports = [service['_port']]
    else:
        ports = (f"{port['_port']}" for port in service)
    print(ip, *ports)

Вывод:

192.168.0.58 443
192.168.0.59 3389 54299 58000

Если надо грузить ещё из файла сначала, то через модуль
json.


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

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

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

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

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

В списке имеется 1000 элементов необходимо разделить их на 3 списка в ответе получит индексы срезов
<code>
def range_part(data, part):
    result = list()
    y = data
    data = data / part
    n = 0
    k = 0
    x = 1
    for i in range(1, part + 1):
        if x == part:
            result.append((n + 1, y))
        else:
            result.append((n + 1, k + int(data)))
            n = k + int(data)
            k += int(data)
            x += 1
    return result
</code>

Это, конечно, не совсем индексы срезов, но те же значения, которые вы хотели
<code>
def range_part(size, nparts):
    result = list()
    for i in range(nparts - 1):
        result.append((size//nparts*i + 1, size//nparts*(i+1)))
    result.append((size//nparts*(nparts-1) + 1, size))
    return result
</code>


Работа со словарем python
Вопрос такого плана. python3-nmap. Надо выводить порт, сервис, версию. Не у всего находит версию, из-за чего вылетает ошибка. Надо как-то сделать проверку наличия ключа version в словаре и записывать в переменную значения. Вот мой псевдокод до которого я смог додуматься. Но что-то тут не так
<code>

scan = nmap3.Nmap()
result = scan.nmap_version_detection("10.0.0.4")

for res in result["10.0.0.4"]["ports"]:
    port=res(["portid"])
    name=res(["service"]["name"])
    if version in service:
        version=res(["service"]["version"])
    else:
        version=('Версия не найдена')

print(port+name+version)```
</code>

ress = [{"service": {"version": '0.1', 'name': 'qwe'}}, {"service": {'name': 'asd'}}]
# 1 try-except
for res in ress:
    name = res["service"]["name"]
    try:
        version = res["service"]["version"]
    except Exception:
        version = None
    print(f'{name} {version if version else ""}')
# qwe 0.1
# asd

# 2 dict.get()
for res in ress:
    name = res["service"]["name"]
    version = res["service"].get("version")
    print(f'{name} {version if version else ""}')
# qwe 0.1
# asd


Python. Почему выводит ошибку unsupported operand type(s) for *: 'map' and 'map' в моём коде ? Пожайлуста подскажите
Для решения задачи -

"Задан круг (x-a)2+(y-b)2 = R2 и точки Р(р1, р2), F(f1, f1), L(l1,
l2). Выяснить и вывести на экран, сколько точек лежит внутри круга.
Проверка, лежит ли точка внутри круга, оформить посредством функции"

Я написал такой код -
<code>
def is_inside_circle(c_x, c_y, p_x, p_y, r):
    c = ((p_x - c_x) **2 + (p_y - c_y) **2)
    r2 = r * r
    if c <= r2:
        return 1
    else:
        return 0

p1, p2 = map(int,input("Введіть кординати точки \"P\"(x і y, через пробіл):").strip().split())
f1, f2 = map(int,input("Введіть кординати точки \"F\"(x і y, через пробіл):").strip().split())
l1, l2 = map(int,input("Введіть кординати точки \"L\"(x і y, через пробіл):").strip().split())
r = map(int,input("Введіть радіус окружності:"))

count = 0

if is_inside_circle(0, 0, p1, p2, r) == 1:
    count += 1
elif is_inside_circle(0, 0, f1, f2, r) == 1:
    count += 1
elif is_inside_circle(0, 0, l1, l2, r) == 1:
    count += 1

print(f"Кількість точок що лежать всередині кола: {count}")
</code>
Но выводит ошибку

unsupported operand type(s) for *: 'map' and 'map'

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

В общем как мне подсказал человек splash58, надо писать

r, = map(int,input())

либо

r = (float)(input())


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

class Vector:

def __init__(self, x, y):
    self.x = x
    self.y = y

Могу ли я сделать так, чтобы тип данных передаваемых x и y мог быть только int? Или единственный вариант - проверять тип х и у в функции инициализации?:

    def __init__(self, x, y):
        self.x = x
        self.y = y
        if type(self.x) != int or type(self.y) != int:
            raise SomeException('some error text')

Можно использовать аннотации и установить библиотечку typeguard
<code>
from typeguard import typechecked

class Vector:

    @typechecked
    def __init__(self, x: int, y: int):
        self.x = x
        self.y = y
</code>
Можно, опять-таки с аннотациями, просто запускать программу через Mypy


не могу решить задачу с тремя числами которые вводятся через консоль в python
только начинаю учить python и попалась такая задача.
нужно ввести три числа через консоль. первое называется А, второе В, третье С.
до третьего числа нужно досчитать от единицы и вывести это на экран.
Если во время перебора чисел число кратное А, то выводится А, если кратное В, то выводится В, если число кратное АиВ то выводить АВ.
например ввели 2, 5, 18

1 А 3 А B А 7 А 9 АВ 11 А 13 А В А 17 А

у меня получается только так, подскажите пожалуйста в каком направлении двигаться и как решить задачу

a = int(input('A: '))
b = int(input('B: '))
ab = int(input('AB: '))

if ab > a or ab > b:
    i = 0
    while i != ab:
        i += 1
        if i == a or i % a == 0:
            print('A')
        if i == b or i % b == 0:
            print('B')
        if i % a and i % b == 0:
            print('AB')
        print(i)

if (i % a == 0) and (i % b == 0):
     print('AB')
elif i % a == 0:
     print('A')
elif i % b == 0:
     print('B')
else:
    print(i)


Ошибка TypeError: cannot unpack non-iterable functools._lru_cache_wrapper object
При запуске программы почему-то выдает такую ошибку, и я не понимаю, как ее исправить
<code>
from functools import lru_cache

def moves(h):
    a, b = h
    return (a + 1, b), (a, b + 1), (a * 2, b), (a, b * 2)

@lru_cache(maxsize=None)

def f(h):
    if sum(h) >= 79:
        return 'end'
    if any(f(x) == 'end' for x in moves(h)):
        return 'win1'
    if all(f(x) == 'win1' for x in moves(h)):
        return 'lose1'
    if any(f(x) == 'lose1' for x in moves(f)):
        return 'win2'
    if all(f(x) == 'win1' or f(x) == 'win2' for x in moves(h)):
        return 'lose2'

for i in range(1, 100):
    h = 7, i
    print(h, f(h))
</code>

Ну а вот это что такое:

if any(f(x) == 'lose1' for x in moves(f)):
                                     ^^^

Здесь вы передаёте в функцию
moves кэш-декоратор функции
f вместо кортежа
h, как в других местах. Исправьте на
h и всё заработает.

if any(f(x) == 'lose1' for x in moves(h)):


Объединение элементов массива python
Есть массив такого вида, с множеством таких объектов

["Name", "1", "234", "11", "name"...... ]

нужно чтобы каждые 5 элементов были одной строкой, может кто подсказать как это сделать?
Была попытка объедения таким способом:

my_list=['name', '1', '2, '3', 'name'...]
my_list=[''.join(my_list)]

Всё склеивается в одну строку без пробелов, и склеивает весь масив

elements = ["Name", "1", "234", "11", "name"] * 20
# Это типа ваш список но в 20 раз длинее ______^^^
step = 5

print(
    *(', '.join(elements[i: i + step]) for i in range(0, len(elements), step)), sep='\n'
)
# Name, 1, 234, 11, name
# Name, 1, 234, 11, name
# Name, 1, 234, 11, name
# Name, 1, 234, 11, name
# Name, 1, 234, 11, name
...
# Name, 1, 234, 11, name
# Name, 1, 234, 11, name


Запись неверных данных в БД SQL
Делаю финансового бота и мне необходимо записать данные о доходе пользователя через тг бота. Вроде написал ф-цию, но почему-то записывает вообще непонятные данные...
<code>
@bot.message_handler(commands=["add_salary"])
def zp_add(message):
    msg = bot.send_message(message.from_user.id, '''Введите ваш текущий доход: ''')
    bot.register_next_step_handler(msg, zp_add2)

def zp_add2(message):
    bot.send_message(message.chat.id, 'Данные были успешно добавлены!')
    db = sqlite3.connect("finothc.db")
    cur = db.cursor()
    cur.execute("INSERT INTO finansi (Доход) VALUES(?)", [message.from_user.id])
    bot.send_message(message.chat.id, 'Вот ваши введенные
данные\n{}'.format(message.text))
    db.commit()
    db.close()
</code>
Допустим я введу 20000, а в БД впишется 745764314. Я так понимаю это id сообщения и как тогда исправить?

Попробуй так
<code>
def zp_add2(message):
    bot.send_message(message.chat.id, 'Данные были успешно добавлены!')
    db = sqlite3.connect("finothc.db")
    cur = db.cursor()
    cur.execute("INSERT INTO finansi (Доход) VALUES(?)", [message.text])
    bot.send_message(message.chat.id, 'Вот ваши введенные
данные\n{}'.format(message.text))
    db.commit()
    db.close()
</code>


Как в группе проверить forward сообщение на user_id?
Есть бот который пересылает сообщение пользователя в закрытую группу(через forward). Дальше в группе отвечаю на сообщение и сообщение приходит пользователю. Как проверять каждое сообщение в группе по user_id(которое бот прислал через forward)? Пробовал через message.forward_from_chat.id. Выдает ошибку 'NoneType' object has no attribute 'id'. Нужно ли сохранять user_id в бд? Или возможно есть другой вариант решения даной проблемы?

Моя мысль, как такое реализовать:

Создаем БД, в ней храним id сообщения в группе и chat_id откуда оно пришло
При reply к сообщению, боту возвращается его id, по нему в бд находим chat_id
Profit

Как выглядит код:
<code>
#класс бд
class db:
    def __init__(self, database_file):
        self.connection = sqlite3.connect(
            database_file, check_same_thread=False)
        self.cursor = self.connection.cursor()
        with self.connection:
            self.cursor.execute(
                """CREATE TABLE IF NOT EXISTS `messages` (
                `message_id` INTEGER,
                `chat_id` INTEGER
            );""")
    def add_message(self, message_id: int, chat_id: int) -> None:
        self.cursor.execute(
            'INSERT INTO `messages` VALUES(?,?)',
            (message_id, chat_id)
        )
        self.connection.commit()

    def get_id(self, message_id: int) -> int:
        result=self.cursor.execute(
            'SELECT `chat_id` FROM `messages` WHERE `message_id` = ?',
            (message_id,)
        ).fetchone()
        return result[0]

#далее создаем объект базы данных
db=db('{название файла бд}')

@bot.message_handler()
def get_user_text(message):
    if message.chat.id != PRIVATE_GROUP:
        msg=await message.forward(PRIVATE_GROUP, message.text)
        db.add_message(msg.message_id, message.chat.id) #добавляем в бд сообщение

    elif message.reply_to_message: #проверяем, является ли сообщение ответом
        bot.copy_message(
            chat_id=db.get_id(message.reply_to_message.message_id), #chat_id, куда отправляем
            from_chat_id=message.chat.id,
            message_id=message.message_id
        )
</code>


Как поставить срезы
здесь видно что код не округляет до нужных значений. Должен был выдать результат: 3999.999

dlina = 111
dlina0 = str(dlina)
dlina1 = len(dlina0)
a = 3999.99999999
print(round(a, dlina1))

здесь выдает 4000.0
вот эта формула тоже не округляет до значений 3999.999

dlina = 111
dlina0 = str(dlina)
dlina1 = len(dlina0)
a = 3999.99999999
print(int(a*3999**dlina1)/3999**dlina1)

тут выдает такой результат 3999.9999999899924

А почему бы просто не округлить?

a = 10.4455555
print(round(a,3))

10.446

Если нужно округлить не по мат. правилам (всегда вниз), можно так

n = 3
a = 10.4455555
print(int(a*10**n)/10**n)

Как это работает. Берем число 10.4455555, умножаем его на
10**n - в данном случае
10**3 = 1000 (можно сказать, "сдвигаем" десятичную точку вправо на 3 знака). Получаем  10445.5555. Отбрасываем дробную часть с помощью
int(), получаем 10445. Делим на 1000 - "сдвигаем" точку влево на 3 знака и получаем:

10.445


Как складывать и вычитать поступающие в БД числа от одного id?
Имеется таблица в SQLite, есть столбец operation, нужно чтобы при функции 'Доход' число добавлялось к тому что там есть, и при функции 'Расходы' число от пользователя вычиталось. Как это можно реализовать в python sqlite3?
Моя запись в теле бота:

def get_sum(message):
if message.text == 'Доходы':
    bot.send_message(message.chat.id, 'Введите сумму: ')
    bot.register_next_step_handler(message, get_oper)

def get_oper(message):
value = int(message.text)
operation = '+'

BotsBD.add_record(message.from_user.id, operation, value)

Моя запись в части БД(полагаю основная ошибка в ней):

 def add_record(self, users_id, operation, value):
    """Создаём запись о расходах/доходах"""
    self.cursor.execute("INSERT INTO `records` (`users_id`, `operation`, `value`) VALUES (?, ?, ?)",
                        (self.get_user_id(users_id),
                         operation == '+',
                         value))
    return self.conn.commit()

operation в таблице SQLite имеет тип Boolean и не равно 0.

Как это вижу я:

Создаём таблицу, в ней столбцы - user_id, balance
Не добавляем значения, а изменяем их

Как это выглядит в коде:

def plus(self, user_id, amount):
    self.cursor.execute('UPDATE records SET balance = balance + ? WHERE user_id = ?', (amount, user_id))
    self.connection.commit()
#минус по аналогии, в запросе просто меняем знак

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

def exists(self, user_id): #проверка наличия записей
    res=self.cursor.execute('SELECT * FROM records WHERE user_id = ?', (user_id,))
    return bool(len(res.fetchall())

def add(self, user_id): #создание новой записи
    self.cursor.execute('INSERT INTO records (user_id, balance) VALUES(?,?)', (user_id, 0))
    self.connection.commit()


Так как область ответов лежит в (-∞; ∞), то и функция активации выхода должна принимать значения из этого промежутка
поменять

output_layer = Dense(1, activation='relu')(hidden2)

на

output_layer = Dense(1, activation='linear')(hidden2)

или любую другую функцию со значениями (-∞; ∞)


Как удалить все элементы списка, стоящие слева и добавить их в конец списка?
Хочу удалить все элементы списка, стоящие слева и добавить их в конец списка, вот код:

import random
randomtext = random.sample(range(1,50),7) #генерирую список из 7 случайных неповторяющихся чисел
print(randomtext)
newrandtext = []
print("Минимальное значение в ранд. сгенерированном списке: ",min(randomtext))
if min(randomtext) != randomtext[0]:
    firstnum = list(randomtext[0:min(randomtext) + 1]) #это генерируется список из всех элементов, стоящих до минимального
    randomtext.remove(firstnum) #здесь удаляю из первонач. списка те самые эл-ы которые идут до мин-го числа
    newrandtext.append(randomtext2) #в пустой список добавяляю старый список но без первых чисел которые идут до мин-го
    print("newrandtext:", newrandtext + firstnum) #вывожу список в котором идёт сначала мин число, затем все остальные, а после всех остальных идут те числа, что изначально стояли перед мин-ым
elif min(randomtext) == randomtext[0]:
    print("Минимальное значение уже стоит на первом месте, значит спереди него нечего добавлять в конец списка. \n Повторите генерацию чисел снова.")

Выводит ошибку:
ValueError: list.remove(x): x not in list. Как решить проблему?

Нагородили вы тут много, откровенно говоря. Пройдёмся по ошибкам:

Я так понимаю, что в этой строчке

firstnum = list(randomtext[0:min(randomtext) + 1]) #это генерируется список из всех элементов, стоящих до минимального

вы хотели взять список до минимального элемента. Но
min(randomtext) - это значение из списка, а не индекс. Если вы хотите получить индекс, то используйте метод
list.index(). И непонятно зачем вы делаете +1, если вам не нужно включать минимальный элемент в перенос. Выглядеть это должно так:

firstnum = randomtext[:randomtext.index(min(randomtext)):]

Следующая строчка:

randomtext.remove(firstnum)

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

randomtext = randomtext[randomtext.index(min(randomtext))::]

Следующая строчка. Здесь вообще не понятно, что вы делаете:

newrandtext.append(randomtext2)

Что такое
randomtext2? Откуда он взялся, если в коде его не было. Судя по комментарию оставленным вами, это должен быть список, который содержит первые элементы до минимального. Но у нас же уже для этого есть
firstnum. Ладно, с этим разобрались. И опять та же ошибка, что и в прошлом. Методы
append добавляет в список переданный в него объект, т.е. он просто добавит список, а не элементы из него. Если вам нужно добавить элементы, то используйте методы
extend или оператор
+=:

newrandtext.extend(firstnum)

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

import random
randomtext = random.sample(range(1,50),7)
ind = randomtext.index(min(randomtext))
randomtext = randomtext[ind::] + randomtext[:ind:]


Преобразовать строку в имя списка (PYTHON) [дубликат]

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

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

                                (2 ответа)

Как динамически создать переменную

                                (2 ответа)

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

Есть список строк:

['Str0', 'Str1', 'Str2', 'Str3']

Есть ли в Пайтоне возможность преобразовать его в несколько соответствующих списков?

Str0 = []
Str1 = []
Str2 = []
Str3 = []

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

lst = ['Str0', 'Str1', 'Str2', 'Str3']
g = locals()
for e in lst:
    g[e] = []
print(type(Str0))
print(type(Str1))
print(type(Str2))
print(type(Str3))


Selenium. Threading. Aiogram. Ошибка: Timeout context manager should be used inside a task
Задача: в хендлере поймать команду от пользователя и запустить в отдельном потоке браузер с помощью Selenium. По мере продвижения по сайту необходимо отправить из этого же потока сообщение пользователю через await bot.send_message. Но вылетает эта ошибка. Как выйти из этого положения? Буду рад любой помощи
<code>
async def some_handler(message: types.Message)
    user_id = message.from_user.id
    test = Thread(target=asyncio.run, args=(save_user_profile(phone_number, user_id),))
    test.start()

async def save_user_profile(phone_number, user_id):
    # функция с селениумом
    # какие-то действия
    # зашли туда
    # зашли сюда
    # взяли инфу такую-то
    await bot.send_message(user_id, 'какая-то инфа с сайта')
</code>
Видимо для функции await bot.send_message нет какого-то контекста, она вырвана и является чужеродной в новом потоке, сопрограмме. Что делать, товарищи? Буду рад услышать ваши умные мысли

Я смог решить эту проблему.
Эта ошибка появлялась, потому что в новом потоке был другой цикл событий никак не связанный с циклом событий с ботом. Поэтому я предпринял следующее:
В хендлере я получил текущий цикл событий
<code>
async def some_handler(message: types.Message)

    loop = asyncio.get_event_loop() # текущий цикл событий

    user_id = message.from_user.id
    test = Thread(target=save_user_profile, args=(phone_number, user_id, loop, ))
    test.start()

def save_user_profile(phone_number, user_id, loop):
    # функция с селениумом
    # какие-то действия
    # зашли туда
    # зашли сюда
    # взяли инфу такую-то
    asyncio.run_coroutine_threadsafe(bot.send_message(user_id, 'Текст'), loop)
</code>


Как распарсить 2022-08-20T20:30:00+00:0 ? python
Как распарсить вот эту строку "2022-08-20T20:30:00+00:00" отдельно на год-месяц-день, отдельно на час:минута:секунда?
То есть, должно быть:
дата: 2022-08-20
время: 20:30:00

У вас дата и время в формате ISO, поэтому можно воспользоваться функцией
datetime.fromisoformat()

from datetime import datetime

dt_string = '2022-08-20T20:30:00+00:00'
dt = datetime.fromisoformat(dt_string)
print(dt.date())  # 2022-08-20
print(dt.time())  # 20:30:00


Python.Pandas Замена отсутствующих значений, на значения из словаря
Есть 2 датафрейма, как мне заменить отсутствующие значения в первом соответствующие во втором:
<code>
df = pd.DataFrame([['a',9.1], ['b',None], ['c',None], ['d',9.2], ['e',7.5]], columns=['x','y'])
df2 = pd.DataFrame([['a',9.1], ['b',6.3], ['c',6.1]], columns=['x','y'])
</code>


После удаления строки выдает KeyError. Pandas
Скрипт ищет в Excel файле совпадения с шаблонами, добавляет их в словарь, удаляет из исходного датафрейма. Шаблоны в словаре как ключи. Пробовал реиндексировать, игрался с счетчиком. Ошибку выкидывает после удаления 605 строки, при поиске следующего совпадения. Почему выкидывает эту ошибку, если
where.head(605) спокойно выполняется.

def find(pattern, where):
    i = 0
    while i in range(len(where)):
        match = re.match(pattern, where[i])
        if match is not None:
            test_dict[pattern].append(where[i])
            where.drop(index=[i], axis=0, inplace=True)
        i += 1
    return where

for key in test_dict.keys():
    searching = find(key, searching)

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


Как сравнить значение числа в ячейке с другим sqlite3 python
Здраствуйте, мне нужно проверить, равно ли значение в ячейке определённому числу. return возвращает строку
<sqlite3.Cursor object at 0x0000027CB7DB64C0>, но не само число, которое мне нужно
1 файл: (Исполняемый)

from db import Database

if db.check() == 3:
    # что-то делается

2 файл: (db.py)

import sqlite3

class Database:
    def __init__(self, db_file):
        self.connection = sqlite3.connect(db_file)
        self.cursor = self.connection.cursor()

    def check(self):
        with self.connection:
            res = self.cursor.execute('SELECT check_db FROM users WHERE check_id = ?',())
            return res

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

with sqlite3.connect("db_file.db") as adb:
    cur = adb.cursor()

    def check():
        cur.execute("SELECT check_db FROM users WHERE check_id = 'ваше значение'")
        result = cur.fetchall()
        return result

    print(check())


Можно ли в Python определить город по коду аэропорта
Можно ли в Python определить город по коду аэропорта, например ATL?
<code>
from pyairports.airports import Airports
airports = Airports()
airports.airport_iata(iata) # namedtuple(airport, [name, city, country, iata, icao, lat, lon, alt, tz, dst, tzdb]) or AirportNotFoundException
airports.other_iata(iata)   # namedtuple(other, [iata, name, country, subdiv, type, lat, lon]) or AirportNotFoundException
airports.lookup(iata)       # namedtuple(airport) or namedtuple(other) or AirportNotFoundException
</code>

Модуль надо предварительно поставить:

pip install pyairports

Дальше используете практически как в вашем примере:

from pyairports.airports import Airports

iata = 'SVO'
airports = Airports()
airport = airports.airport_iata(iata)
print(airport.city)

Вывод:

Moscow


Почему в группе команды бота работают и дублируют ответ на сообщение в группе?
Я сделал бота который пересылает сообщение пользователя в закрытую группу. Дальше в группе админ отвечает на сообщение через reply и ответ присылается пользователю. Проблема в том что команды бота(например /start) работает в закрытой группе, вторая проблема когда админ отвечает на сообщение в группе бот дублирует ответ в группе(грубо говоря бот в группе реагирует на любой текст и дублирует его). Как это исправить?
<code>
@dp.message_handler(content_types='text')
async def get_message(message: types.Message):
    await message.forward(PRIVATE_GROUP, message.text)
    # когда админ отвечает на сообщение вернуть ответ пользователю
    # почему команда /start работает в группе?
    # почему бот дублирует ответ в группе?
    if message.reply_to_message and message.chat.id == PRIVATE_GROUP and message.text != '/start':
        await bot.send_message(message.from_user.id, message.text)
</code>

Простым решением будет фильтр - не выполняем действие когда chat_id сообщения совпадает с chat_id группы.
В коде это выглядит так:
<code>
@dp.message_handler(content_types='text')
async def get_message(message: types.Message):

    #если chat_id сообщения == chat_id группы - не пересылаем
    if message.chat.id!=PRIVATE_GROUP:
        await message.forward(PRIVATE_GROUP, message.text)

    elif message.reply_to_message:
        await bot.send_message(message.from_user.id, message.text)
</code>


Как в список добавить ключ словаря?
Необходимо из словаря взять ключ и добавить его в пустой список.
Вот код, который я пытался реализовать, но он добавляет не ключ, а значение:
<code>
last_order = {
    'XMRUSDT': ['sell', 0, 0, 0, 0, 0],
    'usd': ['sell', 0, 0, 0, 0, 0],
}
requestedFutures = []
requestedFutures.append(last_order['XMRUSDT'])
print(requestedFutures[0])
</code>

чтобы вернуть ключи, используйте метод
keys() для словаря
Пример

last_order = {
    'XMRUSDT': ['sell', 0, 0, 0, 0, 0],
    'usd': ['sell', 0, 0, 0, 0, 0],
}
requestedFutures = []
requestedFutures.append(list(last_order.keys())[0])
# или без keys()
requestedFutures.append(list(last_order)[0])

В данном случае учитывайте, что тип данных
dict не упорядоченный и нужно быть уверенным в том какой ключ вы добавляете
Добавить все ключи можно так

requestedFutures += list(last_order)


Как получить название ключа JSON в Python?
Помогите, пожалуйста. Возможно, вопрос глупый, но все таки. Как получить название ключа("Текст")? Или это нереально?)
<code>
[{
    "Текст": {
        "enabled": false,
        "type:": "state"
    },
    "Текст2": {
        "enabled": false,
        "type:": "state"
    },
    "Текст3": {
        "enabled": false,
        "type:": "state"
    }
}]
</code>

Можно воспользоваться модулем
json, чтобы преобразовать строковую последовательность в релевантный словарь
python

from json import loads

json_ = '''{"Текст":{
    "enabled": false,
    "type:": "state"
    }}'''

dict_from_json = loads(json_)

А далее как советовали

for key in dict_from_json:
    print(key)

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

from json import loads
a = '''[{
    "Текст": {
        "enabled": false,
        "type:": "state"
    },
    "Текст2": {
        "enabled": false,
        "type:": "state"
    },
    "Текст3": {
        "enabled": false,
        "type:": "state"
    }
}]'''

# в список словарей
list_from_json = loads(a)

all_keys = []

# все ключи
for item in list_from_json:
    all_keys += item.keys()

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

all_keys = list(list_from_json[0].keys())


Изменение байтовой строки python
Есть байтовая строка:
b'\\xff\\xd8\\xff\\xe0\\x00'
Как из неё сделать:
b'\xff\xd8\xff\xe0\x00' ?

Можно использовать такой прием:
<code>
b = b'\\xff\\xd8\\xff\\xe0\\x00'
result = b.decode("unicode-escape").encode("latin1")
print(result)  # Вывод: b'\xff\xd8\xff\xe0\x00'
</code>


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

X=[1,2,3,2,3]
Y=[3, 3]

или

X=[4,5,6]
Y=[6]

или

X=[1,2,3,3,2,3]
Y=[3, 3,3]

Мой код

Y=(X.pop(X.index(max(X))),X.pop(X.index(max(X))))

Но я видимо не туда пошёл, у меня не получается

<code>
c = max(x)
return [c] * x.count(c)
</code>
Находим максимальное число из списка, и возвращаем количество повторений максимального числа умноженное на само число в списке.


Ошибка TabError: inconsistent use of tabs and spaces in indentation
Подскажите пожалуйста, что не так:
<code>
from models import User

def get_user_by_id(user_id):
    try:
        return User().get(vk_id=user_id)
    except:
        User(
            vk_id=user_id,
            warns=0
        ).save()
        return User().get(vk_id=user_id)
</code>

IndentationError: unindent does not match any outer indentation level

Для
try вы использовали табулятор,
но для
except 4 пробела.

Так невозможно: или табуляторы, или пробелы.
(Или та же самая последовательность табуляторов и пробелов перед
try и перед
except.)


python: заменить значение по ключу и вернуть словарь
стоит задача:
есть словарь
node = {'T': '', 'V': 0, 'E': []}
необходимо вернуть данный словарь, но с заменённым значением по ключу
E
можно сделать так:

return {'T': node['T'], 'V': node['V']: 'E': [1, 2]}

можно так:

node['E'] = [1, 2]
return node

или даже так (по идее самый надежный):

new = copy.deepcopy(node)
new ['E'] = [1, 2]
return new

Такой вопрос - а можно ли как-нибудь красиво сделать это в 1 строчку и без уж слишком лишнего функционала, что-то подобное как в JS:

return {...node, 'E': [1, 2]}

Предисловие
Официальная документация Python 3 содержит раздел 'Built-in Types', в котором описываются стандартные типы данных, встроенные в интерпретатор.
В подразделе 'Mapping Types — dict' можно изучить список операций, которые поддерживают словари.
Ответ
Одним из нововведений в Python 3.9 выступает
merge operator для
встроенного dict-класса.
Официальная документация гласит:

d | other

Create a new dictionary with the merged keys and values of d and other, which must both be dictionaries. The values of other take priority when d and other share keys.

New in version 3.9.

Т. е. результатом будет выступать новый словарь с объединенными ключами и значениями из словарей
d и
other. Значения словаря
other будут в приоритете в случае коллизии ключей.
Пример

>>> d = {'spam':  1, 'eggs': 2, 'cheese': 3}
>>> e = {'cheese': 'cheddar', 'aardvark': 'Ethel'}

>>> d | e
{'spam': 1, 'eggs': 2, 'cheese': 'cheddar', 'aardvark': 'Ethel'}

>>> e | d
{'cheese': 3, 'aardvark': 'Ethel', 'spam': 1, 'eggs': 2}

Примечание
В случае возникновения каких-либо вопросов, обратитесь к PEP 584 – Add Union Operators To dict


python: компактная запись для выбора одной из двух переменных в зависимости от их значений
есть переменные
l и
r являющиеся словарями
подскажите можно ли как-то компактно и красиво ;-) переписать данный функционал:

        if l == {} and r == {}:
            return {}

        if l == {}:
            return r

        if r == {}:
            return l

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

        if l == r == {}:

<code>
return l or r or {}
</code>
Без ифов. Если я правильно понял задание