Автонаименование категории при добавлении товара. Django
Основной вопрос это как организовать создание товара через админ панель с автонаименованием? Думаю по коду будет понятно.
В файле models.py я определяю отдельный класс для каждой категории, из-за специфических характеристик:
<code>
class BaseProductInfo(models.Model):
   title = models.CharField(max_length=24, verbose_name='Название')
   manufacturer = models.CharField(max_length=24, verbose_name='Производитель')
   photo = models.ImageField(upload_to="photos/", verbose_name='Фото')
   description = models.TextField(blank=True, verbose_name='Описание')
   included = models.CharField(max_length=24, verbose_name='Комплектация')
   created = models.DateTimeField(auto_now_add=True, verbose_name='Создано')
   updated = models.DateTimeField(auto_now=True, verbose_name='Обновлено')
   is_published = models.BooleanField(default=True, verbose_name='Опубликовано')
   category = models.ForeignKey('ProductCategory', on_delete=models.PROTECT)
   price = models.CharField(max_length=24, verbose_name='Цена')

   def __str__(self):
       return self.title

class Motherboard(BaseProductInfo, models.Model):
    form_factor = models.CharField(max_length=24)
    chipset = models.CharField(max_length=24)
    ddr_version = models.CharField(max_length=24)
    m2_slots = models.CharField(max_length=24)

class Videocard(BaseProductInfo, models.Model):
    memory = models.CharField(max_length=24, verbose_name='Объём памяти')
    ddr_version = models.CharField(max_length=24, verbose_name='Тип памяти')
    bitness = models.CharField(max_length=24, verbose_name='Битность шины')
    frequency = models.CharField(max_length=24, verbose_name='Частота GPU')

class ProductCategory(models.Model):
   name = models.CharField(max_length=100, db_index=True)

   def __str__(self):
       return self.name
</code>
Хочу чтобы админ регистрируя товар, не выбирал категорию. Например, занося в админ панели товар 'Videocard' выбиралась указанная категория из бд.
Вторичный вопрос - правильно ли я подхожу к реализации?

Я не до конца понял вопрос, но если вы хотите автоматически проставлять категорию, исхрдя из названия товара, то можно это сделать примерно так:

# service.py
def save_product(product_data):
    keywords = {
        'motherboard': Motherboard,
        'videocard': Videocard,
        '': BaseProductInfo,
    }
    for word in keywords:
        if word in product_data.title:
            ProductModel = keywords[word]
            break

    product = ProductModel(**product_data)
    product.save()

# models.py
class BaseProductInfo(models.Model):
   title = models.CharField(max_length=24, verbose_name='Название')

class Motherboard(BaseProductInfo):
   chipset = models.CharField(max_length=24)

class Videocard(Videocard):
   memory = models.CharField(max_length=24, verbose_name='Объём памяти')

Также, если я не ошибаюсь, вам не нужно ставить
models.Model у подмоделей, тк класс
BaseProductInfo уже наследуется от неё.
P.S. Интересный вопрос, оказалось, что я не совсем правильно знал, как наследуются модели в django.
Ссылка для чтения
P.P.S. Возможно, я где-то ошибся в синтаксисе/вызове методов, но, думаю, разберётесь, здесь идея, как можно это реализовать, а не конечная реализация.
UPDATE
Возможно, более правильным будет сделать такую архитектуру хранения характеристик:

class ProductParameterType(Model):
    class ValueType:
        types = {
            0: 'string',
            2: 'integer',
        }
    name = CharField
    value_type = IntegerField(choices=ValueType.types)

class ProductType(Model):
    name = CharField
    parameters = ManyToMany(ProductParameterType)

class Product(Model):
    name = CharField
    product_type = ForeignKey(ProductType)

class ProductParameter(Model):
    product_type = ForeignKey(ProductType)
    product = ForeignKey(Product)
    value = CharField


Как правильно использовать GridSearchCV в sklearn?
Имею: код, строящий GridSearchCV с KNN классификатором.

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV

param_grid = [{'weights': ["uniform", "distance"], 'n_neighbors': [3, 4, 5, 6, 7, 8, 9]}]

KNN_clf = KNeighborsClassifier()
grid_search = GridSearchCV(KNN_clf, param_grid, cv=5, verbose=3)
grid_search.fit(train_data_values, train_data_labels)

Проблема: не могу понять, я могу использовать
grid_search после обучения как модель KNN или мне нужно вызвать метод
best_params grid_search'а, взять их и использовать в новом KNN классификаторе? Кто-нибудь может, пожалуйста, объяснить?

Вообще полезно читать документацию. Смотрим, что там пишут про метод
predict:

Call predict on the estimator with the best found parameters.

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


Последовательный алгоритм генерации из списка Python
Мне нужен генератор, который из списка
lettrs

rawlettrs = "01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
lettrs = list(rawlettrs)

генерировал бы бесконечное количество своеобразных "кодов".
Вот как должен выглядеть выход (запятые замените на переносы строк, в квадратных скобках мои пометки, которых не должно быть в генерации):

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, [Несколько миллисекунд спустя], Y, Z, a, b, [Еще мгновение...], z, 00, 01, 01, 03, 04, 05, 06, 07, 08, 09, 0A, [Еще пару миллисекунд спустя], 0z, 10, 11, 12, 13, [Пропустим некоторое время], zy, zz, 000, [И так до бесконечности]

def weird_gen():
    rawlettrs = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    for lettr in rawlettrs:
        yield lettr
    for prefix in weird_gen():
        for lettr in rawlettrs:
            yield prefix + lettr


Django. Разграничить права пользователей по клиентам
Имеем:
Django модель список клиентов (таблица в БД со списком клиентов и другой различной информацией)
Что требуется:
Предоставлять пользователям Django доступ к информации по определённому клиенту\клиентам (права на клиентов мы можем изменять)
т.е что бы при авторизации пользователя отображался список клиентов к информации о которых у пользователя есть доступ.
Прошу описать схему как это можно реализовать.

То что вам нужно называется ACL - access control list.
В django я бы делал так. Создаем модель, скажем в приложении
aclapp:

class ACL(models.Model):
  model_content_type = models.ForeignKey(
       ContentType, on_delete=models.CASCADE)
  object_id = models.CharField(max_length=30)
  username = models.CharField(max_length=30)

Запись в ACL будет означать, что пользователь
username имеет доступ к объекту с идентификатором
object_id типа описываемого
model_content_type.
Теперь нужно модифицировать менеджер, чтоб он учитывал эту таблицу в запросах:

class AclAwareManager(models.Manager):
    def __init__(self, username, model):
       self.username = username
       self.content_type = ContentType.objects.get_for_model(model)
       self.model = model
       self.name = 'acl_aware_for_{}'.format(username)

    def get_queryset(self):
        return super().get_queryset().filter(id__in=_get_acl_filter())

    def _get_acl_filter(self)
        return RawSQL("select object_id from aclapp_acl where username = %s and model_conent_type = %s",
            (self.username, self.content_type.id,))

И использовать в модели:

class Client(models.Model):

   name = models.CharField(...)
   ...

   def accessible_objects(self, user):
      return AclAwareManager(user.usename, Client)

Ну и теперь можно использовать менеджер например во view:

def clients_view(request):
   clients = Client.accessible_objects(request.user).filter(name='some name')

В
clients будет
queryset аналогичный
Client.objects.filter(name='имя'), только уже отфильтованный по таблице
acl. Т.е. его нужно использовать, как список объектов типа
Client.
На практике вместо
username обычно хранят группу, и смотрят на вхождение пользователя в группу. Так же обычно создают по ACL записи на разный вид действия - т.е. одна запись описывет, кто может читать, вторая - кто может модифицирвать и т.д.


не правильно работает код, по крайней мере не так задумывалось
Я написал рекурсивную функцию, и она выполняется больше раз чем надо, уже есть результат, но она как-то всё сбрасывает до начала работы.
вот код:
<code>
def multiply(string):

    if "*" in string:

        string=string.split(" ")

        multiply_index=[i for i, j in enumerate(string) if j=="*"]

        for i, j in enumerate(string):
            multiply_result=int(string[multiply_index[i]-1])*int(string[multiply_index[i]+1])

            del string[multiply_index[i]-1]

            del string[multiply_index[i]]

            string[multiply_index[i]-1]=str(multiply_result)

            string= " ".join(string)

            multiply(string)

            if len(multiply_index)==1:

                break

        print(string)

    else:

        string=" ".join(string)

        return string

multiply("3 * 3 * 2")
</code>

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

def multiply(string):
    if "*" in string:
        expression = string.split(" ")
        multiply_index = expression.index("*")
        multiply_result = int(expression[multiply_index-1]) * int(expression[multiply_index+1])

        return multiply(' '.join(expression[:multiply_index-1] + [str(multiply_result)] + expression[multiply_index+2:]))
    return string

А вот тот же алгоритм, но используя только цикл:

def multiply(string):
    expression = string.split(" ")
    while "*" in expression:
        multiply_index = expression.index("*")
        multiply_result = int(expression[multiply_index-1]) * int(expression[multiply_index+1])

        expression = expression[:multiply_index-1] + [str(multiply_result)] + expression[multiply_index+2:]
    return " ".join(expression)

Функции работают даже с выражениями которые содержат и другие операции, вычисляя в них только умножение (вдруг вы калькулятор пишете).
Например для
multiply("7 - 3 * 5 + 2 * 7")
результатом будет строка
7 - 15 + 14.


QStyledItemDelegate проблема с сохранением введённых данных
Когда жму энтер, или меняю фокус курсора на другую кнопку (но не на другую строку в таблице, тогда всё работает), то данные не сохраняются, при энтер вообще выделяются почему-то. setModelData не вызывается при нажатии на энтер.
sqlsuppliernumberformatdelegate.h:

#ifndef SQLSUPPLIERNUMBERFORMATDELEGATE_H
#define SQLSUPPLIERNUMBERFORMATDELEGATE_H

#include <QStyledItemDelegate>

class SqlSupplierNumberFormatDelegate : public QStyledItemDelegate {
public:
    explicit SqlSupplierNumberFormatDelegate(QObject *parent = nullptr);

protected:
    QString displayText(const QVariant& value, const QLocale& locale) const override;
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
    void setEditorData(QWidget *editor, const QModelIndex &index) const override;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
                          const QModelIndex &index) const override;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
                              const QModelIndex &index) const override;
    bool eventFilter(QObject*, QEvent *event) override;
};

#endif // SQLSUPPLIERNUMBERFORMATDELEGATE_H

sqlsuppliernumberformatdelegate.cpp:

#include "sqlsuppliernumberformatdelegate.h"
#include "doublespinbox.h"
#include <QDoubleSpinBox>
#include <QEvent>
#include <QLineEdit>
#include <QValidator>
#include <QDebug>
#include <QComboBox>

SqlSupplierNumberFormatDelegate::SqlSupplierNumberFormatDelegate(QObject *parent) : QStyledItemDelegate(parent) {
}

QString SqlSupplierNumberFormatDelegate::displayText(const QVariant& value, const QLocale& locale) const {
    switch(static_cast<QMetaType::Type>(value.type())){
        case QMetaType::Float:
            return locale.toString(value.toFloat(), 'f', 0);
        case QMetaType::Double:
            return locale.toString(value.toDouble(), 'f', 0);
        default:
            return QStyledItemDelegate::displayText(value, locale);
    }
}

QWidget* SqlSupplierNumberFormatDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& option, const QModelIndex& index) const {
    DoubleSpinBox* editor = new DoubleSpinBox(parent);
    return editor;
}

void SqlSupplierNumberFormatDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    double value = index.model()->data(index, Qt::EditRole).toDouble();
    DoubleSpinBox *spinBox = static_cast<DoubleSpinBox*>(editor);
    spinBox->setValue(value);
}

void SqlSupplierNumberFormatDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    DoubleSpinBox *spinBox = static_cast<DoubleSpinBox*>(editor);
    spinBox->interpretText();
    double value = spinBox->value();

    model->setData(index, value, Qt::EditRole);
}

void SqlSupplierNumberFormatDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

bool SqlSupplierNumberFormatDelegate::eventFilter(QObject*, QEvent* event) {
    return event->type() == QEvent::Wheel;
}

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

QWidget* SqlSupplierNumberFormatDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& option, const QModelIndex&) const {
    DoubleSpinBox* editor = new DoubleSpinBox(parent);
    connect(editor, &DoubleSpinBox::editingFinished, this, &SqlSupplierNumberFormatDelegate::endEditor);
    return editor;
}

Метод, отсылающий сигналы:

void SqlSupplierNumberFormatDelegate::endEditor() {
    commitData(qobject_cast<DoubleSpinBox*>(sender()));
    closeEditor(qobject_cast<DoubleSpinBox*>(sender()));
}


Помогите написать программу на Python [закрыт]

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

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

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

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

Помогите реализовать программу обработки имен пользователей (
деНиС - преобразовать к
Денис)
Или подскажите, как мне реализовать данную программу.

Вот пример как из строки
'деНиС'

'деНиС'.title() # Денис


Присвоение функцией ключей словаря одной переменной, а значений - другой
Данный код возвращает элемент словаря и все ключи, но мне нужно понять как возвращать ключ возвращенного элемента?
<code>
def getRandomWord(wordDict):  # получение секретного слова из списка
    wordKey = random.choice(list(wordDict.keys()))
    wordIndex = random.randint(0, len(wordDict[wordKey])-1)

    return wordDict[wordKey][wordIndex]

secretWord, secretSet = getRandomWord(words), str(words.keys())
</code>

Если я правильно понял:
<code>
def getRandomWord(wordDict):  # получение секретного слова из списка
    wordKey = random.choice(list(wordDict.keys()))
    wordIndex = random.randint(0, len(wordDict[wordKey])-1)

    return wordDict[wordKey][wordIndex], wordKey # добавил возвращение ключа

secretWord, secretKey = getRandomWord(words) # ключ берём из возврата функции, как и слово
</code>
Вы можете вернуть из функции всё, что хотите, в виде списка значений через запятую, и присвоить эти полученные из функции значения списку переменных. Фактически из функции при этом возвращается кортеж, который потом "распаковывается" в список переменных, но это уже детали.


Как реализовать многопоточность в телеграм боте?
Я испрлЬзую aiogram для работы с телегой и мне нужно реализовать многопотчность одной функции:

def check_cred(LastName:str,FirstName:str,MidName:str,number:int):
    browser = webdriver.PhantomJS(executable_path='/home/minicx/Документы/rcoi/phantomjs')
    wait=WebDriverWait(browser,500)
    browser.get('xxxxx')
    wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="ctl00_LastName"]')))
    browser.find_element_by_xpath('//*[@id="ctl00_LastName"]').send_keys(LastName)
    browser.find_element_by_xpath('//*[@id="ctl00_FirstName"]').send_keys(FirstName)
    browser.find_element_by_xpath('//*[@id="ctl00_MidName"]').send_keys(MidName)
    browser.find_element_by_xpath('//*[@id="ctl00_Number"]').send_keys(number)
    browser.find_element_by_xpath('//*[@id="ctl00_AcceptDataProcessing"]').click()
    wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="ctl00_LoginButton"]')))
    browser.find_element_by_xpath('//*[@id="ctl00_LoginButton"]').click()
    try:
        if (browser.find_element_by_xpath('/html/body/form/table/tbody/tr[1]/td[2]/div/table/tbody/tr/td/table/tbody/tr[6]/td').text.find("Неудачно")!=-1):
            return False
    except:
        return True

А вот кусочек из телеграмма:

   with concurrent.futures.ThreadPoolExecutor() as executor:
        try:
            succesfull=executor.submit(lambda : scraper.check_cred(info[0],info[1],info[2],int(info[3]))).result()
        except Exception: succesfull=False; await bot.send_message(message.chat.id,"Неверные данные!")

Проблема в том, что в обработчике вызывается
result(). Эта функция останавливает текущий поток, пока не будет готов результат (т.е. не закончит свое выполнение и не выполнит return) функции, которую передали в
submit.
Правильно решение, это закончить обработчик стразу же, но после окончания работы функции из другого потока, продолжить выполнение:
Если было:

with concurrent.futures.ThreadPoolExecutor() as executor:
  try:
     succesfull=executor.submit(lambda : scraper.check_cred(info[0],info[1],info[2],int(info[3]))).result()
  except Exception:
     succesfull=False
     await bot.send_message(message.chat.id,"Неверные данные!")
if successful:
     await bot.send_message(message.chat.id, "Успех!")

Нужно сделать так:

async def continue_after_check(successful, chat_id):
  if successful:
     await bot.send_message(chat_id, "Успех!")
  else:
     await bot.send_message(chat_id, "Неверные данные!")

def check_cred(loop, scraper, info, chat_id):
  try:
    successful = scraper.check_cred(info[0],info[1],info[2],int(info[3])))
  except:
    successful = false
  asyncio.run_coroutine_threadsafe(
        continue_after_check(successful, chat_id), loop)

# код в обработчике сообщения
asyncio.to_thread(
   check_cred, asyncio.get_event_loop(), scraper, info, message.chat.id
)

# можно и через ThreadPoolExecutor
with concurrent.futures.ThreadPoolExecutor() as executor:
  executor.submit(check_cred, asyncio.get_event_loop(), scraper, info, message.chat.id)


Как добавлять значения с определённой строки?
Имеется следующая проблема: есть выгрузка порядка 800строк, знаю, что до 550 строки идёт 2019 год, а после 550 строки 2020. В датафрейме изначально не было столбца с годами, требуется добавить года. Собственно вопрос, как добавлять значения до определённой строки? Задача вроде простая, но не знаю как реализовать задуманное. Думаю сделать так, но везде выводит 2020
<code>
def col_year(year):
    if len(str(df)) <550:
        normal_year= str(year) + '19'
    else:
        normal_year = str(year) + '20’
    return str(normal_year)
</code>
Может быть найти один определенный индекс и от него изменять все? Прошу помощи!

Поидее вам нужно просто список с годами, первые 550 элементов списка со значением 2019, остальные 250 - 2020

col_year = ['2019']*550 + ['2020']*250

И затем добавить его в DataFrame

df['col_year'] = col_year


Объединить словари
Как объединить два словаря с выводом значений с одинаковыми ключами и с выводом None если ключ значение только одно

a = {'a': 1, 'b': 2, 'c': 3}
b = {'c': 3, 'd': 4, 'e': 5}

def vmeste(a, b):
    for k, v in b.items():
        if a.get(k):
            a[k] = [a[k], v]
        else:
            a[k] = [None, v]
    return a

print(vmeste(a, b))

На выходе

{'a': 1, 'b': 2, 'c': [3, 3], 'd': [None, 4], 'e': [None, 5]}

А хочу

{'a': [1, None], 'b': [2, None], 'c': [3, 3], 'd': [None, 4], 'e': [None, 5]}

Для
get можно задать значение по умолчанию, так что тут можно просто взять
get у обоих словарей с дефолтным значением
None. А перебирать тут нужно объединение ключей обоих словарей. Без
sorted почему-то порядок следования ключей получается какой-то некрасивый, пришлось дополнительно сортировать.

a = {'a': 1, 'b': 2, 'c': 3}
b = {'c': 3, 'd': 4, 'e': 5}

c = {k:[a.get(k, None), b.get(k, None)] for k in sorted(set(a)|set(b))}
print(c)

Вывод:

{'a': [1, None], 'b': [2, None], 'c': [3, 3], 'd': [None, 4], 'e': [None, 5]}


Как удалить все элементы, идущие после максимального элемента?
Необходимо осуществить поиск максимального элемента и затем удалить
все элементы идущие после максимального в двумерном массиве 3x3.
Мой код максимальный элемент находит, но я не знаю как удалить элементы после него:

matrix = [
    [3, 7, 5],
    [9, 8, 1],
    [6, 2, 4]
]

mx = matrix[0][0]

for row in matrix:
    mx_ = max(row)
    if mx_ > mx:
        mx = mx_

Что должно получиться в итоге:

matrix = [
    [3, 7, 5],
    [9, 0, 0],
    [0, 0, 0]
]

matrix = [
    [3, 7, 5],
    [9, 8, 1],
    [6, 2, 4]
]

row_with_max = max(matrix, key=lambda x: max(x))  # строка с максимальным значением
i_max = matrix.index(row_with_max)                # индекс строки
j_max = row_with_max.index(max(row_with_max))     # индекс столбца
flat_index = i_max*len(matrix)+j_max              # индекс в плоском списке

и "забейте нулями" все, что идет после:

for i in range(len(matrix)):
    for j in range(len(matrix[0])):
        if flat_index < i*len(matrix)+j:
            matrix[i][j] = 0

теперь в matrix:

>>> matrix
[
    [3, 7, 5],
    [9, 0, 0],
    [0, 0, 0]
]


Как извлечь подстроки по определённому разделителю с помощью регулярных выражений?
Есть строка, например
'POLSTOPLFKSTOPKOIUNSTOPSTOP1STOP'.
С помощью регулярных выражений (модуль re в Python) нужно извлечь из этой строки следующие подстроки:
POL,
LFK,
KOIUN,
1, т.е. обозначить границы слова другим словом -
STOP.
Я попробовал это сделать с помощью:

res = [_ for _ in re.findall(r'[^STOP]+', line)]

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

my_str = 'POLSTOPLFKSTOPKOIUNSTOPSTOP1STOP'

Просто разбейте строку по 'STOP' и выберите непустые подстроки:

my_list = [w for w in my_str.split('STOP') if w]

в my_list будет:

>>> my_list
['POL', 'LFK', 'KOIUN', '1']


Как обновлять окно в PySimpleGUI в реальном времени
у меня есть такой код
<code>
import PySimpleGUI as sg
import pyodbc
from datetime import datetime
connection = pyodbc.connect(("Driver={ODBC Driver 17 for SQL Server};Server=*******;Database=Test1;Trusted_Connection=yes;UID=sa;PWD=*******8"))
dbCursor = connection.cursor()
sg.theme('dark grey 9')
now = datetime.now()
Datatime = datetime.now()
print(datetime.now())
def UpdateList():
    dbCursor.execute("select Tovar from BazaMSK")
    data = dbCursor.fetchall()
    new_list = ['']
    for word in data:
        new_str = ''
        for w in word:
            if w.isalpha():
                new_str += w
        new_list.append(new_str)
    new_str = ','.join(w for w in new_list if w)
    return new_list
layout = [
    [sg.Text('Введите товар'),sg.Listbox(UpdateList(), size=(8,15), key='-KTovar1-'),sg.InputText(size=(50,6),key='-KTovar2-')],
    [sg.Text('Количество товара'),sg.InputText(size=(8,3),key='-KCountTovar-')],
    [sg.Output(size=(88, 20),key="-KInputText-")],
    [sg.Submit("Сохранить"), sg.Cancel("Обновить")]
]
window = sg.Window('Поставки', layout)
#Тут надо обновить список чтобы можно было выбрать в интерфейсе новое значение
event, values = window.read()
while event not in (None,"Exit"):
    event, values = window.read()
    if event == "Сохранить":
        sql = 'EXEC [dbo].[BazaData] @Tovar=?,@Count=?,@Data=?'
        params = (values['-KTovar2-'], values['-KCountTovar-'], Datatime)
        dbCursor.execute(sql, params)
        dbCursor.commit()
        print(params)
    if event == "Обновить":
        values['-KTovar1-']=UpdateList()
    window.refresh()
</code>
все значения передаються и сохраняются в ms sql таблице. все работает хорошо, но интерфейс не обновляется

Обновление списка значений элемента
Listbox нужно делать так:

window['-KTovar1-'].update(values=UpdateList())


При попытке парсинга кода регулярными выражениями выводится ошибка
Я делаю скриптовый язык, и у меня проблема разбиения кода на токены. У меня есть файл Lexer.py:

from game.sl.TokenType import token_types_list
from game.sl.Token import *
class Lexer:
    def __init__(self, code):
        self.code = code
        self.pos = 0
        self.token_list = []

    def lex_analysis(self):
        while self.next_token():
            self.next_token()
        self.token_list = self.filter_list()
        return self.token_list

    def filter_list(self):
        """
        Фильтруем список токенов от пробелов
        """
        token_list = []
        for token in self.token_list:
            if token.type != token_types_list['SPACE']:
                token_list.append(token)
        return token_list

        def next_token(self):
        """
        Функция для разбиения кода на токены
        Мы берем из типа токена его регулярное выражение, смотрим, совпадает ли
        он с текущим токеном, и если да, то делаем новый токен, если нет,
        то берем новую регулярку из словаря и
        повторяем до тех пор, пока не закончится код
        """
        if self.pos >= len(self.code):
            return False
        for token_type in token_types_list.values():
            result = re.match(r'^' + token_type.regex, self.code[int(self.pos):])
            if result and result.group(0):
                token = Token(token_type, result.group(0), self.pos)
                self.pos += len(result.group(0))
                self.token_list.append(token)
                return True

Также имеется файл TokenType.py, в котором задаются все типы токенов, которые будут использоваться в языке:

class TokenType:

    def __init__(self, name, regex):
        self.name = name
        self.regex = regex

token_types_list = {
    'PLUS': TokenType('PLUS', r'+'),
    'MINUS': TokenType('MINUS', r'-'),
    'ASSIGN': TokenType('ASSIGN', r'='),
    'CONDITIONAL': TokenType('CONDITIONAL', r'if'),
    'EQUAL': TokenType('EQUAL', r'=='),
    'COLON': TokenType('COLON', r':'),
    'COMMA': TokenType('COMMA', r','),
    'SEMICOLON': TokenType('SEMICOLON', r';'),
    'SET_IMAGE': TokenType('SET_IMAGE', r'set_image'),
    'SET_SPRITES': TokenType('SET_SPRITES', r'set_sprites'),
    'SET_SPRITE': TokenType('SET_SPRITE', r'set_sprite'),
    'SET_AUDIO': TokenType('SET_AUDIO', r'set_audio'),
    'MIX_AUDIO': TokenType('MIX_AUDIO', r'mix_audio'),
    'SET_TEXT': TokenType('SET_TEXT', r'set_text'),
    'ADD_DIALOG': TokenType('ADD_DIALOG', r'add_dialog'),
    'SPACE': TokenType('SPACE', r'[ \n\t\r]'),
    'LPAR': TokenType('LPAR', r'\('),
    'RPAR': TokenType('RPAR', r'\)'),
    'STRING': TokenType('STRING', r'".*"'),
    'NUMBER': TokenType('NUMBER', r'[0-9]*'),
    'VARIABLE': TokenType('VARIABLE', r'\w*'),
}

И, собственно, конструктор токена в файле Token.py:

from game.sl.TokenType import *

class Token:

    def __init__(self, type: TokenType, text, pos):
        self.type = type
        self.text = text
        self.pos = pos

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

set_image "resources/arts/street.img";
set_audio "resources/audio/street.mp3";
set_text "Text";
choice = add_dialog "first" "second" "third";

Но при запуске лексера выводится ошибка:

re.error: nothing to repeat at position 1

Если посмотреть, что прилетает в re.match, то получится такой текст:

print('^' + token_type.regex, ' ', self.code[self.pos:], ' ', self.pos)

# ^+   set_image "resources/arts/street.img";
# set_audio "resources/audio/street.mp3";
# set_text "Text";
# choice = add_dialog "first" "second" "third";   0

Почему она появляется?

Я понял в чем причина. Ошибка прилетала, когда цикл доходил до +, -, =, и т.д.
Я просто поставил перед ними \ и все заработало.


Как увеличить скорость работы программы, при переборе?
Мне нужно написать программу для взлома шифра Виженера. Собственного говоря, я её написал, но столкнулся с проблемой, которая связана со поиска ключа. Получив возможный размер ключа, я основываясь на частоте символов в тексте предполагаю, из каких букв может состоять это слово. А чтобы вручную не перебирать все возможные варианты слова, я пытаюсь найти данное слово в словаре. Для сокращения времени поиска слова в словаре использую программу grep, так как мой поиск будет куда хуже. Но несмотря ни на что, программа ищет слово крайне долго. Допусти слово "кот" она искала минут 15.
<code>
from collections import Counter
import itertools
import subprocess
import sys

ru_alphabet = ('а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф',
               'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', '_')

def test_kasiski(text: str) -> list: # тут получаю длинну слова
    size_select_block = 3
    counter_size = []
    select_str_block = []
    for index_start_letter in range(len(text) - size_select_block):
        select_str = text[index_start_letter: index_start_letter + size_select_block]
        if select_str in select_str_block:
            continue
        select_str_block.append(select_str)
        index_start = index_start_letter
        index_end = index_start_letter
        counter = 0
        for index_letter in range(index_start_letter + size_select_block, len(text) - size_select_block):
            if select_str == text[index_letter: index_letter + size_select_block]:
                index_end = index_letter
                counter += 1

        if index_start == index_end:
            continue
        else:
            counter_size.append((index_end - index_start, counter, select_str_block[-1]))

    counter_size = sorted(counter_size, key=lambda x: x[1], reverse=True)
    counter_size = [item for item in counter_size if item[1] != 0]

    return counter_size

def split_text_parts(text: str, size_key: int) -> list: # использую для записи букв в блоки
    part = [[] for _ in range(size_key)]
    for index_letter in range(0, len(text), size_key):
        for index in range(size_key):
            part[index].append(text[index_letter + index:index_letter + index + 1])
    return part

def gen_code(text, lang) -> list: # получаю список индексов букв из словаря
    num_key = []
    for letter in list(text):
        num_key.append(lang.index(letter))
    return num_key

def devi(text, key, lang=ru_alphabet) -> str:
    code_key = gen_code(key, lang)
    text_key = gen_code(text, lang)

    code_text_key = []
    index_letter = 0
    mod = len(lang)
    while index_letter < len(text_key):
        for iter in range(len(code_key)):
            index_code_letter = (text_key[index_letter] - code_key[iter]) % mod
            code_text_key.append(lang[index_code_letter])
            index_letter += 1
            if index_letter >= len(text_key):
                break
    str_text = "".join(code_text_key)
    return str_text

def get_text(text: str, block: list):
    for select_key in range(len(block[0])):
        key = [elem[select_key][0] for elem in block]
        key = "".join(key)
        text = text.replace("\n", "")
        print(devi(text, key))
        select = input("\n>")
        if select == '1':
            return "OK"

# [[('г', 25), ('д', 11), ('й', 10)], [('н', 26), ('ь', 15), ('ъ', 8)], [('я', 16), ('р', 15), ('щ', 11)], [('й', 22), ('п', 12), ('к', 11)], [('_', 17), ('е', 10), ('в', 8)]]
def all_combinations(list_combinations, size_key):
    all_combinations = ""
    for elem in list_combinations:
        all_combinations = all_combinations + "".join([l[0] for l in elem])

    list_comb = list(itertools.combinations(all_combinations, size_key))
    str_comb = ["".join(elem) for elem in list_comb]
    return str_comb

def h_vi(text: str, list_counter_size: list):
    for counter_size in list_counter_size:
        for size_key in range(1, counter_size[0]):
            if counter_size[0] % size_key != 0:
                continue

            size_key = 3 # можно удалить(использую, чтобы поиск начинался сразу с нужной длинны)

            text_parts = split_text_parts(text, size_key) # делю текст на части
            block = []
            for part in text_parts:
                count_part = Counter(part)
                block.append(count_part.most_common(10)) # беру 10 самых часто встечаемых буквы в блоке

            text = text.replace("\n", "")
            # тут наинается перебор
            all_combinators = all_combinations(block, size_key) # все возможные комбинации букв
            if sys.platform.startswith('linux'):
                for str_ in all_combinators:
                    find_word = subprocess.run(['grep', "-w", f'{str_}', 'russian.txt'],
                                               stdout=subprocess.PIPE, text=True).stdout.split('\n') # перебираю все возможные комбинации и ищу совпадения в словаре
                    if len(find_word) == 1: # если ничег не нашо, то беру следующую комбинацию
                        continue
                    # тут заканчивается
                    if str_ in find_word: # если есть совпадение, то декодиру, если ответ не == 1 продолжаю
                        print("#\n", str_)
                        print(devi(text, str_))
                        select = input(">")
                        if select == '1':
                            return "OK"
            else:  # тут происходит чистый перебор(но на него безразницы)
                for i in range(len(all_combinators)):
                    if size_key == 1:
                        for elem in all_combinators:
                            if elem == " " or elem == "_":
                                continue
                            print(devi(text, elem))
                            select = input("\n>")
                            if select == '1':
                                return "OK"
                        break
                    with open("russian.txt", "r") as word:
                        while True:
                            select_word = word.readline().replace("\n", "")
                            if not select_word:
                                break
                            if all_combinators[i] == select_word:
                                c = all_combinators[i]
                                g = 0
                                print(devi(text, c))
                                select = input("\n>")
                                if select == '1':
                                    return "OK"

    return None

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

if __name__ == "__main__":
    text = "цьыйтромсыоюдвсаувьымянаъофтщсфьхоосчусмнйэ_ьэнщкычцьхйьяйафкфтьйсыууинщкягкръхнъйщдаечйрмоаюк_нйычйъ_ннчньсщюъцубйтбэсъцнякаькняшнушфчйъ_унькштинвфаькнвйп_хйядъсыццп_нйцсоуяенъйы_айсчусш_жштрйыъйетнасщю_айсфоьшусчцщфьчйш_мобы_фшнашщдрцфшс_йхтлофхмгенчцасщьцэеьтнашэбкрэи_нйэчаоэеы_йэ_оы_ыцгенэпштъягмьсмхцдвтьйстнцэътьйсщю_йячлмсфьхоосрусаубьнфшхнцугй_члмсьоьйтдцоэйъ_хьцшчсщьфпятйщчьмсмнадщъйытйэ_а__мижйрвпрмбычунфшщчзнщпрчыосчовхуцчцьйрвпвсыр_твсъьцчижйтбэхнинэзтютщмйцсъавхоякнвйсчъьчцнюшухшнбшътчослущйэбптъыщ_мцыйячуншпникясщьщмьэе_чйэ_сытфьют_нйртын_чухтысоьуъиыйъ_унаъцрьуэенбштъхярйытйпбпстяняпрмйсцпнюшфчьнуд_нйю_оцэтянйрмйцэтнухцвьоэтнюшчсацгк_чхйсьоюйычфьхооснаэищстнрйы_йрбптччнвпрчънцхмсцуяи"
# print(devi(text, 'кот')) # у text ключ - "кот"
    all = test_kasiski(text)  # тут не существенных проблем
    a = h_vi(text, all) # а вот тут проблемы со скоростью
    print(a)
</code>
Ума не приложy, как ускорить работу программы. Можете что-то посоветовать ?
Проблемная часть отмечена (тут начинается перебор) - (тут заканчивается)

Если предварительно загрузить файл со словами в память, то ищет мгновенно.
<code>
def h_vi(text: str, list_counter_size: list):
    with open("russian.txt", "r", encoding="utf-8") as f:
        words_rus = set(s.strip() for s in f.readlines())

    for counter_size in list_counter_size:
        for size_key in range(1, counter_size[0]):
            if counter_size[0] % size_key != 0:
                continue

            size_key = 3 # можно удалить(использую, чтобы поиск начинался сразу с нужной длинны)

            text_parts = split_text_parts(text, size_key) # делю текст на части
            block = []
            for part in text_parts:
                count_part = Counter(part)
                block.append(count_part.most_common(10)) # беру 10 самых часто встечаемых буквы в блоке

            text = text.replace("\n", "")
            # тут наинается перебор
            all_combinators = all_combinations(block, size_key) # все возможные комбинации букв

            for str_ in all_combinators:
                if str_ in words_rus: # если есть совпадение, то декодиру, если ответ не == 1 продолжаю
                    print("#\n", str_)
                    print(devi(text, str_))
                    select = input(">")
                    if select == '1':
                        return "OK"
</code>
Проверял под Windows, предварительно найдя какой-то файлик с русскими существительными в 34_000 строк (штук).


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

word: testi
    t
    te
    tes
    test
    testi

мой код:

s=input("word: ")
while len(s)>0:
    print(s[0])
    s=s[1:]

Cпасибо

Проходимся по каждому символу в строке:
<code>
s = input("word: ")
for i in range(len(s)):
    print(s[:i + 1])
</code>


Почему массив первый раз проходит, а на второй начинает ругаться? [Python]

N = 452022
count = 0
while count !=5:
    de = []
    di = N // 2
    d = 2
    for d in range(2,di):
        if N % d == 0:
            de.append(d)
    M = (de[0] + de[-1])
    if M % 7 == 3:
        print(N, M)
        de = []
        count +=1
    N +=1

M = (de[0] + de[-1])
IndexError: list index out of range

<code>
 N = 452022
 count = 0
 while count !=5:
     de = []
     di = N // 2
     for d in range(2,di+1):
         if N % d == 0:
             de.append(d)
         if len(de) > 1:
            M = (de[0] + de[-1])
            if M % 7 == 3:
            print(N,M)
            count +=1
 N +=1
</code>
Проблема была в том, что делитель, который идёт в массив может быть всего один. Поэтому нужно проверять количество делителей.


Поиск в json, просмотр ответа и запись его в excel
Здраствуйте.
Я делаю запрос к сайту и получаю ответ json. Как пример (не полный):

"AssetID": "1452cdc-2839-543e6-892a-c86356e4bb558",
      "Title": "Silver Sword",  # Это мне нужно вытащить
      "Offer": {
        "OfferID": "111",
        "Price": {
          "Currency": "Gold",
          "Amount": 0.1  # Это добавить в ячейку для подсчёта общей стоимости всех таких же предметов
        },
        "Fee": null,
        "CreatedDate": "1623766719"
      },
      "MarketPrice": null,
      "InstantPrice": null,
      "ClassID": "0:222"
    },

Таких ответ = количеству предметов у меня в инвентаре. Они могу быть одинаковыми по ['Title']. Т.е если у меня 10 Silver Sword в инвентаре, то json ответ выдаст 10 блоков с одним и тем же ['Title'].
Задача у меня стоит такая. Каждый найденный предмет с одинаковым названием не дублировать ниже, а просто прибавлять +1 к количеству в соседней строке excel. Как вариант делать это через:

if weapon.find('Silver Sword') != -1: # поиск по названию
    sheet_active[row][4].value = 'Silver Swords' # запись в ячейку.
    sheet_active[row][5].value = sum(weapon_price) # попытка суммировать сумму (неудачная)

И тогда повторной записи внизу не будет, но! В таком случае ячейка закрепляется за предметов и если она из инвентаря исчезнет, то в таблице будет пробел...
Так же нужно в след. ячейку суммировать сумму этих предметов...

import json
import requests
from datetime import datetime
import openpyxl

r = requests.get(url4, headers=headers)  # Offers Status
    get_request = json.loads(r.text)
    row = 3
    for item in get_request['Items']:
        weapon = item['Title']
        weapon_price = item['Offer']['Price']['Amount']
        if weapon.find('Silver Sword') != -1:  # поиск по названию
            sum = 0
            sheet_active[row][4].value = 'Silver Swords'  # запись в ячейку.
            sheet_active[row][5].value = sum(weapon_price)
        elif item in get_request['Items']:
            row + 1
            sum = 0
            sheet_active[row][4].value = 'Gold Sword'
            sheet_active[row][5].value = sum(weapon_price)
            row + 1

Каким образом это должно выглядеть в excel:

    ITEM         Quantity                          Price
Silver Sword        3 #+1 за каждый найденный       0.2 # Просто цена, либо цена всех найденных предметов по названию. (не сильно важно)

Подскажите пожалуйста каким образом это лучше сделать...

a = {"AssetID": "1452cdc-2839-543e6-892a-c86356e4bb558",
     "Title": "Silver Sword",
     "Offer": {
         "OfferID": "111",
         "Price": {
             "Currency": "Gold",
             "Amount": 0.1
         },
         "Fee": 'null',
         "CreatedDate": "1623766719"
     },
     "MarketPrice": 'null',
     "InstantPrice": 'null',
     "ClassID": "0:222"
     }, {"AssetID": "1452cdc-2839-543e6-892a-c86356e4bb558",
         "Title": "Silver Sword",
         "Offer": {
             "OfferID": "111",
             "Price": {
                 "Currency": "Gold",
                 "Amount": 0.2
             },
             "Fee": 'null',
             "CreatedDate": "1623766719"
         },
         "MarketPrice": 'null',
         "InstantPrice": 'null',
         "ClassID": "0:222"
         }, {"AssetID": "1452cdc-2839-543e6-892a-c86356e4bb558",
             "Title": "Silver Sword",
             "Offer": {
                 "OfferID": "111",
                 "Price": {
                     "Currency": "Gold",
                     "Amount": 0.3
                 },
                 "Fee": 'null',
                 "CreatedDate": "1623766719"
             },
             "MarketPrice": 'null',
             "InstantPrice": 'null',
             "ClassID": "0:222"
             }, {"AssetID": "1452cdc-2839-543e6-892a-c86356e4bb558",
                 "Title": "Silver Sword",
                 "Offer": {
                     "OfferID": "111",
                     "Price": {
                         "Currency": "Gold",
                         "Amount": 0.4
                     },
                     "Fee": 'null',
                     "CreatedDate": "1623766719"
                 },
                 "MarketPrice": 'null',
                 "InstantPrice": 'null',
                 "ClassID": "0:222"
                 }, {"AssetID": "1452cdc-2839-543e6-892a-c86356e4bb558",
                     "Title": "Silver Sword 1",
                     "Offer": {
                         "OfferID": "111",
                         "Price": {
                             "Currency": "Gold",
                             "Amount": 0.4
                         },
                         "Fee": 'null',
                         "CreatedDate": "1623766719"
                     },
                     "MarketPrice": 'null',
                     "InstantPrice": 'null',
                     "ClassID": "0:222"
                     }, {"AssetID": "1452cdc-2839-543e6-892a-c86356e4bb558",
                         "Title": "Silver Sword 1",
                         "Offer": {
                             "OfferID": "111",
                             "Price": {
                                 "Currency": "Gold",
                                 "Amount": 0.4
                             },
                             "Fee": 'null',
                             "CreatedDate": "1623766719"
                         },
                         "MarketPrice": 'null',
                         "InstantPrice": 'null',
                         "ClassID": "0:222"
                         }, {"AssetID": "1452cdc-2839-543e6-892a-c86356e4bb558",
                             "Title": "Silver Sword 2",
                             "Offer": {
                                 "OfferID": "111",
                                 "Price": {
                                     "Currency": "Gold",
                                     "Amount": 0.7
                                 },
                                 "Fee": 'null',
                                 "CreatedDate": "1623766719"
                             },
                             "MarketPrice": 'null',
                             "InstantPrice": 'null',
                             "ClassID": "0:222"
                             }, {"AssetID": "1452cdc-2839-543e6-892a-c86356e4bb558",
                                 "Title": "Silver Sword 2",
                                 "Offer": {
                                     "OfferID": "111",
                                     "Price": {
                                         "Currency": "Gold",
                                         "Amount": 0.6
                                     },
                                     "Fee": 'null',
                                     "CreatedDate": "1623766719"
                                 },
                                 "MarketPrice": 'null',
                                 "InstantPrice": 'null',
                                 "ClassID": "0:222"
                                 }

x = []  # создадим новый список
for i in a:  # пройдёмся циклом по всем элементам
    x.append({i['Title']: i['Offer']['Price']['Amount']})  # добавим в список словарь вида {Title: Amount}

print(x)

y = {}
for b in x:
    for d, e in b.items():
        if d in y:  # если ключ (Title) уже есть в словаре
            y[d] += e  # прибавим к значению (Amount)
        else:
            y[d] = e  # иначе добавим пару ключ: значение

print(y)
print('количество предметов:', len(y.items()))
print('общая стоимость предметов:', sum(y.values()))

[{'Silver Sword': 0.1}, {'Silver Sword': 0.2}, {'Silver Sword': 0.3}, {'Silver Sword': 0.4}, {'Silver Sword 1': 0.4}, {'Silver Sword 1': 0.4}, {'Silver Sword 2': 0.7}, {'Silver Sword 2': 0.6}]

{'Silver Sword': 1.0, 'Silver Sword 1': 0.8, 'Silver Sword 2': 1.2999999999999998}
количество предметов: 3
общая стоимость предметов: 3.0999999999999996


Как разделить слишком длинное сообщение Telegram-бота на несколько коротких?
Всем привет! Проблема такова: пишу простенького Telegram-бота, который выдаёт интересные упражнения по выбору со встроенной кливиатуры. Но дело в том, что текст сообщений с упражнениями зачастую превышает лимит в 4096 знаков. Искал, гуглил, пытался перестроить найденные варианты под свой код, но ничего не выходит. Буду очень благодарен, если поможете решить проблему.
Вот, собственно, код для выдачи рандомного варианта из списка упражнений по нажатию на клавишу '🧠 Память'.
<code>
@bot.message_handler(content_types=['text'])
def exercise(message):
    if message.chat.type == 'private':
        if message.text == '🧠 Память':
            markup = types.InlineKeyboardMarkup(row_width=1)
            item1 = types.InlineKeyboardButton("🧠 Другое упражнение", callback_data='memory_another')
            markup.add(item1)
            bot.send_message(message.chat.id, str(random.choice(memory_tasks)), parse_mode='html', reply_markup=markup)
</code>

Определил переменную
MESS_MAX_LENGTH
Отправку сделал через цикл (прелесть в том, что если сообщение и будет меньше
MESS_MAX_LENGTH, то все-равно код цикла выполнится)

Пример:

MESS_MAX_LENGTH = 4096

@bot.message_handler(content_types=['text'])
def exercise(message):
    if message.chat.type == 'private':
        if message.text == '🧠 Память':
            markup = types.InlineKeyboardMarkup(row_width=1)
            item1 = types.InlineKeyboardButton("🧠 Другое упражнение", callback_data='memory_another')
            markup.add(item1)

            text = str(random.choice(memory_tasks))
            for x in range(0, len(text), MESS_MAX_LENGTH):
                mess = text[x: x + MESS_MAX_LENGTH]
                bot.send_message(message.chat.id, mess, parse_mode='html', reply_markup=markup)


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

Year?: 2019

Year 2019 next leap year 2020

Year?: 2020

Year 2020 is leap year and next leap year 2024

Мой код:

i = int(input("Year?:  "))
while i % 400==0 and i % 4 == 0 and i % 100!=0:
    print("Year is a leap year", i, "next leap year", i + 4 )

else:
    print("Year", i, "next leap year", i +1 )

Проверяем высокосный ли это год. Если нет к текущему году прибавляем еще
y % 4.

from calendar import isleap

def next_leap(y):
    y += 4 - y % 4
    return y if isleap(y) else y + 4

print(next_leap(2012)) # 2016
print(next_leap(2017)) # 2020
print(next_leap(2020)) # 2024


Как избавиться от непечатаемых символов в списке
Есть такой список с такими значениями

x = [['\ufeffstring1', '\ufeffstring2', 123], ['string3', 'string4', 123], ['string5', 'string6', 123]]

Как избавиться от непечатаемых символов

x = [['string1', 'string2', 123], ['string3', 'string4', 123], ['string5', 'string6', 123]]

[[''.join(filter(str.isascii, j)) if isinstance(j, str) else j for j in i] for i in x]

На выходе:

[['string1', 'string2', 123],
 ['string3', 'string4', 123],
 ['string5', 'string6', 123]]


TypeError: 'builtin_function_or_method'
Переделывал свою программу, и решил завернуть её в класс, компилятор вроде не жаловался, ошибок нету, но стоит мне её запустить как у меня вылазит ошибка

TypeError: 'builtin_function_or_method' object is not subscriptable

Вот в этом кусочке кода:

arefm = sum((float(abs[i]) for i in range(0, int(len(abs))))) / int(len(abs))

Смотрел другие источники по такой же ошибке, но там было что-то вроде "Замените круглые скобки на квадратные или наоборот" Но у меня до этого всё работало, но вдруг перестало как я сделал программу в классе, с чем это может быть связано ?

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


Как вызвать функцию C++ из Python?
Это вопрос о встраивании скриптового языка в C++. С Lua и JavaScript я разобрался легко, а вот как вызывать функции написанные в C++ из Python так и не смог понять. Помогите пожалуйста, вот код на lua и JavaScript. Как такое можно сделать через CPython?

#include "duktape.h"

static duk_ret_t test(duk_context *ctx)
{
    printf("test");
    return 0;
}

int main()
{
    duk_context*ctx=duk_create_heap_default();
    duk_push_c_function(ctx,test,DUK_VARARGS);
    duk_put_global_string(ctx, "test");
    duk_eval_string(ctx,"test();");

    return 0;
}

#include "lua.hpp"

int test(lua_State*l)
{
    printf("test");
    return 0;
}

int main()
{
    lua_State*l=luaL_newstate();
    lua_register(l,"test",test);
    luaL_dostring(l,"test()");

    return 0;
}

Если вам нужен минимальный пример embediing-python, с декларацией функций из c++ в python, именно через интерфейс низкого уровня, то вот:
<code>
static PyObject * test(PyObject *, PyObject *)
{
    printf("test");
    return  Py_None ; //
}
static PyMethodDef declare_test[] = {
    {"test", (PyCFunction)test, METH_NOARGS, PyDoc_STR("print 'test'.")},
    {NULL, NULL}
};

int main(int argc, char *argv[])
{

    wchar_t *program = Py_DecodeLocale(argv[0], NULL);
    Py_SetProgramName(program);
    Py_Initialize();

    PyObject * mainModule = PyImport_ImportModule("__main__");
    PyObject * mainModule_dict = PyObject_GetAttrString( mainModule, "__dict__"  );

    PyModule_AddFunctions( mainModule, declare_test );

    PyRun_SimpleString( "test()\n");

    Py_DECREF(mainModule_dict);
    Py_DECREF(mainModule);

    Py_FinalizeEx();
    PyMem_RawFree(program);
    return 0;
}
</code>
Однако, если нужно проэкспортировать больше пары функций, и из С++ (а не С), то рекомендую, вместо CPython воспользоваться обертками интерфейса более высокого уровня. Например, boost.python.


Как отфильтровать список словарей по значению определенного ключа?
Дано:
<code>
data_list = [
    {'data': 0, port: '/dev/ttyS4'},
    {'data': 1, port: '/dev/ttyS3'},
    {'data': 0, port: '/dev/ttyS3'},
    {'data': 1, port: '/dev/ttyS5'},
    {'data': 1, port: '/dev/ttyS4'}
]
</code>
Мне нужно без перебора в цикле вернуть список, содержащий только те элементы (в данном случае словари), у которых port='/dev/ttyS5'.
Как это можно сделать?

Это можно сделать через функцию
filter:

data_list = [
    {'data':0, 'port': '/dev/ttyS4'},
    {'data':1, 'port': '/dev/ttyS3'},
    {'data':0, 'port': '/dev/ttyS3'},
    {'data':1, 'port': '/dev/ttyS5'},
    {'data':1, 'port': '/dev/ttyS4'}
]
print(list(filter(lambda x: x['port'] == '/dev/ttyS5', data_list)))
# [{'data': 1, 'port': '/dev/ttyS5'}]

Тоже самое через генератор списка:

print([x for x in data_list if x['port'] == '/dev/ttyS5'])
# [{'data': 1, 'port': '/dev/ttyS5'}]


Упростить список/массив на python [закрыт]

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

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

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

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

у меня такой список

[
    "[('djlf',",
    '),',
    "('j',",
    '),',
    "('Сало',",
    ')]'
]

и его надо упростить до "djlf,j,Сало"
пробовал через
print(*list), но не получилось, список приходит с ms sql

dbCursor.execute("select Tovar from BazaMSK")
data = dbCursor.fetchall()

my_list = [
    "[('djlf',",
    '),',
    "('j',",
    '),',
    "('Сало',",
    ')]'
]

Не оптимально и много букв, конечно, но так, чтоб был понятен механизм:

new_list = []
for word in my_list:
    tmp_str = ''
    for w in word:
        if w.isalpha():
            tmp_str += w
    new_list.append(tmp_str)

в
new_list сейчас:

>>> new_list
['djlf', '', 'j', '', 'Сало', '']

и после:

new_str = ','.join(w for w in new_list if w)

в
new_str будет искомый результат в виде строки:

>>> new_str
"djlf,j,Сало"


Отправка сообщения при старте бота на python в aiogram
Всем привет. Каки образом можно при старте бота отправить сообщению юзеру? Использую библиотеку aiogram. Мне нужно что бы при перезапуске бота, отправлялось сообщения юзерам которые им уже пользуются. Что-то на подобии "Бот перезапущен, пропишете /start"

Если речь идет про сам сервер, который обрабатывает входящие сообщения, то вам поможет аргумент
on_startup у метода
executor.start_polling.

# ... код вашего бота

async def on_startup(_):
    user_should_be_notified = 123123123123  # Наверное это должны быть вы сами? Как всезнающий админ:)
    await bot.send_message(user_should_be_notified, 'Бот запущен')

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True, on_startup=on_startup)

Еще, вдруг, как вариант, метод
executor.start:

# ... код вашего бота

async def on_startup():
    user_should_be_notified = 123123123123
    await bot.send_message(user_should_be_notified, 'Бот запущен')

if __name__ == '__main__':
    executor.start(dp, on_startup())
    executor.start_polling(dp, skip_updates=True)

Если, как всплыло в комментариях, надо отправлять уведомление всем юзерам, которые ботом пользовались, то единственный вариант, насколько я хорошо знаю - запоминать айдишники всех пользователей при первом обращении... Куда-нибудь, где они не потеряются после перезапуска. Потом в цикле по этому сохраненному массиву айдишников вызвать
bot.send_message.
А еще, если пользователей будет много, то стоит выставить задержку между итерациями, чтобы отправлялось не более 20 сообщений в секунду. Как в broadcast_example.


локализация функции os.popen() в Python
Применяю функцию os.popen('dir') и выводятся символы в непонятной кодировке, как применить к данной функции кодировку utf-8

Консоль Windows по умолчанию работает в кодировке cp866, а
os.popen вывод консоли декодирует кодировкой cp1251.
1 вариант решения - закодировать обратно кодировкой cp1251, потом декодировать кодировкой cp866:

import os

text = os.popen("dir").read()
print("До декодирования:")
print(text)
print("="*80)
print("После декодирования:")
print(text.encode('cp1251').decode('cp866'))

Результат:

До декодирования:
 ’®¬ ў гбва®©бвўҐ C Ґ Ё¬ҐҐв ¬ҐвЄЁ.
 ‘ҐаЁ©л© ®¬Ґа в®¬ : 94D8-FA1E

 ‘®¤Ґа¦Ё¬®Ґ Ї ЇЄЁ C:\Users\user

02.12.2020  12:52    <DIR>          .
02.12.2020  12:52    <DIR>          ..
02.12.2020  12:52    <DIR>          .vscode
02.12.2020  12:26    <DIR>          Contacts
12.05.2021  09:31    <DIR>          Desktop
02.12.2020  12:26    <DIR>          Documents
26.02.2021  15:52    <DIR>          Downloads
02.12.2020  12:26    <DIR>          Favorites
02.12.2020  12:26    <DIR>          Links
02.12.2020  12:26    <DIR>          Music
10.03.2021  17:39    <DIR>          Pictures
02.12.2020  12:26    <DIR>          Saved Games
02.12.2020  12:26    <DIR>          Searches
02.12.2020  12:26    <DIR>          Videos
               0 д ©«®ў              0 Ў ©в
              14 Ї Ї®Є  13я888я589я824 Ў ©в бў®Ў®¤®

================================================================================
После декодирования:
 Том в устройстве C не имеет метки.
 Серийный номер тома: 94D8-FA1E

 Содержимое папки C:\Users\user

02.12.2020  12:52    <DIR>          .
02.12.2020  12:52    <DIR>          ..
02.12.2020  12:52    <DIR>          .vscode
02.12.2020  12:26    <DIR>          Contacts
12.05.2021  09:31    <DIR>          Desktop
02.12.2020  12:26    <DIR>          Documents
26.02.2021  15:52    <DIR>          Downloads
02.12.2020  12:26    <DIR>          Favorites
02.12.2020  12:26    <DIR>          Links
02.12.2020  12:26    <DIR>          Music
10.03.2021  17:39    <DIR>          Pictures
02.12.2020  12:26    <DIR>          Saved Games
02.12.2020  12:26    <DIR>          Searches
02.12.2020  12:26    <DIR>          Videos
               0 файлов              0 байт
              14 папок  13 888 589 824 байт свободно

2 вариант: вызывать
subprocess.check_output с указанием кодировки консоли в параметре
encoding:

import subprocess
result = subprocess.check_output(["cmd", "/c", "dir"], encoding='cp866')
print(result)

Это аналогично запуску через
subprocess.run и ручному декодированию вывода команды (
stdout) из набора байт в строку нужной кодировкой:

import subprocess
sub = subprocess.run(["cmd", "/c", "dir"], capture_output=True)
print(sub.stdout.decode('cp866'))

Результат:

 Том в устройстве C не имеет метки.
 Серийный номер тома: 94D8-FA1E

 Содержимое папки C:\Users\user

02.12.2020  12:52    <DIR>          .
02.12.2020  12:52    <DIR>          ..
02.12.2020  12:52    <DIR>          .vscode
02.12.2020  12:26    <DIR>          Contacts
12.05.2021  09:31    <DIR>          Desktop
02.12.2020  12:26    <DIR>          Documents
26.02.2021  15:52    <DIR>          Downloads
02.12.2020  12:26    <DIR>          Favorites
02.12.2020  12:26    <DIR>          Links
02.12.2020  12:26    <DIR>          Music
10.03.2021  17:39    <DIR>          Pictures
02.12.2020  12:26    <DIR>          Saved Games
02.12.2020  12:26    <DIR>          Searches
02.12.2020  12:26    <DIR>          Videos
               0 файлов              0 байт
              14 папок  13 888 589 824 байт свободно

3 вариант: перед вызовом
os.popen переводить консоль в кодировку cp1251 вызовом команды
chcp 1251:

import os

os.system("chcp 1251")
text = os.popen("dir").read()
print(text)

В идеале нужно не явно прописывать конкретную кодировку, а получать кодировку консоли с помощью функции winapi
GetConsoleOutputCP, ее можно вызвать с помощью модуля
ctypes, пример:

import subprocess
from ctypes import windll

console_encoding = "utf-8"
console_code_page = windll.kernel32.GetConsoleOutputCP()
if console_code_page != 65001:
    console_encoding = f"cp{console_code_page}"

result = subprocess.check_output(["cmd", "/c", "dir"], encoding=console_encoding)
print(result)

Более-менее кроссплатформенное получение кодировки консоли:

import platform

console_encoding = "utf-8"

if platform.system() == "Windows":
    from ctypes import windll

    console_code_page = windll.kernel32.GetConsoleOutputCP()
    if console_code_page != 65001:
        console_encoding = f"cp{console_code_page}"

Для Windows кодировка будет определяться через функцию
GetConsoleOutputCP(), для других платформ будет считаться равной
utf-8.


Как задать диапазон чисел в рандоме?
Всем привет! Я хочу задать диапазон чисел допустим для рандома? Как это сделать?
Вот например, у меня есть код:
<code>
from random import randint
ques_one = int(input('Введите первое число: '))
ques_two = int(input('Введите второе число: '))
print(randint(ques_one, ques_two))
</code>
Вопрос: как я могу сделать так, чтобы это убралось в две или три строчки?

from random import randint
ques_one, ques_two = [int(i) for i in input('Введите Два числа через пробел: ').split(" ")]
print(randint(ques_one, ques_two))

Введите Два числа через пробел: >? 1 10
5

Если значения диапазонов не будут нигде использоваться, то можно сделать так:

from random import randint
print(randint(*[int(i) for i in input('Введите Два числа через пробел: ').split(" ")]))

Введите Два числа через пробел: >? 1 10
9


Зависает интерфейс при выполнение цикла во втором потоке в PyQt5
Запускаю функцию
test_func() во втором потоке, в котором есть цикл, из основного класса
App, и интерфейс виснет.
Если, к примеру, перенести цикл из
test_func() в
run(), то интерфейс не зависает.
Разница между этими функциями в том, что
test_func() вызывается
emit'ом из основного класса
App, а
run() самовоспроизводится при старте класса
ThreadForFunc.
Надеюсь, моя проблема ясна.
Код:
Примечание: первые три класса можете пропустить, в них находятся окна. Сама проблема кроется в последних двух классах -
ThreadForFunc и
App

import sys
#import time
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import QWidget, QGraphicsDropShadowEffect, QProgressBar
from PyQt5.QtCore import QThread, QTimer, Qt

class Ui_MainWindow(object):                              # основное окно
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(224, 240, 291, 111))
        self.pushButton.setObjectName("pushButton")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(190, 70, 351, 91))
        font = QtGui.QFont()
        font.setPointSize(26)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
        self.label.setText(_translate("MainWindow", "ПЕРВОЕ ОКНО"))

class Ui_Form(object):                            # окно прогресса
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(431, 262)
        font = QtGui.QFont()
        font.setPointSize(10)
        Form.setFont(font)
        Form.setStyleSheet("background-color: #21222D;")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(150, 190, 131, 31))
        font = QtGui.QFont()
        font.setFamily("Golos Text")
        font.setPointSize(9)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton.setStyleSheet("background-color: white;\n"
"border: 2px solid white;\n"
"border-radius: 15px;\n"
"color: #21222D;\n"
"")
        self.pushButton.setObjectName("pushButton")
        self.progressBar = QtWidgets.QProgressBar(Form)
        self.progressBar.setGeometry(QtCore.QRect(40, 150, 351, 2))
        font = QtGui.QFont()
        font.setFamily("Golos Text")
        font.setPointSize(9)
        font.setBold(True)
        font.setWeight(75)
        self.progressBar.setFont(font)
        self.progressBar.setMouseTracking(False)
        self.progressBar.setTabletTracking(False)
        self.progressBar.setAcceptDrops(False)
        self.progressBar.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.progressBar.setAutoFillBackground(False)
        self.progressBar.setStyleSheet("QProgressBar{\n"
"    background-color: #555661;\n"
"    color: #16171E;\n"
"    text-align: center;\n"
"    max-height: 2.45px;\n"
"    min-height: 2.45px;\n"
"}\n"
"\n"
"QProgressBar::chunk{\n"
"    background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #FFC468, stop:1 #F27F7D);\n"
"}")
        self.progressBar.setProperty("value", 24)
        self.progressBar.setTextVisible(True)
        self.progressBar.setOrientation(QtCore.Qt.Horizontal)
        self.progressBar.setInvertedAppearance(False)
        self.progressBar.setObjectName("progressBar")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(40, 50, 351, 31))
        font = QtGui.QFont()
        font.setFamily("Golos Text")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setStyleSheet("color: white;")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(40, 100, 351, 31))
        font = QtGui.QFont()
        font.setFamily("Golos Text")
        font.setBold(True)
        font.setWeight(75)
        self.label_3.setFont(font)
        self.label_3.setStyleSheet("color: white;")
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setObjectName("label_3")

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

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "ЗАКРЫТЬ"))
        self.label.setText(_translate("Form", "ПОДОЖДИТE"))
        self.label_3.setText(_translate("Form", "Идет загрузка"))

class Progress_UI(QWidget):             # класс для инициализации окна прогресса
    def __init__(self):
        super(Progress_UI, self).__init__()
        self.setup_progress()

    def setup_progress(self):
        self.progress_ui = Ui_Form()
        self.progress_ui.setupUi(self)
        self.progress_ui.progressBar.setRange(0, 0)

        self.setWindowFlags(Qt.FramelessWindowHint |
        QtCore.Qt.WindowStaysOnTopHint)

        self.progress_ui.pushButton.clicked.connect(self.close)

class ThreadForFunc(QThread):
    def __init__(self):
        QThread.__init__(self)

    def run(self):
        print('Start run')

    def test_func(self):               # собственно, функция, которая должна работать. Пока что после её запуска интерфейс виснет
        print('Работает!')
        self.num = 0
        while True:
            print(f'{self.num}')
            self.msleep(1000)
            self.num += 1

class App(QtWidgets.QMainWindow, Ui_MainWindow):
    my_signal = QtCore.pyqtSignal()                         # my_signal

    def __init__(self):
        super(App, self).__init__()
        self.setupUi(self)

        # запускаем нужную функцию по нажатию на кнопку
        self.pushButton.clicked.connect(self.ais_start)

        self.thread = ThreadForFunc()
        self.my_signal.connect(self.thread.test_func)       # my_signal.connect()

    def show_progress_ui(self):
        self.progress_ui = Progress_UI()
        self.progress_ui.show()

    def ais_start(self):
        self.show_progress_ui()
        self.thread.start()
        QTimer.singleShot(3000, self.my_signal.emit)         # my_signal.emit()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    application = App()
    application.show()
    sys.exit(app.exec_())

В отдельном потоке запускается функция
run из класса
ThreadForFunc, а
test_func запускается из главного потока, в котором обрабатываются события UI. Поэтому и зависает UI, пока функция не вернется.
Вероятно, вы хотите запустить из
ais_start новый поток, в котором будет вызываться
test_func. Тогда нужно делать так:

class ThreadForFunc(QThread):
    def __init__(self):
        QThread.__init__(self)

    def run(self):
        print('Start run')
        self.test_func()

    def test_func(self):
        print('Работает!')
        self.num = 0
        while True:
            print(f'{self.num}')
            self.msleep(1000)
            self.num += 1

class App(QtWidgets.QMainWindow, Ui_MainWindow):
    my_signal = QtCore.pyqtSignal()

    def __init__(self):
        ... тут все как раньше

        self.thread = ThreadForFunc()
        self.my_signal.connect(self.thread.start)

    ... все так же

    def ais_start(self):
        self.show_progress_ui()
        QTimer.singleShot(3000, self.my_signal.emit)

Т.е.
test_func должна вызываться напрямую из
run, а сигнал должен запускать поток используя
start.


Как выбрать из списка списков по условию?
Имеется список:

spisok = [
    ['январь', 31],
    ['февраль', 28],
    ['март', 31],
    ['апрель', 30],
    ['май', 31],
    ['июнь', 30],
    ['июль', 31],
    ['август', 31],
    ['сентябрь', 30],
    ['октябрь', 31],
    ['ноябрь', 30],
    ['декабрь', 31]
]

Необходимо вывести список, где в месяце 31 день;
Необходимо вывести список, где название месяца не заканчивается на мягкий знак.

Перебирал разные варианты, например:

def sortSort3(spisok):
    i = 0
    j = 31

    for j in spisok[i]:
        if j in spisok[i]:
            return(spisok[i][0])
            i = + 1

print(sortSort3(spisok))

Но запутался в логике. Как это сделать?

my_list = [['январь', 31], ['февраль', 28], ['март', 31], ['апрель', 30], ['май', 31], ['июнь', 30], ['июль', 31], ['август', 31], ['сентябрь', 30], ['октябрь', 31], ['ноябрь', 30], ['декабрь', 31]]

Название не заканчивается мягким знаком:

for m in my_list:
    if not m[0].endswith('ь'):
        print(m)

['март', 31]
['май', 31]
['август', 31]

Количество дней равно 31:

for m in my_list:
    if m[1] == 31:
        print(m)

['январь', 31]
['март', 31]
['май', 31]
['июль', 31]
['август', 31]
['октябрь', 31]
['декабрь', 31]


Regex - Разбить строку 2aab13c на подстроки
Прошу подсказать, как разбить строку 2aab13c на подстроки 2aab и 13c.
Пробовал так:
<code>
import re

print(re.match(r'(\d+\w+)', '2aab13c'))
</code>
но не сработало.

Например:

re.findall(r'\d+\D*', text)

См. пример работы регулярного выражения.
Подробности

\d+ - одна и более цифр

\D* - ноль и более символов, отличных от цифр.

Ещё один вариант - это использование
re.split:

re.split(r'(?<=\D)(?=\d)', text)

См. пример работы регулярного выражения.
(?<=\D)(?=\d) находит позиции в строке между нецифровым и цифровым символами.
См. пример работы кода.


Как передать метод класса в root.protocol("WM_DELETE_WINDOW", def_is_in_class)?
Искал в интернете, как стыковать GUI со всяким остальным кодом, пришел к некоторой конструкции (код ниже). Единственно, что у меня с этой конструкцией не может сработать
root.protocol("WM_DELETE_WINDOW, on_closing") потому, что on_closing у меня располагается в классе, а
root.protocol вне.
Можно ли как то переделать код, чтобы состыковать
root.protocol и описанную в классе
on_closing?
Код программы:

# Описываю класс main_app:
class main_app(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent

        self.active_way = ttk.Label(textvariable=self.shared_state.active_path, anchor="center")
        self.active_way.grid(row=1, column=0, columnspan=3, sticky=E + W + N)
        # тут пошли всякие button'ы, label'ы, def'ы описывающие нажатие, и.т.п.

    def on_closing(self):
        if messagebox.askokcancel("Quit", "Do you want to quit?"):
            self.shared_state.should_stop.set(True) # <- это описано в классе, потому не могу вынести on_closing за пределы класса.
            root.destroy()

# Описываю запускающуюся часть:
if __name__ == "__main__":
    root = tk.Tk()
    root.tk.call('source', 'azure-dark.tcl')
    ttk.Style().theme_use('azure-dark')
    main_app(root)
    root.geometry('655x800+1257+100')
    root.title("GUI WebM->MP4 Convertor")
    # root.protocol("WM_DELETE_WINDOW", on_closing) # <- вот оно не работает =(
    root.mainloop()

Собственно, сам пробовал перетаскивать инициализацию рута внутрь класса, но оно отказалось запускаться.
Update 1:
Перетащил таки все в
__init__:

Если я делаю вот так:

class main_app(Frame):
    def __init__(self, parent, *args, **kwargs):
        root = Tk()
        Frame.__init__(self, parent, *args, **kwargs)
        self.shared_state = SharedState()
        self.parent = parent

        # тут все остальное

        root.protocol("WM_DELETE_WINDOW", self.on_closing(root))
        root.mainloop()

if __name__ == "__main__":
    main_app()

То у меня выдается вот это:

TypeError: __init__() missing 1 required positional argument: 'parent'

Если я делаю вот так:

class main_app(Frame):
    def __init__(self):
        root = Tk()
        Frame.__init__(self)
        self.shared_state = SharedState()

        # тут все остальное

        root.protocol("WM_DELETE_WINDOW", self.on_closing(root))
        root.mainloop()

if __name__ == "__main__":
    main_app()

То при запуске программы у меня открывается GUI, и сразу же запускается on_closing.

Вариант с переносом внутрь
__init__:

import tkinter as tk
import tkinter.messagebox as messagebox

class main_app(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        root.protocol("WM_DELETE_WINDOW", self.on_closing)

    def on_closing(self):
        if messagebox.askokcancel("Quit", "Do you want to quit?"):
            root.destroy()

if __name__ == "__main__":
    root = tk.Tk()

    main_app(root)

    root.mainloop()

Вариант с привязкой "снаружи" после создания объекта:

import tkinter as tk
import tkinter.messagebox as messagebox

class main_app(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)

    def on_closing(self):
        if messagebox.askokcancel("Quit", "Do you want to quit?"):
            root.destroy()

if __name__ == "__main__":
    root = tk.Tk()

    app = main_app(root)
    root.protocol("WM_DELETE_WINDOW", app.on_closing)

    root.mainloop()

Варианты с наследованием от класса Tk:

import tkinter as tk
import tkinter.messagebox as messagebox

class MainWindow(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # self.protocol("WM_DELETE_WINDOW", self.on_closing)  # <-- или так

    def on_closing(self):
        if messagebox.askokcancel("Quit", "Do you want to quit?"):
            self.destroy()

if __name__ == "__main__":
    root = MainWindow()
    # root.protocol("WM_DELETE_WINDOW", root.on_closing)  # <-- или так
    root.mainloop()


Как заставить код ждать при нажатии ENTER python
Допустим, у меня есть цикл:
<code>
while True:
 print("Cycle")
</code>
Мне надо, чтобы при нажатии ENTER цикл временно остановился (с написанием некоторого текста) до повторного нажатия ENTER.
Как такое сделать?

Я разобрался с этим. Лучше использовать библиотеку
keyboard и цикл.

import keyboard

key = 'alt'

while True:
    print("Цикл")
    if keyboard.is_pressed(key):
        input("Цикл приостановлен. Нажмите ENTER чтобы продолжить")

Таким образом, при нажатии на ALT цикл приостанавливается.


Как переменной из вложенного кода if, передать значение на последующий if - Python
Заранее извиняюсь за столь глупый вопрос, но в программировании я ещё новичок. Подскажите как переменной balance во вложенном коде if step == 5, передать значение balance из it step == 6: Нужно использовать функцию?
<code>
                if step == 6:
                    balance = int(input("На какую сумму хотите пополнить счет: "))
                    print(f"На вашем балансе сейчас {balance} {currency}")
                if step == 5:
                    if balance > 0:
                        debit = int(input(f"Сколько вы хотите списать с {balance}: "))
                        if debit > balance:
                            print("У вас нет столько средств!")
                        else:
                            debit_result = balance - debit
                            print(f"На вашем счету осталось {debit_result} {currency}")
                    else:
                        print("На вашем счету нет средств")
</code>

Если в лоб, то можно заменить

if step == 5:

на, к примеру,

if step in [5, 6]:

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


Улучшить точность при расчетах с числами после точки
Есть программа для расчета сопротивления в схеме с
n количеством звеньев. Есть код с рекурсией (важно сделать именно рекурсию, такова моя задача), в котором примерно после 16 звеньев python просто перестает считать и выводит одинаковые числа при любом значении
n. Как сделать так чтобы программа выводила мне точные числа (если это вообще возможно)?

def Rx(r):
    if r == 1:
        return 3
    res = Rx(r - 1)
    return 2 + res/(1+res)

a=int(input())
print(Rx(a))

Можешь использовать встроенный в python модуль decimal

from decimal import Decimal Decimal("0.1") + Decimal("0.2")  # 0.3
Тем самым исправив проблемы с точностью, потом уже сможешь округлить до нужного количества знаков. *Примечание: в Dicimal передаётся строка, а не число, а так же нельзя смешивать в операциях дробные числа float и Decimal (т.е. сначала нужно всё привести к Decimal)


заполнить матрицу по диагоналям Python
У меня есть матрица, которая подстраивает свой размер под длину фразы (n x n, n>=5). Теперь эту фразу нужно внести в матрицу по диагоналям параллельной главной, пустые элементы занимаются знаком
-
Например вводим мы в матрицу 5x5 "привет, мир", в матрице должно получиться так:

р

в
р
п

-
-
,
е
и

-
-
-
м
т

-
-
-
-
и

-
-
-
-
-

[р, ,в,р,п]
[-,-,',е,и]
[-,-,-,м,т]
[-,-,-,-,и]
[-,-,-,-,-]

Как мне это сделать. Вот мой код, тут ищется n

text = input()
len = len(text)  #Вводим текст

j = 0
for i in range(len):  #высчитываем размер таблицы
    j=i*i
    print(j)
    if len <= j:
        n = i
        if n < 5:
            n=5
        print(n)
        break

У меня получился такой вариант.

import math

txt = "привет, мир"

# вычисляем минимальный размер матрицы n на n которая вместит текст
n = math.ceil(math.sqrt(len(txt)))
# минимальная - 5 на 5
n = 5 if n < 5 else n

# инициализируем матрицу
matrix = [['-']*n for _ in range(n)]

# преобразуем текст в стек чтобы удобнее было доставать посимвольно
txt_seq = list(txt[::-1])

# заполняем матрицу
try:
    for s in range(n-1, -n, -1):
        for i in range(0, n-s):
            if 0 <= s+i < n and 0 <= i < n:
                matrix[i][s+i] = txt_seq.pop()
except IndexError: # сюда проваливаемся если досрочно кончился текст
    pass

print('\n'.join(map(str, matrix)))

Напечатает:

['р', ',', 'в', 'р', 'п']
['-', '-', ' ', 'е', 'и']
['-', '-', '-', 'м', 'т']
['-', '-', '-', '-', 'и']
['-', '-', '-', '-', '-']


Для чего нужны эти функции в PyQt5
Всем добрый день, понимаю что ОЧЕНЬ глупый вопрос, но пожалуйста не могли ли вы простыми словами описать эти фрагменты кода?

class PlotCanvas(FigureCanvas):
    def __init__(self, rbtns, parent=None, width=5, height=4, dpi=100):
        self.fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = self.fig.add_subplot(111)
        super().__init__(self.fig)

        self.p = parent
        self.rbtns = rbtns

class App(QWidget):
    def __init__(self):
        super().__init__()

        self._global()
        self.layout = QGridLayout(self)
        self.flag = True
        self.initUI()

 def closeEvent(self, event):
        self.flag = False

   def initUI(self):
        self.m = PlotCanvas(self.rbtns, self, width=5, height=4)
        self.layout.addWidget(self.m, 0, 0)

   def initUI(self):
        self.m = PlotCanvas(self.rbtns, self, width=5, height=4)
        self.layout.addWidget(self.m, 0, 0)

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

Наследование — это процесс, когда один класс наследует атрибуты и методы другого.
Класс, чьи свойства и методы наследуются, называют Родителем или Суперклассом.
А класс, свойства которого наследуются — класс-потомок или Подкласс.
Класс может содержать
атрибуты и
методы.

Метод – это функция, находящаяся внутри класса и выполняющая определенную работу.

# определяем класс App, наследуя его от класса QWidget.
class App(QWidget):
    # Конструктор класса и инициализация экземпляра класса:
    # для инициализации экземпляра класса используется метод __init__(self),
    # в котором можно задать параметры объекта при его создании.
    #
    # self – это ссылка на текущий экземпляр класса
    def __init__(self):
        # super – это ключевое слово, которое используется для обращения к родительскому классу.
        super().__init__()

        self._global()                  # вызов метода _global()
        self.layout = QGridLayout(self) # создаем объект класса QGridLayout
        self.flag = True                # атрибут flag, кот. присвоено значение True,
                                        # при их создании было использовано ключевое слово self.
        self.initUI()                   # вызов метода initUI()

    # метод
    def initUI(self):
        # создаем объект класса PlotCanvas
        self.m = PlotCanvas(self.rbtns, self, width=5, height=4)
        # размещаем объект self.m в менеджере компановки  self.layout
        #          в первую строку -->v  v<--- в первый столбец
        self.layout.addWidget(self.m, 0, 0)

    # closeEvent метод унаследованный из класса QWidget,
    # который вызывается с заданным событием, когда Qt получает запрос
    # на закрытие окна для виджета верхнего уровня от оконной системы.
    def closeEvent(self, event):
        self.flag = False   # объекту flag, присвоено новое значение False

Так как вы используете графический интерфейс,
вам следует использовать холст соответствующего бэкэнда,
чтобы не было конфликта циклов событий.
В конечном итоге класс
PlotCanvas это виджет.

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
...

class PlotCanvas(FigureCanvas):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        self.fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = self.fig.add_subplot(111)
        super().__init__(self.fig)

        self.p = parent
...

class App(QWidget):
    def __init__(self):
        super().__init__()
        ...
        self.initUI()
        ...
    ...
    def initUI(self):
        self.m = PlotCanvas(self, width=5, height=4)
        self.layout.addWidget(self.m, 0, 0)
...


Как мне передать флаг на остановку из GUI в Thread с циклом без global variables?
В продолжение темы о том, что global variables - зло. (Вот тут в комментариях)
Допустим, я согласен с этим и не хочу их использовать в своей программе.
У меня есть GUI, из которого я осуществляю общее управление. При нажатии кнопки Старт в GUI у меня запускается Thread, в котором у меня стоит цикл, который для меня выполняет работу. Когда я нажимаю кнопку Стоп в GUI, мне нужно чтобы у меня цикл выполнил текущий проход, выполнил несколько действий и закончился.
Так же у меня идет передача информации о текущей активности в обратном направлении (в частности имя рабочего файла цикла пишется в Label в gui)
Сейчас я это реализовал через глобальную переменную-boolean, и проверку этой переменной в конце очередного прохода цикла.
Как эту передачу флага на остановку, или возврат имени рабочего файла, осуществить правильно? Не прибить программу, не прибить thread, а именно сделать так, чтобы цикл в определенном месте выполнит определенные действия и завершится?
Кусочки кода:

# В инициализации gui я задаю:
    global active_file_path
    active_file_path = StringVar()
    active_file_path.set("No active file now")

    active_file_way = ttk.Label(textvariable=active_file_path, anchor="center")
    active_file_way.grid(row=1, column=0, columnspan=3, sticky=E + W + N)

    global should_stop
    should_stop = BooleanVar()
    should_stop.set(False)

# В Thread'е я делаю каждый проход цикла:
    active_file_path.set(file_name)
# И в конце прохода:
    if should_stop.get():
    ...

# Кнопка Стоп делает:
    should_stop.set(True)

Update 1 (к комментариям):
Я задаю в описании gui текст через textvariable и позже этот textvariable меняю при необходимости:

class main_app(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        self.shared_state = SharedState()
        active_file_way = ttk.Label(textvariable=self.shared_state.active_file_path, anchor="center")

# В классе с флагом я задаю вот так:
class SharedState:
    def __init__(self):
        self.active_file_path = tk.StringVar()
        self.active_file_path.set("No active file now")

# И потом в цикле у меня стоит:
for file in os.listdir(directory):
    shared_state.active_file_path.set(file_address)

При таком использовании при вызове метода .set() текст в Label сразу изменяется.
Оно работает. Но нету ли с ним такого же расклада, как с работающими global'ами?
Почему спрашиваю - там где я это нашел, именно эти StringVar() и объявлялись как global, вот потому и спрашиваю.

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

class SharedState:
   def __init__(self):
     self.finished = False

def background_job(shared_state):
   while not shared_state.finished:
     # работаем в цикле

class SomeUIComponent:
  def some_ui_function(self):
    self.shared_state = SharedState()
    thread = Thread(target=background_job, args(self.shared_state,))
    thread.start()

  def some_other_ui_function(self):
    self.shared_state.finished = True

Тот код, который создает поток, т.е. UI, тоже имеет доступ к этому объекту, ведь он его создал. Значить UI может читать из этого объекта значения атрибутов. То есть UI и фоновый поток могут между собой взаимодействовать через разделяемый объект, на который у них есть ссылки.
Важно только синхронизировать доступ к этому объекту, если важна атомарность операций изменения. Простой способ для передачи более сложных данных чем один флаг - это queue.
Что касается использования
tk.StringVar в
SharedState, то тут нет никакого использования глобальных переменных. Если класс
tk.StringVar потокобезопасный, то никаких проблем. Но я бы не вносил код, который знает что-то про UI (а
tk.StringVar таким является) в
SharedState. Лучше чтоб там были просто строки.


Бот парсер из telegram в discord
Возник такой интересный вопрос, как можно из определённого telegram канала, выводить сообщения в нужный канал discord. Подскажите пожалуйста или может есть какая-то статься по этому поводу,всем заранее спасибо!
P.S
Хотелось бы узнать, как сделать так, чтобы когда опубликовывается новая запись, бот сразу её отправлял а discord

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


Почему вывод функции возвращает "function info at 0x0000024B3B3EE040"?
Начинаю изучать питон, у меня возникли проблемы с выводом программы
Вот простая функция:

def info(age):

    if age <= 16:
        print('Учись в школе')
    else:
        print('Поступай дальше')
info(18)
print(info)
info(15)
print(info)

Вывод получается вот такой:

Поступай дальше
<function info at 0x0000024B3B3EE040>
Учись в школе
<function info at 0x0000024B3B3EE040>

У меня вопрос.
Что это такое при выводе в функции

<function info at 0x0000024B3B3EE040>
<function info at 0x0000024B3B3EE040>

Что я сделал не так?

Вы выводите объект функции, а не вызываете её.

def info(age):

    if age <= 16:
        print('Учись в школе')
    else:
        print('Поступай дальше')
info(18)
info(15)

Если вы будете вызывать функцию
print(info(18)), то будет выводиться None. Т.к функция ничего не возвращает.


Подсчёт количества едениц в строке
Сколько единиц содержится в двоичной записи значения выражения: 4^255 + 2^255 − 255?
<code>
a = list(bin(4**255+ 2**255 - 255))
k = 0
for i in range(len(a)):
    if a[i] == 1:
        k += 1
print (k)
</code>
Что не так? И пожалуйста объясните.

Способ 1.

str(4**255 + 2**255 - 255).count('1')

Приводим к строке, вызываем строковый метод подсчета символа.
Способ 2.

sum(1 for elem in bin(4**255+ 2**255 - 255)) if elem == '1')

Считаем количество единиц, так как функция bin переводит к строковому типу вида '0bxxx', где xxx - цифры числа в двоичном представлении.
Способ 3.
Также существует несложный алгоритм.

4^255 = 2^(255 * 2) степень двойки, будет обозначать единица в двоичном представлении данной суммы.

2^255 -- аналогично.
С вычитанием интереснее, можно проследить следующую закономерность:

2^n - 2^m -- будет содержать
n - m единиц (проверьте это и докажите самостоятельно).
Отсюда сделаем следующий финт:
-255 = -256 + 1 = -2^8 + 2^0
В итоге наше выражение:
2^(255 * 2) + 2^255 - 2^8 + 1 будет иметь
1 + (255 - 8) + 1 единицу, так как
2^255 - 2^8 четное число и значит нулевой бит у него будет нулевой и прибавление единицы добавит только единицу.


Возможно ли превратить список/кортеж в словарь таким образом?
Сам вопрос:
Есть список или кортеж: graph.

graph = ((0,10,0,30,100), (0,0,50,0,0), (0,0,0,0,10), (0,0,20,0,60), (0,0,0,0,0))

Или

graph = [[0,10,0,30,100], [0,0,50,0,0], [0,0,0,0,10], [0,0,20,0,60], [0,0,0,0,0]]

Я хочу создать словарь, чтобы воспользоваться Алгоритмом Дейкстры. Словарь должен иметь следующий вид - { вершина: [(стоимость пути, путь к вершине)] }.

graph = {
    0: [(10, 1), (30, 3), (100, 4)],
    1: [(50, 2)],
    2: [(10, 4)],
    3: [(20, 2), (60, 4)],
    4: [(None, None)]
}

Как мне это сделать? Не понимаю. Новичок.
И дополнительный вопрос к вам: правильно ли я понимаю, что ключ [4] будет иметь значение (None, None)? Если вершина [4] никуда не идет.
Заранее спасибо!

Легко. Всё довольно линейно делается, если использовать словарное и списковое сокращение, а также enumerate:

d = {i: [(y,j) for j,y in enumerate(x) if y] or [(None,None)] for i,x in enumerate(graph)}

Результат в d:

{0: [(10, 1), (30, 3), (100, 4)],
 1: [(50, 2)],
 2: [(10, 4)],
 3: [(20, 2), (60, 4)],
 4: [(None, None)]}


Реализация алгоритма сортировки
Подскажите пожалуйста, как реализовать алгоритм разделения списков. Задается шаг, который будет использоваться для сортировки, затем список должен быть преобразован по первому значению.
К примеру, список [0, 25, 50, 100, 125, 150, 130, 200, 225, 180]
Шаг +-25
В итоге получается список списков [[0, 25], [50], [100, 125], [150, 130], [200, 250, 180]]
А затем он превращается в [0, 0, 50, 100, 100, 150, 150, 200, 200, 200]

Как-то так:
<code>
lst = [0, 25, 50, 100, 125, 150, 130, 200, 225, 180]
delta = 25

# группируем
groups = [[lst[0]]]
for i in range(1, len(lst)):
    if groups[-1][0] - delta <= lst[i] <= groups[-1][0] + delta:
        groups[-1].append(lst[i])
    else:
        groups.append([lst[i]])
print(groups)

# плющим
res = []
for el in groups:
    res += [el[0]]*len(el)
print(res)
</code>


Появляются лишние символы ' , ) при отправке в сообщения данных из sqlite; telebot
Пишу телеграм бота-магазин. Столкнулся с проблемой что после парсинга из sqlite базы и отправке результата появляются лишние скобки, запятые и апострафы. Вот код:

        elif message.text == "данные от киви":
            conn = sqlite3.connect("base_ts.sqlite")
            cursor = conn.cursor()
            login = cursor.execute('SELECT login FROM qiwi')
            row = cursor.fetchall()
            token = cursor.execute('SELECT token FROM qiwi')
            raw = cursor.fetchall()
            cursor.close()
            conn.close()
            text1 = ''
            text2 = ''
            text1 = text1 + 'номер: ' + str(row[0])
            bot.send_message(chat_id=chat_id, text=f'{text1}')
            text2 = text2 + 'токен: ' + str(raw[0])
            bot.send_message(chat_id=chat_id, text=f'{text2}')

Результат бота:

номер: ('39847474303',)

токен: ('1kkemeldp03333',)

Желательный результат:

номер: 39847474303

токен: 1kkemeldp03333

Заменить row[0] на row[0][0] в строках text1 и text2


Выдает ошибку на 7-ой линии (IndexError: list assignment index out of range),объясните в чем ошибка, недавно начал изучение pythom [закрыт]

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

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

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

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

<code>
lst = list()
for _ in range(int(input())):
    n = int(input())
    lst.append(n)
for i in range(len(lst)):
    if i % 2 == 1 :
        del lst[i]
print(lst)
</code>

Можно сделать вот так

lst = [i for i in lst[::2]]

Соответственно, вместо
2 может быть что угодно, это шаг, то же, что остаток в данном случае


Почему не корректный вывод key, lambda?
Почему выводится максимальное число, кратное двум - 14?
Ведь должен вывести 100:
<code>
lst = [77, 14, 5, 9, 277, 100]
print(max(lst, key=lambda x: x % 2 == 0))
</code>
А если вместо max написать min, то вообще выведет число не кратное двум? Какая тут связь?

Аргумент key в max отвечает за способ выбора наибольшего, а не за фильтрацию.
Код должен выглядеть так
<code>
lst = [77, 14, 5, 9, 277, 100]
print(max(filter(lambda x: x % 2 == 0, lst)))
</code>
Твой же код находил первое чётное число. Когда ты задал аргумент key таким образом, список превратился в [False, True, False, False, False, True], и вполне логично, что первый максимум тут второй элемент, который в изначальном списке имеет значение 14.


Как задать высоту Entry поля в ttk?
Как задать высоту поля Entry в from tkinter import ttk?
<code>
r = ThemedTk(theme='adapta')

e = ttk.Entry(r, height=180)
e.grid(column=1, row=1)

r.mainloop()
</code>
_tkinter.TclError: unknown option "-height"
Или же как сделать определенное количество строк в высоту.

Такого свойства нет. Но зато у Tkinter есть многострочное поле для ввода - Text.В нем можно задать высоту параметром height.Но если вам нужно только Entry, то тогда вы можете изменить шрифт(font) тогда entry само станет выше.Также вы можете изменить высоту виджета в place(не пробовал с grid). Пример:

from tkinter import Entry, Tk

window = Tk()
t = Entry(window)
t.place(width=150,height=50)

window.mainloop()

И еще один вариант с использованием ipady.Пример:

from tkinter import *

root=Tk()

a = Label(root,text="input")
a.grid(row=0, column=1, padx=5,pady=5)

entry = Entry(root,width=30)
entry.grid(row=0,column=1,padx=5,pady=10,ipady=3)

root.geometry("600x300+150+150")

root.mainloop()

Подробнее можно узнать здесь


Как перезаписать файл в python
У меня есть парсер который создаёт файл .yml
Мне надо что бы фал постоянно перезаписывался не удалая его.
Вот так происходит создание файла
<code>
with open(save_path_file, "w",encoding='utf-8') as f:
    f.write(xml_str)
</code>
Что мне исправить что бы файл перезаписывался, или он и так будет перезаписываться?

Параметр 'w' создает или перезаписывает файл. Вам ничего менять не надо