Как исправить непонятную кодировку при SELECT из ms sql
Есть SQL запрос, который выполняется из скрипта python.
Проблема в том, что поле, которого нет в базе, выдает символы не utf8. Как это можно адекватно перекодировать в кириллицу? В самом питоновском скрипте или на стороне базы именно для этой переменной? Когда запрос выполняется на чистом sql, в базе все норм, отображается с кириллицей.
На питоне идет подключение к mssql через pymssql.
Вот запрос:

SELECT
CASE WHEN c_object_mane = '1' or c_object_mane = '2'
THEN 'Санкт-Петербург'
WHEN c_object_mane = '3'
THEN 'Москва'
END AS c_object_adress, an.[c_object_mane], an.[c_house_name], an.[c_type_room], an.[c_room], an.[c_status_flat], an.[lead_bujet], an.[c_an], an.[ddu_date]
FROM mssql_db as an where an.ddu_date >= '2021-01-01'

При выводе по логике должны нормально писать города Москва, Санкт-Петербург, но выходит только это:

Òþìåíü
Òþìåíü
Òþìåíü
Ìîñêâà
Òþìåíü
Òþìåíü
Òþìåíü
Òþìåíü
Òþìåíü

В общем, изменил подключение с pymssql на pyodbc и все заработало.


Что лучше 1 большой запрос к БД или порционно? [закрыт]

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

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

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

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

Работаю с проектом, в котором периодически происходят запросы к БД. Раньше делал 1 запрос в начале работы скрипта и в памяти висела вся БД. Соответственно потом по ходу работы скрипта - проходило все быстро, единственное только 1 НО - это время в начале выборки. Потом сделал адресные выборки, т.е. что надо было - то и брал из БД и увидел, что нагрзузка стала подниматься на сервер.
Теперь соответственно сам вопрос: кто работает тоже с БД как Вы подходите к таким решениям? Что лучше сделать 1 большой запрос или брать порционно? Или третий вариант запоминать порционные запросы?
PS:

В качестве  СУБД использую MySQL. Работа с БД проходит через SQLAlchemy.
Реляционная модель БД, 3НФ. I:II - 1:M | II::III - 1:M .
В момент времени надо знать возможные комбинации ключей второй таблицы в зависимости от Главной таблицы, чтобы потом по выбранному случайному ключу выбрать случайный ключ из диапазона 3 таблицы

Во-общем, после многих тестов было решено оставить обращение к БД порционно.
Хоть количество обращений к БД увеличилось, но средние показатели установили, что процессор в среднем нагружается меньше, ОП не переполняется соответственно ошибка 413 стала появляться меньше. Хотя она полностью была решена путем добавления файла подкачки - после него 413 полностью пропала!

Приложение стало работать быстрее (на 1-2 секунды)
Пропали ошибки 502 и 413.
Средняя нагрузка на сервере стала стабильная (дельта тестов показывала 1-2 %, в то время как с выгрузкой всей БД в память - скачки были до 10% !)


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

def post_create(request):
template = 'posts/create_post.html'
form = PostForm()
if request.method == 'POST':
    form = PostForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect('post:index')
    return render(request, template, {'form': form})
context = {
    'form': form

}
return render(request, template, context)

models

class Post(models.Model):
text = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
group = models.ForeignKey(
    'Group',
    on_delete=models.SET_NULL,
    blank=True,
    null=True,
    related_name='posts',
)
author = models.ForeignKey(
    User,
    on_delete=models.CASCADE,
    related_name='posts'
)

class Meta:
    ordering = ('-pub_date',)

def __str__(self):
    return self.text[:15]

forms:

class PostForm(forms.ModelForm):
class Meta:
    model = Post
    fields = ('text', 'group',)

Как мне передать авторизованного пользователя в заполненную форму?

Измените ваше представление:

if form.is_valid():
    form = form.save(commit=False)
    form.author = request.user
    form.save()

request.user хранит в себе текущего пользователя.
Параметр
commit=False сохраняет форму, но не даёт послать форму в базу данных, что даёт возможность внести в неё изменения вручную. После этого обязательно нужно сохранить форму повторно


Как повторять текст в документе. после окончания строк
Мне нужно, чтобы в этом коде после того, как закончился текст, не писались пустые строчки, а повторялся текст, написанный в документе
<code>
import keyboard, time

def startSpam():
    keyboard.write(file.readline(), delay=0.000000001)
    keyboard.press("Enter")

time.sleep(5)
file = open("C:\\Users\\Matvey\\Desktop\\SpamMsg.txt", "r", encoding='UTF-8')
while True:
    startSpam()
</code>

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

import keyboard, time

def startSpam():
    for line in lines:
        keyboard.write(line, delay=0.000000001)
        keyboard.press("Enter")

time.sleep(5)
file = open("C:\\Users\\Matvey\\Desktop\\SpamMsg.txt", "r", encoding='UTF-8')
lines = file.readlines()
file.close()
while True:
    startSpam()

Или по окончанию файла перематывать на его начало.

import keyboard, time

def startSpam():
    line = file.readline()
    if not line:
        file.seek(0)
        line = file.readline()
    keyboard.write(line, delay=0.000000001)
    keyboard.press("Enter")

time.sleep(5)
file = open("C:\\Users\\Matvey\\Desktop\\SpamMsg.txt", "r", encoding='UTF-8')
while True:
    startSpam()


Помогите исправить ошибку PyScripter root.mainloop()
Пишу приложение:

if __name__ == "__main__":
    root = Tk()
    root.configure()
    root.mainloop()

Вроде все красиво, запускается окно Tk.
Но если я использую в PyScripter функцию 'Аварийное завершение отладки', то получаю ошибку:

Traceback (most recent call last):
  File "C:\Users\User\Desktop\Python File.py", line 9, in <module>
    root.mainloop()
  File "C:\ProgramData\ASCON\KOMPAS-3D\19\Python 3\App\lib\tkinter\__init__.py", line 1429, in mainloop
    self.tk.mainloop(n)
KeyboardInterrupt

Можно ли как-то остановить программу из PyScripter без этой ошибки?
(Пишу программу без привычной рамки, а соответственно не могу завершить из окна...)

Попробуйте сделать конструкцию
try/except над
mainLoop()

try:
    tk.mainloop()
except KeyboardInterrupt:
    pass


Ввод числового значения через сообщение telebot. Python
Как при использовании telebot получить из сообщения числовое значение? При использовании i = message.text.lower() пользователь вводит число, но получается строчное значение, которое впоследствии нельзя использовать для дальнейшего математического вычисления. Есть ли методы, для перевода строчного значения введенного из сообщения в числовое?

Используйте преобразование в
int():

i = int(message.text.lower())

И рекомендую вам почитать про типы данных в Python.


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

index
data
x1
x2
x3
Result

A
st1
4
5
6

B
st2
3
7
6

..
..
..
..
..

Z
st500
1
0
8

как мне красиво найти максимум по каждой строке A-Z среди столбцов x1-x3  и в столбец Result занести название столбца, в котором найден максимум.

При df:

    data  x1  x2  x3
A   str1  76  41  33
B   str2  18  82  28
C   str3  62  33  48
.  .  .
X  str24  57  66   1
Y  str25  10  86  24
Z  str26  50  74  58

воспользуйтесь методом
idxmax с указанием нужной
axis:

df["Result"] = df[["x1", "x2", "x3"]].idxmax(axis=1)

результат будет таким:

    data  x1  x2  x3 Result
A   str1  76  41  33     x1
B   str2  18  82  28     x2
C   str3  62  33  48     x1
.  .  .
X  str24  57  66   1     x2
Y  str25  10  86  24     x2
Z  str26  50  74  58     x2

Дополнение:
Если вам нужно найти максимумы в числовых столбцах, а их количество не известно или может меняться, есть более универсальный способ:

import numpy as np

df["Result"] = df.select_dtypes(np.number).idxmax(axis=1)

Результат, понятно, будет тот же.


Слова для кадавра Python
Задание звучит так:

Напишите программу, которая определит слова, подходящие под некоторый
шаблон словообразования, которым в данный момент владеет кадавр.
Обозначения в шаблоне: 1 — не гласная, 0 — гласная, ? — строго одна
любая буква, * — любое количество любых букв, в том числе ни одной.
Гарантируется, что * в шаблоне не более одной.

Примеры:
10?010
молоко
отруби
обрат
селёдка
буханка
головы

молоко
головы

1010*0
отруби
обрат
сельдь
хлеб
грузди

Есть нечего, значить!

Часть решения мне сразу пришла в голову:

lettersG = 'ауоыиэяюеё'
lettersN = 'бвгджзйклмнпрстфхцчшщ'
st = ''
while True:
    checkW = input()
    if checkW == '':
        break
    if len(checkW) < len(w) or len(checkW) > len(w):
        continue
    for i in range(len(w)):
        if w[i] == '1':
            if checkW[i] not in lettersN:
                break
        if w[i] == '0':
            if checkW[i] not in lettersG:
                break
        if i == len(w) - 1:
            st += ' ' + checkW
            print(checkW)
if st == '':
    print('Есть нечего, значить!')

Это решение даже проходит несколько тестов, но всё-таки два случая у меня не учитываются. То есть это символ '?', так как я считаю, что это бесполезно. А второй случай - если в шаблоне присутствует '*'. У меня нет никаких идей, что делать, если в шаблоне встречается звёздочка. Подскажите, пожалуйста

Идея для звёздочки...
Разбить шаблон на 2 части по звёздочке. Затем левую часть шаблона сравнить с начальным куском слова такой же длины как и часть шаблона. Ну а правую часть шаблона аналогично, только с куском слова с конца.
<code>
def check_part(template, word):
    lettersG = 'ауоыиэяюеё'
    lettersN = 'бвгджзйклмнпрстфхцчшщ'
    if (len(template) != len(word)):
        return False
    for t,w in zip(template, word):
        if (t == "0" and w not in lettersG) or (t == "1" and w not in lettersN):
            return False
    return True

def check(template, word):
    if "*" in template:
        left, right = template.split("*", 1)
        return check_part(left, word[:len(left)]) and check_part(right, word[len(word)-len(right):])
    else:
        return check_part(template, word)

check("10*10", "молоко")
</code>


проблема в коде Python
Проблема в том что не получается выводить следующе число после введенного
<code>
f3 = open("log32.txt", "r")
lst3 = f3.readlines()
a = lst3

while True:
    y = int(input("a"))

for t in a:
        if t == y:
                print(lst3[i:len(lst3+1):1])
</code>

В этом коде не совсем есть смысл:

while True:
y = int(input("a"))

Надо написать без цикла, либо ограничить его итерации.
Можно пройтись по данным и foreach и сконвертировать числа.

f3 = open("log32.txt", "r")
lst3 = f3.readlines()
a = lst3

y = int(input("a"))

for t in a:
    if int(t) == y:
        print(t)

Вот как я проверил одно число на равенство.
В log32.txt ,были числа от 1 до 10 в строчку.


Как обновить pandas dataframe данными из словаря?
Есть датафрейм:

test_dict = {
    'A':1,
    'B':2,
    'C':3,
    'D':None
    }
test_dict_df = pd.DataFrame.from_dict(test_dict.items())
test_dict_df = test_dict_df.rename(columns={0:'name', 1:'value'})

Теперь в этом датафрейме хочу по словарю
update_dict заменить значение столбца:

update_dict = {'D':33}

for i,x in update_dict.items():
    test_dict_df[test_dict_df['name']==i]['value'] = x

Но он никак не обновляет таким циклом датафрейм (
хочу именно что-то вроде цикла, потому что в
update_dict может быть несколько
keys.
Может, через
apply как-то можно?

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

t = test_dict_df["name"].map(update_dict).dropna()
test_dict_df.loc[t.index, "value"] = t

результат:

In [276]: test_dict_df
Out[276]:
  name  value
0    A    1.0
1    B    2.0
2    C    3.0
3    D   33.0

PS метод Series.map() заменит все значения ключей на соответствующие им значения, поэтому цикл здесь не нужен.


Как использовать словари в условиях?
Сейчас пишу телеграмм бота на библиотеке pytelegrambotapi.
В этой библиотеке можно ставить условие на сообщение от пользователя, то есть если сообщение пользователя равно какое-то слово, то бот отвечает ответ на сообщение
Так вот, появилась идея сделать конструктор команд. Админ пишет в личные сообщение боту, например Слово; Ответ на Слово, это сообщение я разделяю по словам и заношу в словарь(первые слова до ; будут ключом, все остальные, после ; - значением.
Итак, например админ добавил 5 команд и ответы на них, они хранятся в словаре, как ключ-значение.
Как мне можно в обработчике команд сделать, что если сообщение от пользователя было равно одному из ключей, то бот отвечал ему значением этого ключа?

Попробуйте так:
qa - вашь словарь где вопросы и ответы;
<code>
if message.text in qa:
     bot.send_message(qa[message.text], send_mess, parse_mode='html')
else:
     bot.send_message('Я вас не понял', send_mess, parse_mode='html')
</code>


python считывание выражений из текстового файла и вычисление результата
Я новичок, ничего похожего не нашел.
Есть файл
calc.txt, в котором хранятся записи вида

120 + 45
23 / 4

то есть
A + B, разделённые пробелами.
Операнды — целые числа. Операции — арифметические (включая деление нацело и нахождение остатка).
Напишите программу, которая вычисляет все эти операции и находит сумму их результатов. Пропишите обработку возможных ошибок. Программа не должна завершаться при первой же ошибке, она учитывает все верные строки и выводит найденный ответ.
Я написал такой код, мне сказали eval использовать небезопасно, помогите исправить.

with open('calc.txt') as file_data:
    result = 0
    for line in file_data:
        try:
            result += eval(line)
        except (SyntaxError, TypeError):
            pass
    print('Результат:', result)

Есть еще такой способ. Он сложнее в понимании, зато проще добавлять новые арефметические опрации.
<code>
#Создаем словарь с лямбда-функциями для каждого арефметического действия.
operators = {
    '+':lambda a, b: a + b,
    '-':lambda a, b: a - b,
    '*':lambda a, b: a * b,
    '/':lambda a, b: a / b,
}

with open('calc.txt') as file_data:
    result = 0
    for line in file_data:
        try:
            #Ищем арефметический знак в строке
            for i in operators:
                if i in line:
                    line = line.split(f' {i} ') #Разбиваем пример на два числа
                    result += operators[i](int(line[0]), int(line[1]))
                    break
        except (SyntaxError, TypeError):
            pass
    print('Результат:', result)
</code>


Транспонирование данных в таблице Python
Необходимо транспонировать столбцы в таблице. Важно, что значения названия столбцов (A,B) - это строковые переменные должны стать названиями полученных вертикальных столбцов, а порядковые номера X(1)... порядковым номером строк полученной таблицы.
Исходный DataFrame:

   Name/X     X1  X2  X3  X4
    A         10  12  33  31
    B         22  14  44  17

Выход должен быть таким:

 N   A   B
 1   10  22
 2   12  14
 3   33  44
 4   31  17

Сначала нужно сделать UNPIVOT по столбцам "X*", превратив таблицу из широкой в высокую, а после этого сделать PIVOT, используя наименования "X*" столбцов в качестве индекса, а значения из столбца "Name/X" в качестве наименований будущих столбцов:

res = (df
      .set_index("Name/X")
      .stack()
      .reset_index()
      .pivot_table(index="level_1", columns="Name/X", values=0)
      .reset_index(drop=True)

результат:

In [243]: res
Out[243]:
Name/X   A   B
0       10  22
1       12  14
2       33  44
3       31  17

А как сделать в конечной таблице в столбце Name/X сделать не значения
индекса строк, а порядковый номер строки, который соответствует номеру
столбца в исходной таблице?

res = (df
       .set_index("Name/X")
       .stack()
       .reset_index()
       .pivot_table(index="level_1", columns="Name/X", values=0)
       .rename_axis(None))
res.index = res.index.str.replace(r"^\D+", "", regex=True)

результат:

In [254]: res
Out[254]:
Name/X   A   B
1       10  22
2       12  14
3       33  44
4       31  17


Получить ключи по булевому значению
Просьба, подсказать, как корректно получить ключи по значению, при условие что значения является булевыми
имею:
<code>
dictr = {'choice': {'ty2': True, 'rt24': False, '89': False}}
</code>
к примеру, вывести ключи, где значение True

можно сделать так:
<code>
dictr = {'choice': {'ty2': True, 'rt24': False, '89': False}}

value = True
res = [item[0] for item in dictr['choice'].items() if item[1] == value]

print(res)
</code>
если же нужна возможность вложенного обхода ВСЕГО словаря, то нужно просто будет создать аналогичную рекурсивную функцию


Помогите преобразовать строку
Для доступа к реестру хочу использовать winreg.
пример из интернета:

Winreg(winreg.HKEY_CURRENT_USER, r"SOFTWARE\\RegTest\\test1")

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

def addreg(r'HKEY_CURRENT_USER\\SOFTWARE\\RegTest\\test1')

Вопрос 1: Как вырезать из строки HKEY_CURRENT_USER ?
Вопрос 2: Есть ли в функционале python функция преобразующая строку 'HKEY_CURRENT_USER' в ссылку winreg.HKEY_CURRENT_USER?
(нехочется писать if ... Winreg(winreg...) 5 раз для каждого раздела реестра)

Забить словарь соответствий строк ключам и вытаскивать значения через него.

import winreg

keys_map = {
    "HKEY_CLASSES_ROOT"     : winreg.HKEY_CLASSES_ROOT    ,
    "HKEY_CURRENT_USER"     : winreg.HKEY_CURRENT_USER    ,
    "HKEY_LOCAL_MACHINE"    : winreg.HKEY_LOCAL_MACHINE   ,
    "HKEY_USERS"            : winreg.HKEY_USERS           ,
    "HKEY_PERFORMANCE_DATA" : winreg.HKEY_PERFORMANCE_DATA,
    "HKEY_CURRENT_CONFIG"   : winreg.HKEY_CURRENT_CONFIG
}
def str2key(fullkey):
    root, subkey = fullkey.split(r"\\", 1)
    if root in keys_map:
        return (keys_map[root], subkey)
    print(f"Unknown root key '{root}'")

print(str2key(r'HKEY_CURRENT_USER\\SOFTWARE\\RegTest\\test1'))
print(str2key(r'WTF\\SOFTWARE\\RegTest\\test2'))

(18446744071562067969, 'SOFTWARE\\\\RegTest\\\\test1')
Unknown root key 'WTF'
None

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

Winreg(*str2key(r'HKEY_CURRENT_USER\\SOFTWARE\\RegTest\\test1'))
# или
key, subkey = str2key(r'HKEY_CURRENT_USER\\SOFTWARE\\RegTest\\test1')
Winreg(key, subkey)


Найти всевозможные комбинации монет
Есть монеты, 1р 2р 5р 10р 25р 50р 100р 150р 200р.
Найти всевозможные кол-во комбинаций чтоб в общей сумме было 200р
Пример: 200 монеток по 1 рублю. 100 монеток по 2 р и т.п
<code>
a = [1, 2, 5, 10, 25, 50, 100, 150, 200]
b = 200
for n in range(1, len(a) + 1):
    comb = it.combinations(a, n)
    for i in comb:
        if sum(i) == b:
            print(i)'
</code>
Написал такой код, но проблема в том что он берет один элемент массива 1 раз, как сделать чтоб он брал неограниченное кол-во раз?


не верно определяется ID при создании объекта в Django
Нужно было сделать собственный slug, в который бы входил номер объекта (уникальный для каждого адреса) и номер ID в БД (sqlite3), т.к. тип объекта по адресу может быть различным. В итоге хотел получить для себя в БД уникальный slug =  №_ID. Все удалось сделать, НО не могу понять где ошибка. Создал к прмиеру 3 записей в БД, удалил две записи (2, 3), создаю новую запись, ID показывает как следующий номер записи в БД (4), но при этом slug = №_2, а должен быть равен ID (4). После чего, создаю еще одну запись (3), все работает нормально ID = 5, slug = №_5.
models.py
<code>
def funcc():
    nm = Object.objects.all()
    ob = Object.objects.count()
    ob = ob + 1
    for nn in nm:
        if nn.id > 0:
            ob = Object.objects.latest('id')
            ob = ob.id + 1
        else:
            ob
    return ob

id_object = models.CharField(max_length=50, default=funcc, verbose_name="ID Объекта", unique=True, blank=True, null=True, editable=False)
id_fias = models.CharField(max_length=50, default='', null=False, blank=False, db_index=True)
slug = models.SlugField(unique=True, blank=True, null=True)

def save(self, *args, **kwargs):

        if not self.slug:
            self.slug = str('{}_{}'.format(self.id_fias, self.id_object))
        super().save(*args, **kwargs)
</code>

можно просто получить последний id, а не бегать по всем объектам в цикле

def get_new_id():
    last_obj = Object.objects.order_by('-id').first()
    last_id = last_obj.id if last_obj else 0
    return last_id + 1

Так же можно улучшить код, если вместо получения целого объекта получать только те поля, которые нам нужны, используя
Object.objects.values
p.s.: старайся не использовать ничего не значащие названия
func,
nm,
nn,
ob. Если программа хоть как-то разрастется, то ты потом задолбаешься читать свой код


Что нужно исправить? чтобы часть после else работала
Что нужно исправить? чтобы часть после else работала так же как часть до нее, т.е. задается вопрос при ответе на него выдается ответ. И как после этого зациклить код, чтобы при ответе "Nein" программа стартовала заново, а при ответе "Ja" выдавало сообщение message_J.
Cпасибо!
<code>
question = input('Wie heißt du?')
answer = input('Bist du Frau oder Mann?')

message_N = "GO AGAIN BOYS!!!"
message_E = "Nein"
message_J = "Too bad, lmao"
message_f = f"Sehr geehrte Frau {question},\nIch grüße dich!"
message_m = f"Sehr geehrter Herr {question}, \nIch grüße dich!"

if question == str():
    print(answer)
if answer == "Mann":
    print(message_m)
elif answer == "Frau":
    print(message_f)
**else:
    answer == input('Bist du jemanden anderer?')
    print(answer)
if answer == "Ja":
    print(message_J)
elif answer == "Nein":
    print(message_N)**
</code>

Очень просто. Создайте цикл
while True. Вот код:

message_N = "GO AGAIN BOYS!!!"
message_E = "Nein"
message_J = "Too bad, lmao"

while True: #Создаем бесконечный цикл
    question = input('Wie heißt du?')
    answer = input('Bist du Frau oder Mann?')

    message_f = f"Sehr geehrte Frau {question},\nIch grüße dich!"
    message_m = f"Sehr geehrter Herr {question}, \nIch grüße dich!"

    if question == str():
        print(answer)
    if answer == "Mann":
        print(message_m)
    elif answer == "Frau":
        print(message_f)
    else:
        answer == input('Bist du jemanden anderer?')
        print(answer)
    if answer == "Ja":
        print(message_J)
        break #Выходим из цикла
    elif answer == "Nein":
        print(message_N)
        continue #Запускаем цикл заново

Подробнее про цикл
while.


Помогите разобраться со словарями в Python [закрыт]

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

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

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

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

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

ну алгоритм простой

вы разбиваете текст на слова через
split()

дальше вы проверяете, есть ли данное слово в словаре в качестве ключа и если нет - добавляете слово со значением 0

прибавляете на 1 значение по ключу в качестве которого используете ваше слово

проще всего сделать так:

words = dict()

...

words[word] = word.get(word, 0) + 1

word.get(word, 0) пытается извлечь значение по ключу
word и если такого ключа в словаре нет, то возвращает 0


Как вынести выражения из под скобок после чего решить его?
n = "√(9-5)-√(4+5)" Мне надо, чтобы алгоритм выносил 9-5 и 4+5,после чего решал эти два выражения и добавлял их в список.
Пример:
<code>
root = []

n = "√(9-5)-√(4+5)"

z = "9-5"

n = eval(z)

n = 4

root.append(n)
</code>
И точно также с 4+5

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

import re

n = "√(9-5)-√(4+5) + 15"

res = [eval(text) for text in re.findall(r'\(([0-9-+]*)\)', n)]

print(res)

правда
eval использовать надо на свой страх и риск :)


Сохранить сортировки и ширины колонок таблиц в форме Pyqt5
Есть форма, в которой находится 10 таблиц
QTabelView.
При работе с формой пользователь сам выбирает ширину колонок и сортировку.
Каждый раз при выходи из формы я собираю название таблиц и в цикле сохраняю выбранные настройки в
config файл и соответственно каждый раз их загружаю при в входе в форму.
Хотелось бы узнать если PyQt возможность делать это более просто.
Некая настройка, которая сохраняет всю структуру формы глобально для экрана.

См. комментарии
<code>
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QWidget, QPushButton, QTableWidget
from PyQt5.QtCore import QSettings, QVariant

class MainWindow(QMainWindow):

    # функция сохранения. В качестве параметра передается объект QTableWidget
    def saveTable(self, table):
        settings = QSettings("config.ini", QSettings.IniFormat)
        settings.beginGroup("main")
        header = table.horizontalHeader().saveState()
        settings.setValue(f'{table.objectName()}_header', header)
        settings.endGroup()
        settings.sync()

    # функция восстановления заголовка. В качестве параметра передается объект QTableWidget
    def restoreTable(self,table):
        settings = QSettings("config.ini", QSettings.IniFormat)
        settings.beginGroup("main")
        value = QVariant(settings.value(f'{table.objectName()}_header', None))
        if value.value():
            table.horizontalHeader().restoreState(value.value())

    # сохранение заголовков всех объектов
    # ВАЖНО. детишки типа QTableWidget будут искаться непосредственно на главном окне.
    # Если таблицы в контейнерах (табы, фреймы), то искать надо именно в них
    # Или делать рекурсивную функцию обхода всего дерева объектов
    def saveClicked(self):
        for child in self.findChildren(QTableWidget):
            self.saveTable(child)

    # То же что сохранение
    def loadClicked(self):
        # Ищем все таблицы, расположенные на self и восстанавливаем их заголовок
        for child in self.findChildren(QTableWidget):
            self.restoreTable(child)
        self.repaint()

    def __init__(self):
        QMainWindow.__init__(self)
        central_widget = QWidget(self)
        self.setCentralWidget(central_widget)
        self.grid_layout = QGridLayout()
        central_widget.setLayout(self.grid_layout)
        for i in range(1,6):
            self.table = QTableWidget(self)
            self.table.setColumnCount(4)
            self.table.setRowCount(2)
            self.table.setRowCount(100)
            self.table.setHorizontalHeaderLabels(["one", "two", "three", "four"])
            self.table.setObjectName(f"table{i}")
            self.grid_layout.addWidget(self.table, i, 0,1,2)
        self.savebutton = QPushButton("save")
        self.grid_layout.addWidget(self.savebutton, 6, 0)
        self.savebutton.clicked.connect(self.saveClicked)
        self.loadbutton = QPushButton("load")
        self.grid_layout.addWidget(self.loadbutton, 6, 1)
        self.loadbutton.clicked.connect(self.loadClicked)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.showMaximized()
    sys.exit(app.exec())
</code>


из for не передаётся аргумент, ошибка missing 1 required positional argument

TypeError: running() missing 1 required positional argument: 'track'

Не понимаю, почему питону не нравится как из for я передаю аргумент в функцию, как правильно это записать? Без класса все работает

runners = 3
long = 100
road = [[1] * runners for i in range(long)]

class standart:
    score = []
    winner = []

    def __init__(self, LONG, RUNNERS, ROAD):
        self.long = LONG
        self.runners = RUNNERS
        self.road = ROAD

    def running(self, track):
        run = 0
        for i in range(self.long):
            run += self.road[i][track]
        return run

    for tr in range(runners):
        score.append(running(tr))

Aa = standart(long, runners, road)
print(Aa.score)

а что у вас
<code>
for tr in range(runners):
    score.append(running(tr))
</code>
делает внутри класса?
класс содержит методы и члены класса, но в вашем случае он еще и содержит голый код


Выведение результата сложения чисел в ENTRY
<code>
from tkinter import *

w = Tk()
w.title("window")
w.geometry("300x200")

def btn1_click():
    entry.insert(END, '1')
def btn2_click():
    entry.insert(END, '2')
def plus():
    entry.insert(END, '+')
def minus():
    entry.insert(END, '-')
def clear_one():
    entry.delete(len(entry.get())-1)

message = IntVar()

entry = Entry(width=50)
entry.grid(row=0, column=0, columnspan=5)
btn1 = Button(text="1", height=3, width=3, command=btn1_click).grid(row=1, column=1, padx=3, pady=3, sticky="e")
btn2 = Button(text="2", height=3, width=3, command=btn2_click).grid(row=1, column=2, padx=3, pady=3, sticky="e")
btnplus = Button(text="+", height=3, width=3, command=plus).grid(row=2, column=1, padx=3, pady=3, sticky="e")
btnminus = Button(text="-", height=3, width=3, command=minus).grid(row=2, column=2, padx=3, pady=3, sticky="e")
btnequals= Button(text="=", height=3, width=3).grid(row=2, column=3, padx=3, pady=3, sticky="e")
btnclear = Button(text="del", height=3, width=3, command=clear_one).grid(row=3, column=2, padx=8, pady=3, sticky="e")

w.mainloop()
</code>
Вопрос вот какой, я хочу, чтобы при нажатии на "=" выводился результат сложения двух чисел в ENTRY, что делать в этом случае?
Пытался сделать с импортом math, но не понял, что добавлять.

Примерно так, вариант не идеальный на скорую руку, это чтобы вы поняли в какую сторону идти дальше:
<code>
from tkinter import *

w = Tk()
w.title("window")
w.geometry("300x200")
arr = []
operand = None

def btn1_click():
    entry.insert(END, '1')
    arr.append(1)
def btn2_click():
    entry.insert(END, '2')
    arr.append(2)
def plus():
    entry.insert(END, '+')
    global operand
    operand = 'plus'
def minus():
    entry.insert(END, '-')
    global operand
    operand = 'minus'
def clear_one():
    entry.delete(len(entry.get())-1)
    arr.clear()
def equals():
    print(arr)
    if operand == 'plus':
        entry.delete(0, 'end')
        entry.insert(END, sum(arr))
    elif operand == 'minus':
        entry.delete(0, 'end')
        entry.insert(END, arr[0]-arr[1])

message = IntVar()

entry = Entry(width=50)
entry.grid(row=0, column=0, columnspan=5)
btn1 = Button(text="1", height=3, width=3, command=btn1_click).grid(row=1, column=1, padx=3, pady=3, sticky="e")
btn2 = Button(text="2", height=3, width=3, command=btn2_click).grid(row=1, column=2, padx=3, pady=3, sticky="e")
btnplus = Button(text="+", height=3, width=3, command=plus).grid(row=2, column=1, padx=3, pady=3, sticky="e")
btnminus = Button(text="-", height=3, width=3, command=minus).grid(row=2, column=2, padx=3, pady=3, sticky="e")
btnequals= Button(text="=", height=3, width=3, command=equals).grid(row=2, column=3, padx=3, pady=3, sticky="e")
btnclear = Button(text="del", height=3, width=3, command=clear_one).grid(row=3, column=2, padx=8, pady=3, sticky="e")

w.mainloop()
</code>


Преобразовать строку в логическое выражение?
например есть выражение str(0 != 0) нужно проверить верное ли это выражение
Без создания дополнительного движка.

eval('0 != 0')
Но вы должны понимать, что это небезопасно, так как в строке может быть вредоносный код


Как реализовать "триггер" при столкновении игрока к другому объекту(коробке) с другой областью столкновения?
Есть игра:
<code>
import pygame
from pygame.locals import *
import os
import sys

from pygame.transform import scale

pygame.init()
pygame.mixer.init()

motion = "stop"

screen = pygame.display.set_mode((512, 512))
pygame.display.set_caption('Endlace')

clock = pygame.time.Clock()
allSprites = pygame.sprite.Group()

### Настраиваем директории ###
rootPath = os.path.dirname(__file__)
resourcesPath = os.path.join(rootPath, "resources")
texturesPath = os.path.join(resourcesPath, "textures")
playerPath = os.path.join(texturesPath, "player")
skinsPath = os.path.join(playerPath, "skins")
defaultIdle = os.path.join(skinsPath, "default-idle")
defaultRun = os.path.join(skinsPath, "default-run")

### Настраиваем пути текстур ###
ground512 = pygame.image.load(os.path.join(texturesPath, "ground512x512.png"))
box = pygame.image.load(os.path.join(texturesPath, "normalbox.png"))
box = pygame.transform.scale(box, (64, 64))
playerShadow = pygame.image.load(os.path.join(playerPath, "shadow.png"))
playerShadow = pygame.transform.scale(playerShadow, (64,64))
boxSprite = pygame.sprite.Sprite()
boxSprite.image = box
boxSprite.rect = box.get_rect()

### Настраиваем шрифт ###
font1 = pygame.font.Font('font.ttf', 36)

grid1 = pygame.Rect((0,0,64,64))
fakeScreen = screen.copy()
testSurface = pygame.Surface((512,512))

screenScrollX = 0
screenScrollY = 0

frameCount = 0

mapList = [[[0,0,0,0,0,0,0,0], #layer 1
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0]],

           [[0,0,0,0,0,0,0,0], #layer 2
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0]],

           [[0,0,0,0,0,0,0,0], #layer 3
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0]],

           [[0,0,0,0,0,0,0,0], #layer 4
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0,0]],]

### Классы ###
class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(os.path.join(defaultIdle, "frame1.png"))
        self.image = pygame.transform.scale(self.image, (64, 64))
        self.rect = self.image.get_rect()
        self.rect.center = (128,128)

    def moveRight(self):
        global screenScrollX
        if not self.rect.right > 512:
            self.rect.x += 4
            # screenScrollX -= 8

    def moveLeft(self):
        global screenScrollX
        if not self.rect.left < 0:
            self.rect.x -= 4
            # screenScrollX += 8

    def moveUp(self):
        global screenScrollY
        if not self.rect.top < 0:
            self.rect.y -= 4
            # screenScrollY += 8

    def moveDown(self):
        global screenScrollY
        if not self.rect.bottom > 512:
            self.rect.y += 4
            # screenScrollY -= 8

    def moveLeftDown(self):
        global screenScrollX, screenScrollY
        if not self.rect.bottom > 512:
            if not self.rect.left < 0:
                self.rect.y += 4
                # screenScrollY -= 8
                self.rect.x -= 4
                # screenScrollX += 8

    def moveLeftUp(self):
        global screenScrollX, screenScrollY
        if not self.rect.top < 0:
            if not self.rect.left < 0:
                self.rect.y -= 4
                # screenScrollY += 8
                self.rect.x -= 4
                # screenScrollX += 8

    def moveRightDown(self):
        global screenScrollX, screenScrollY
        if not self.rect.bottom > 512:
            if not self.rect.right > 512:
                self.rect.y += 4
                # screenScrollY -= 8
                self.rect.x += 4
                # screenScrollX -= 8

    def moveRightUp(self):
        global screenScrollX, screenScrollY
        self.rect.y -= 4
        # screenScrollY += 8
        self.rect.x += 4
        # screenScrollX -= 8

player = Player()
allSprites.add(player)

def mainMenu():
    while True:
        clock.tick(60)

        screen.fill((0,0,0))

        posX, posY = pygame.mouse.get_pos()

        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

        pygame.display.flip()

def sandbox():
    global motion
    global frameCount
    while True:
        clock.tick(60)

        screen.fill((0,0,0))

        posX, posY = pygame.mouse.get_pos()

        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYUP:
                motion = "stop"
            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    boxSprite = pygame.sprite.Sprite()
                    boxSprite.image = box
                    boxSprite.rect = box.get_rect()
                    print(int(posX/64))
                    print(int(posY/64))
                    clickX = int(posX/64)
                    clickY = int(posY/64)
                    # if mapList[0][clickX][clickY] == 1:
                    #   mapList[1][clickX][clickY] = 1
                    #   boxSprite.rect.x = (posX//64)*64
                    #   boxSprite.rect.y = (posY//64)*64-28
                    #   print(mapList)
                    #   allSprites.add(boxSprite)
                    # elif mapList[1][clickX][clickY] == 1:
                    #   mapList[2][clickX][clickY] = 1
                    #   boxSprite.rect.x = (posX//64)*64-58
                    #   print(mapList)
                    #   allSprites.add(boxSprite)
                    # elif mapList[2][clickX][clickY] == 1:
                    #   mapList[3][clickX][clickY] = 1
                    #   boxSprite.rect.x = (posX//64)*64-678
                    #   print(mapList)
                    #   allSprites.add(boxSprite)
                    # else:
                    #   mapList[0][clickX][clickY] = 1
                    #   boxSprite.rect.x = (posX//64)*64
                    #   boxSprite.rect.y = (posY//64)*64
                    #   print(mapList)
                    #   allSprites.add(boxSprite)
                    mapList[0][clickX][clickY] = 1
                    boxSprite.rect.x = (posX//64)*64
                    boxSprite.rect.y = (posY//64)*64
                    # print(mapList)
                    allSprites.add(boxSprite)

        keys = pygame.key.get_pressed()

        if frameCount + 1 >= 27:
            frameCount = 0

        #moving
        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            motion = "left"
        if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            motion = "right"
        if keys[pygame.K_UP] or keys[pygame.K_w]:
            motion = "up"
        if keys[pygame.K_DOWN] or keys[pygame.K_s]:
            motion = "down"
        if keys[pygame.K_LEFT] and keys[K_UP]:
            motion = "leftup"
        if keys[pygame.K_LEFT] and keys[K_DOWN]:
            motion = "leftdown"
        if keys[pygame.K_RIGHT] and keys[K_UP]:
            motion = "rightup"
        if keys[pygame.K_RIGHT] and keys[K_DOWN]:
            motion = "rightdown"

        if motion == "left":
            player.moveLeft()
            # fakeScreen.blit(player.images[frameCount//3], (player.rect.x,player.rect.y))
            # frameCount += 1
        if motion == "right":
            player.moveRight()
            # fakeScreen.blit(player.images[frameCount//3], (player.rect.x,player.rect.y))
            # frameCount += 1
        if motion == "up":
            player.moveUp()
            # fakeScreen.blit(player.images[frameCount//3], (player.rect.x,player.rect.y))
            # frameCount += 1
        if motion == "down":
            player.moveDown()
            # fakeScreen.blit(player.images[frameCount//3], (player.rect.x,player.rect.y))

        if motion == "leftup":
            player.moveLeftUp()
        if motion == "leftdown":
            player.moveLeftDown()
        if motion == "rightup":
            player.moveRightUp()
        if motion == "rightdown":
            player.moveRightDown()

        if motion == "stop":
            pass

        # screen.blit(player, (0,0))
        fakeScreen.blit(ground512, (0,0))
        fakeScreen.blit(playerShadow, (player.rect.x, player.rect.y))
        allSprites.update()
        allSprites.draw(fakeScreen)
        text2 = font1.render(str(int(clock.get_fps())), False,
                  (255, 255, 255))
        fakeScreen.blit(text2, (0,0))
        screen.blit(pygame.transform.scale(fakeScreen, (512, 512)), (screenScrollX,screenScrollY))
        pygame.display.flip()

sandbox()
</code>
И мне захотелось реализовать систему коллизии с коробками, которые появляются по нажатии на любую свободную область, но так как игра показывается "сверху-вниз", то игрок, при коллизии с любой коробки с задней стороны, половина игрока должна быть спрятана за игроком. И возникает вопрос: как сделать так, что коллизия с коробкой происходила только после коллизии другого прямоугольника.

Решил проблему, проверяя каждый раз при перемещении игрока, накладывается ли игрок с одним с коробок, и если так и есть, то "отталкивать" игрока назад на столько же пикселей, сколько и скорость игрока.
<code>
def checkForCollision(self):
    isCollision = False

    for x in range(len(collisionRects)):
        isCollision = False

        if self.rect.colliderect(collisionRects[x]):
            isCollision = True

        if isCollision == True:
                break

    return isCollision
</code>


Создание ID из индекса и столбца pandas.DataFrame
Есть несколько файлов
.csv, в которых хранятся машины, распределенные по маркам (
AUDI.csv,
FORD.csv и т.д.). В каждом таком файле есть поле
brand, где хранится марка автомобиля.
Как в
pandas.Dataframe сделать столбец
"ID", который будет создаваться из индекса строки в DataFrame и из первой и последней буквы поля brand? Результат должен выглядеть так:

|index| ID | brand | model |
____________________________
| 0   |AI-0| AUDI  |  TT   |

Ну прямо так как вы и описали в вопросе:

df["new"] = df["brand"].str[0] + df["brand"].str[-1] + "-" + df.index.astype(str)

результат:

In [22]: df
Out[22]:
     ID brand model   new
0  AI-0  AUDI    TT  AI-0


Как вести лог ошибок Telegram-Bot python? Как автоматически перезагружать бота при возникновении ошибки?
Всех приветствую!
Подскажите, как правильно будет вести лог ошибок Telegram bot'a на python?
Необходима классификация ошибок по критичности или записи о том, что пропало соединение.
Как правильно расставить в коде функции логирования ошибок? Чтобы лишний раз не захламлять код.
И как дополнительный вопрос, возможно ли автоматически перезагружать Telegram bot через батник, во время возникновения ошибки? (функция перезапуска уже имеется, но с inline кнопки).
Очень буду рад примерам и более подробным объяснениям.
P.S. Пишу бота на python с библиотекой TelegramBotAPI и базой SQLite.

Для логирования можно воспользоваться этим:
<code>
import logging
logger = telebot.logger
telebot.logger.basicConfig(filename='filename.log', level=logging.DEBUG,
                    format=' %(asctime)s - %(levelname)s - %(message)s')
</code>
А чтобы перезагружать бот в случае ошибок... это надо сторонними средствами его мониторить, может что-то самописное, или поискать готовые решения.


как удалить пустую строку из листа пайтон
к примеру ест код
list = [12,3,1,'',99,7,120]
как удалить пустой элемент ?

Как вариант, если нужно удалить сразу и пустые строки, и нули, и пустые коллекции, и значения
False, в общем всё "пустое" одним махом:

lst = [12,3,1,'',99,7,120]
print(list(filter(None, lst)))

# [12, 3, 1, 99, 7, 120]

Ну или ладно, пусть только пустые строки удалять нужно:

lst = [12,3,1,'',99,7,120]
print(list(filter(''.__ne__, lst)))

# [12, 3, 1, 99, 7, 120]


Заменить слова из списка на другие в тексте
Имеются тексты:

text1 = "Шла Саша по шоссе вместе с Машей"
text2 = "Сегодня погода должна быть плохой"
text3 = "Я хочу купить торты и печенье"

Есть два списка:

spisok1 = ["Саша", "Машей", "плохой", "торты"]
spisok2 = ["Вика", "Никой", "хорошей", "фрукты"]

Необходимо заменить во всех текстах слова из spisok1 на слова из spisok2, чтобы получить следующий вид текстов:

text1 = "Шла Вика по шоссе вместе с Никой"
text2 = "Сегодня погода должна быть хорошей"
text3 = "Я хочу купить фрукты и печенье"

Пыталась использовать следующий код, но не получаю нужного результата

import re

texts = [text1, text2, text3]
new_texts = []
for text in texts:
    for word_number in range(0, len(spisok1)):
        new_text = re.sub(spisok1[word_number]), spisok2[word_number], text)
    new_texts.append(new_text)
print(new_texts)

Помогите, пожалуйста, с решением этой задачи

Регулярным выражением одним махом всю строчку:
<code>
_map = dict(zip(spisok1, spisok2))

regexp = "|".join(re.escape(k) for k in _map)
new_texts = [re.sub(regexp, lambda m: _map[m.group(0)], text) for text in texts]
</code>
Для упрощения поиска "старое слово"->"новое слово" два списка свёл в соответствующий словарь.


Помогите с решенем задачи Python
<code>
with open('int3.txt') as file:

  n = int(file.read())

  one = '1'
  zero = '0'
  ind_one = 0
  ind_zero = 0
  s = {'0'*n, '1'*n}
  for i in range(2**n):
      if ind_one > n-1:
          ind_one = 0
      list_1 = ['0'] * n
      list_1.insert(ind_one, one)
      #list_1.remove(list_1[ind_one+1])
      ind_one += 1
      s.add(''.join(list_1[:3]))

      if ind_zero > n-1:
          ind_zero = 0
      list_2 = ['1'] * n
      list_2.insert(ind_zero, zero)
      #list_2.remove(list_2[ind_zero+1])
      ind_zero += 1
      s.add(''.join(list_2[:3]))

print(sorted(s))
for i in sorted(s):
  print(i)

n = int(file.read())

  one = '1'
  zero = '0'
  ind_one = 0
  ind_zero = 0
  s = {'0'*n, '1'*n}
  for i in range(2**n):
      if ind_one > n-1:
          ind_one = 0
      list_1 = ['0'] * n
      list_1.insert(ind_one, one)
      #list_1.remove(list_1[ind_one+1])
      ind_one += 1
      s.add(''.join(list_1[:3]))

      if ind_zero > n-1:
          ind_zero = 0
      list_2 = ['1'] * n
      list_2.insert(ind_zero, zero)
      #list_2.remove(list_2[ind_zero+1])
      ind_zero += 1
      s.add(''.join(list_2[:3]))

print(sorted(s))
for i in sorted(s):
  print(i)
</code>
Нужно чтоб на каждой следующей строке было удалено или добавлена одна цифра 0 или 1 и чтоб каждая строка отличалась от предыдущей.
Что должно вывести:
000
001
011
010
110
111
101
100
Что выводит:
000
101
110
111
001
011
100
010
p.s
при новом запуске, порядок меняется

n = 3# количество позиций
max_digit = int('1' * n, 2)# максимальное число в десятичной системе 7

s = [bin(x)[2::].zfill(n) for x in range(max_digit + 1)]
# делаем список из вариантов в двоичной системе используя генератор от
# 0 до 7 включительно. Дополняя нулями до количества позиций

result = ' '.join(s)
# соединяем элементы списка в одну строку, разделяя пробелом

print(result)
# выводим на экран

Видим:

>>>000 001 010 011 100 101 110 111


Как решить простое уравнение Python
Пишу систему ГДЗ. Нужно, чтобы пользователь ввёл уравнение (с 1 неизвестным x), а программа вывела решение и ответ. Пытался делать через срезы, но это очень долго.
Примеры:
1)Ввод:

x+226=300
Вывод:

x=300-226
x=74

2)Ввод:

x+22-(33+44)=0

Вывод:

x+22-77=0
x+22=0+77
x+22=77
x=77-22
x=55

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

from sympy import symbols, solve, parse_expr, simplify
from sympy.parsing.sympy_parser import standard_transformations, implicit_multiplication_application

transformations = (standard_transformations + (implicit_multiplication_application,))

formula = "x(4x+22)-(3x+44)^2=0"

def map_operations(formula_str):
    return formula_str.replace("^", "**").replace("=", "-")

f = parse_expr(map_operations(formula), transformations=transformations)
roots = solve(f) # <-- вернуть все корни уравнения в виде списка
print(roots)

вывод:

[-121/5 - 11*sqrt(41)/5, -121/5 + 11*sqrt(41)/5]

также модуль SymPy умеет аналитически упрощать выражения:

In [7]: simplify(f)
Out[7]: -5*x**2 - 242*x - 1936

In [8]: simplify(parse_expr("(x-1) * (x+1)"))
Out[8]: x**2 - 1


Установить точность вещ. числа для определения числа Фибоначчи
Задание такое
Вам дается последовательность чисел. Для каждого числа определите, является ли оно числом Фибоначчи.
Первая строка содержит одно число N  – количество запросов. Следующие N строк содержат по одному целому числу. При этом соблюдаются следующие ограничения:
Размер каждого числа не превосходит 5000 цифр в десятичном представлении.
Wrong answer на 6 тесте. Может кто нибудь помочь, пожалуйста
<code>
import math

n = int(input())
for i in range(n):
    a = int(input())
    fib1 = ((5 * a * a - 4) ** 0.5) % 1. <= 0.1 * 10 ** (-100)
    fib2 = ((5 * a * a + 4) ** 0.5) % 1. <= 0.1 * 10 ** (-100)
    if fib1 or fib2:
        print("Yes")
    else:
        print("No")
</code>

Очень хороший тест состоит в том, что N является числом Фибоначчи тогда и только тогда, когда 5 N^2 + 4 или 5N^2 – 4 - это квадратное число.

во-первых
полученное число можно разложить на простые множители - кол-во различных простых множителей должно быть чётным - это 100% без всякой потери точности определение квадрата
вопрос насколько быстро можно перебрать простые множители от 2 до sqrt(5N**2 + 4) при условии, что в числе 5000 цифр
а во вторых
сравнивать квадраты лучше так:

int((5 * a * a - 4) ** 0.5)) ** 2 == (5 * a * a - 4)

тут тоже будет однозначный ответ
а еще быстрее так:

value = 5 * a * a - 4
value_sqrt = math.sqrt(value)
res1 = value_sqrt * value_sqrt == value

по возможности функцию возведения в степень лучше не использовать - она медленнее обычного умножения
в-третьих
для ускорения (если провал теста из-за скорости) лучше не вычислять сразу условия и для
5N+4 и для
5N-4, а сделать последовательно, тогда на числах можно иногда экономить в 2 раза по скорости

value = 5 * a * a - 4
value_sqrt = math.sqrt(value)
if value_sqrt * value_sqrt == value:
    print("Yes")
    continue

value = 5 * a * a + 4
value_sqrt = math.sqrt(value)
if value_sqrt * value_sqrt == value:
    print("Yes")
    continue


Определите максимальное количество идущих подряд символов, среди которых не более одной буквы A. A
Текстовый файл содержит только заглавные буквы латинского алфавита
(ABC. . .Z). Определите максимальное количество идущих подряд символов,
среди которых не более одной буквы A. Не понимаю в чём я ошибся, возможно вообще по другому надо было решать?
<code>
f = open("24.txt")
st = f.read()
f.close()
cur_len = 0
max_len = 0
for x in st:
    if x == "A":
        cur_len += 1
        if cur_len > max_len:
            max_len = cur_len
    else:
        cur_len = 0
print(max_len)
</code>

Так, в качестве альтернативного алгоритма...
Разбиваем строку на подстроки по букве "A" и сразу вычисляем их длины. Далее в цикле складываем длины соседних подстрок и берём из этих сумм максимальную. Ну и прибавляем единицу так как сама буква "А" не была включена ни в одну из подстрок. Для исходной строки без букв "А" делается отдельное вычисление (просто берётся длина всей строки).
<code>
with open("24.txt") as f:
    s = f.read().strip()

seq = list(map(len, s.split("A")))
result = max(map(sum, zip(seq, seq[1:])))+1 if len(seq) > 1 else len(s)

print(result)
</code>


Как ограничить доступ к выполнению команд и Reply клавиатуре?
Всех приветствую!
Подскажите, как ограничить доступ к выполнению команд и пользовательского ввода с Reply-клавиатуры для user_id, которые отсутствуют в базе данных?
С командами пока не придумал.
Но с обработчиками Reply клавиатуры пробовал так:
<code>
def check_id(message):
    id = message.from_user.id
    cursor.execute('SELECT * FROM registration WHERE user_id=?', (id, )).fetchone()

@bot.message_handler(content_types=['text'])
def statistics_step(message):
    if message.text.lower() == 'анкета 1' and check_id is None:
        one_anketa_step(message)
    if message.text.lower() == 'анкета 2' and check_id is None:
        two_anketa_step(message)
</code>
Мой способ не сработал, бот совсем перестал реагировать на клавиатуру.
P.S. TelegramBotAPI+SQLite+Python

Попробуйте так, что-то вроде этого. Кстати в условиях вы тоже вроде ошиблись, если я правильно понял вашу логику:
<code>
def check_id(message):
    id = message.from_user.id
    record = cursor.execute('SELECT * FROM registration WHERE user_id=?', (id, )).fetchone()
    if record:
        return True
    else:
        return False

@bot.message_handler(content_types=['text'])
def statistics_step(message):
    if (message.text.lower() == 'анкета 1') and check_id(message):
        one_anketa_step(message)
    if (message.text.lower() == 'анкета 2') and check_id(message):
        two_anketa_step(message)
</code>


Помогите разобрать код на python
вот код

my_string="python"
x=0
for i in my_string:
    x += 1
    print(my_string[0:x])

не могу понять что делает строка print где написано
print(my_string[0:x])
что делает[0:x] как он достает элемент просто я такое видел когда к списку применяют
а не к строке

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

my_string[0:x]

Значит берет строку с нулевого индекса до индекса с номером 'x'. Например:

my_string = 'Hello'
my_string[0:2]

Получаем:

He


Как написать пять нулей?
Напишите программу, которая заполняет число 0. Один байт состоит из 8 бит. пример 101 = 00000101. Я хотел написать программу, но не понял как написать пять нолей перед 101.
<code>
a = input()
b = 8 - len(a)
print(b)
</code>
А потом, как сделать что бы пять нолей с начала, я не знаю.

Используйте метод строки
zfill:

print('101'.zfill(8))
# 00000101

Пример:

a = input()
b = a.zfill(8)
print(b)

S.zfill(width), где S - строка, делает длину строки не меньшей width, по необходимости заполняя первые символы нулями.
Справка.


Как разделить строку при встрече одного из заданных символов?
Как разделить строку при первой встрече одного из этих символов:
<code>
' ', ')', 'a', '3'
</code>
Кроме как перебором предложения по буквам ничего придумать не могу.

Воспользуйтесь re.split():
<code>
import re

strings = re.split(r"[ \)a3]", input_str)
</code>


Как извлечь дату из ячейки?
Имею датафрейм со стлобцами, где в ячейках следующее содержание 3/4 от 23.03.2021, 1/670 от 20.07.2021 и тд. Необходимо извлечь только конец, то есть дату. Пробовал через partition, extract, пробовал пилить ячейку и забирать последний инденкс, но тщетно. В RegEx понимаю мало, хотя скорее всего им это и решается.

Рабочий пример с использованием Series.str.extract():
<code>
In [126]: df
Out[126]:
                   col
0    3/4 от 23.03.2021
1  1/670 от 20.07.2021

In [127]: df["dt"] = df["col"].str.extract(r"\b(\d{2}\.\d{2}\.\d{4})\b")[0]

In [128]: df
Out[128]:
                   col          dt
0    3/4 от 23.03.2021  23.03.2021
1  1/670 от 20.07.2021  20.07.2021
</code>
PS на будущее - всегда приводите в вопросе воспроизводимый пример данных и результат, который вы хотите получить.


Как сделать декодер и енкодер с нуля
И так, как мне из этой строчки
Learn english please! каждую букву первую букву сдвинуть налево 13раз а каждую вторую букву направо 7 раз, и как при получении закодированного текста этим скриптом расшифровать его?

алгоритм:

идти по позиции в строке от
0 до
len(text)

четную и нечётную позицию буквы проверять через
pos % 2 == 0

найти позицию буквы в словаре через
dictionary.index(letter), где словарь содержит все буквы английского алфавита

вычислить новую позицию через
pos_new = (pos_old + shift + len(dictionary)) % pos_old + shift + len(dictionary) - такой подход сделан чтобы и отрицательные позиции корректно обрабатывать

извлечь букву в словаре по новой позиции и заменить старую (или собрать новую строку)

при расшифровке просто менять знак у смещения влево или вправо

dictionary = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ! '

#    ENCODE
def encode(text):
  encoded = ''
  left = 13
  right = 7

  for pos in range(len(text)):
    index = dictionary.index(text[pos])
    if pos % 2 == 0:
      index = (index + right + len(dictionary)) % len(dictionary)
    else:
      index = (index - left + len(dictionary)) % len(dictionary)
    encoded += dictionary[index]

  return encoded

#    DECODE
def decode(encoded_text):
  decoded = ''
  left = 13
  right = 7

  for pos in range(len(encoded_text)):
    index = dictionary.index(encoded_text[pos])
    if pos % 2 == 0:
      index = (index - right + len(dictionary)) % len(dictionary)
    else:
      index = (index + left + len(dictionary)) % len(dictionary)
    decoded += dictionary[index]
  return decoded


Требует ли celery предварительного создания очередей
Требует ли celery обязательного предварительного создания очередей?
Или можно запускать её и без них (для теста запуска сервиса).

Для работы в конфигурации celery нужно указать, какой брокер использовать, т.е. тип брокера и адрес.

celery сама позаботится обо всем, включая создание очередей.
Если вопрос про то, сможет ли celery работать без брокера вообще, то ответ - нет, не сможет.


Как написать программу так чтобы она читала букву и цифру?
Задача выглядеть так, в одну строчку написано имя человека и его возраст, и нужно написать так чтобы программу написал его возраст уже в следующем году. К примеру Егору 16 лет, и чтобы программа написала Егору 17 лет. По факту задача легкая но я хз как её писать. Моя попытка:
<code>
a,b = input(),int(input())
c = b + 1
print(a,c)
</code>

в одну строчку - это так что ли?
ту и ввод и вывод одной строкой

print(*[i[1] if i[0] == 0 else (int(i[1]) + 1) for i in enumerate(input().split())])

или имеется в виду ввести данные одной строкой?

a,b = input().split()
c = int(b) + 1
print(a,c)


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

conn = sql.connect('data_per.db')
cur = conn.cursor()
cur.execute("""CREATE TABLE IF NOT EXISTS users(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT,
    age INT,
    );
""")
conn.commit()

Потом я добавляю в нее данные:

lst = ['Alex', 34]
con = sql.connect('data_per.db')
    cur = con.cursor()
    cur.execute("INSERT INTO users VALUES(?, ?);", lst)
    con.commit()

Выдает ошибку, что в таблице 3 столбца а пытаюсь добавить 2, почему id автоматически не добавляется, объясните что не так? я использую sqlite

Нужно указывать столбцы:

cur.execute("INSERT INTO users (name, age) VALUES (?, ?)", lst)

При такой записе, поле
id, будет само заполняться


Найти наименьшее екатериноекатерининское число
Натуральное число, превышающее 1, назовём екатериноекатерининским, если оно делится как на число своих делителей, так и на обоих его соседей по натуральному ряду. [то есть, если число это N, а число его делителей d, то искомое число N должно делиться на d, d-1 и d+1]
Нетрудно доказать, что екатериноекатерининских чисел бесконечно много (эта задача имеет красивое решение в одну строчку, постарайтесь до него додуматься).
Но чему равно наименьшее екатериноекатерининское число?
У меня получился очень плохой и медленно работающий код на Python:
<code>
def numdiv(k): # возвращает количество делителей числа
    if k==1:
        return 1
    d = 2 # 1 и само число
    for i in range(2, int(k/2)+1): #
        if k % i == 0:
            d += 1
    return d

for i in range (6, 200000, 6): # Очевидно, любое екатериноекатерининское число делится на 6.
    if i%(numdiv(i))==0 and i%(numdiv(i)-1)==0 and i%(numdiv(i)+1)==0:
        print(i)
</code>
Пожалуйста, посоветуйте, как изменить этот код в лучшую сторону.

Если задано число делителей можно отыскать все екатериноекатерининские (екекие) числа ему соответствующие.
Пусть
c число делителей. Тогда

НОК(c - 1, c, c + 1) == (c - 1) * c * (c + 1)    , если c - чётное
НОК(c - 1, c, c + 1) == (c - 1) * c * (c + 1) / 2, если c - нечётное

Зададим
n_max - верхняя граница екеких чисел которые мы ищем. Из уравнения
(c - 1) * c * (c + 1) / 2 <= n_max отыщем ограничение на
c.
Например для
n_max = 10^9,
c <= 1260. Для каждого значения
c в диапазоне
[2, 1260] построим все екекие числа.
Число делителей числа связано с его разложением на простые. Разложим
n = p1^e1 * p2^e2 * ... * pk^ek, где
pi - попарно различные простые,
ei - натуральные. Тогда число делителей
n равно
(e1 + 1) * (e2 + 1) * ... * (ek + 1).
Представим
c в виде произведения (не обязательно простых) множителей:
c = f1 * f2 * ... * fk. Этому представлению соответствуют
n = p1^(f1 - 1) * p2^(f2 - 1) * ... * pk^(fk - 1) у которых число делителей равно ровно
c. Простые
pi могут быть любыми не равными.
Перебрав все возможные разложения
c на множители мы переберём все семейства
n которые им соответствуют.

n которые нам подходят должны делиться на
НОК(c - 1, c, c + 1). Это дает ограничения на
pi в разложении
n. Например
c = 72.

НОК(71, 72, 73) = 186588 = 2^3 * 3^2 * 71 * 73

Разложения 72 на множители и соответствующие представления
n:

72 = 2 * 2 * 2 * 3 * 3   n = p1 * p2 * p3 * p4^2 * p5^2
72 = 2 * 2 * 2 * 9       n = p1 * p2 * p3 * p4^8
72 = 2 * 2 * 3 * 6       n = p1 * p2 * p3^2 * p4^5
72 = 2 * 2 * 18          n = p1 * p2 * p3^17
72 = 2 * 3 * 3 * 4       n = p1 * p2^2 * p3^2 * p4^3
72 = 2 * 3 * 12          n = p1 * p2^2 * p3^11
72 = 2 * 4 * 9           n = p1 * p2^3 * p3^8
72 = 2 * 6 * 6           n = p1 * p2^5 * p3^5
72 = 2 * 36              n = p1 * p2^35
72 = 3 * 3 * 8           n = p1^2 * p2^2 * p3^7
72 = 3 * 4 * 6           n = p1^2 * p2^3 * p3^5
72 = 3 * 24              n = p1^2 * p2^23
72 = 4 * 18              n = p1^3 * p2^17
72 = 6 * 12              n = p1^5 * p2^11
72 = 8 * 9               n = p1^7 * p2^8
72 = 72                  n = p1^71

Нас интересуют только представления
n которые кратны
2^3 * 3^2 * 71 * 73 если правильно подставить простые числа. Таких представлений только два, а подстановок простых чисел три:

72 = 2 * 2 * 3 * 6       n = 71 * 73 * 3^2 * 2^5

72 = 2 * 3 * 3 * 4       n = 71 * 3^2 * 73^2 * 2^3
                         n = 73 * 3^2 * 71^2 * 2^3

Аналогичный анализ для
c = 128 среди прочих показывает серию в которой одно простое не задано:
n = 2^7 * 3 * 43 * 127 * p1. Вместо
p1 может быть подставлено любое простое не равное
2, 3, 43, 127.
Серии для
c = 448 впервые включают в себя несколько простых:

n = 2^6 * 3 * 7 * 149 * 449 * p1 * p2
n = 2^6 * 3 * 7 * 149 * 449 * p1^3
n = 2^6 * 3 * 7 * 149^3 * 449 * p1
n = 2^6 * 3 * 7^3 * 149 * 449 * p1
n = 2^6 * 3^3 * 7 * 149 * 449 * p1
n = 2^13 * 3 * 7 * 149 * 449 * p1

На этих идеях построена программа, которая порождает все екекие числа в заданном диапазоне:

$ python generate.py 100000000
27241848    (72) = 2^3 * 3^2 * 71 * 73^2
26495496    (72) = 2^3 * 3^2 * 71^2 * 73
1492704    (72) = 2^5 * 3^2 * 71 * 73
884640    (96) = 2^5 * 3 * 5 * 19 * 97
5619264    (112) = 2^6 * 3 * 7 * 37 * 113
10485120... (128) = 2^7 * 3 * 43 * 127 * p1
18873216    (128) = 2^7 * 3^3 * 43 * 127
37931712    (168) = 2^6 * 3 * 7 * 13^2 * 167
95550336    (288) = 2^7 * 3^2 * 7 * 17^2 * 41
71662752    (288) = 2^5 * 3^3 * 7 * 17^2 * 41

Параметр - верхняя граница для поиска екеких чисел. Программа печатает найденные числа в таблице:

<екекое число> (<число его делителей>) = <разложение>

Для серий выводится наименьший представитель из серии и печатается многоточие.
Поиск всех чисел до 10^12 требует три секунды, возвращает 207 чисел и 64 серии.
Поиск всех чисел до 10^18 требует тринадцать с половиной часов, возвращает 4210 чисел и 3250 серий. Собственно все числа программа отыскивает за пятнадцать секунд, остальные часы уходят на проверку что других чисел нет (то есть разложения есть, но они порождают слишком большие произведения).
Код:

import math
import operator
import sys

def binary_search(lo, hi, p):
    while lo < hi - 1:
        m = (lo + hi) // 2
        if p(m):
            assert m < hi
            hi = m
        else:
            assert lo < m
            lo = m
    return hi

def max_c_by_n(n):
    return binary_search(1, n, lambda c: (c - 1) * c * (c + 1) // 2 > n)

def factors(n):
    i = 2
    j = n
    j_sqrt = math.isqrt(j)
    while i <= j_sqrt:
        if j % i == 0:
            p = 0
            while j % i == 0:
                j //= i
                p += 1
            yield i, p
            j_sqrt = math.isqrt(j)
        i += 1 if i == 2 else 2
    if j > 1:
        yield j, 1

def divisors(n):
    f = tuple(factors(n))

    def search(n):
        if n == len(f):
            yield 1
            return
        for d in search(n + 1):
            c = 1
            for i in range(f[n][1] + 1):
                yield d * c
                c *= f[n][0]

    return search(0)

def representations(c, n_max):
    lcm = math.lcm(c - 1, c, c + 1)
    f = sorted(factors(lcm), key=operator.itemgetter(-1), reverse=True)

    def search(n, p, i, tail):
        if p > n_max:
            return
        if i == len(f):
            yield n, tail
            return
        for d in divisors(n):
            if d > f[i][1]:
                b = f[i][0]
                e = d - 1
                yield from search(n // d, p * b ** e, i + 1, (b, e, tail))

    def retrieve(t):
        n, tail = t

        def traverse(t):
            while t is not None:
                b, e, t = t
                yield b, e

        return sorted(traverse(tail)), n

    return map(retrieve, search(c, 1, 0, None))

def is_prime(n):
    return all(n % d != 0 for d in range(2, math.isqrt(n) + 1))

def next_prime(n):
    n += 1
    while not is_prime(n):
        n += 1
    return n

def series(n, fixed_factor, n_max, excluded_primes):

    def search(n, max_d, factor, last_n, tail):
        if n == 1:
            yield factor, tail
            return

        p = next_prime(last_n)
        while p in excluded_primes:
            p = next_prime(p)

        for d in divisors(n):
            if 2 <= d <= max_d:
                e = d - 1
                next_factor = factor * p ** e
                if next_factor <= n_max:
                    yield from search(n // d, d, next_factor, p, (e, tail))

    def retrieve(t):

        def traverse(t):
            while t is not None:
                e, t = t
                yield e

        return tuple(traverse(t))[::-1]

    return ((f, retrieve(t)) for f, t in search(n, n, fixed_factor, 1, None))

def show_series(s):
    return ' * '.join(
        f'p{i}' if e == 1 else f'p{i}^{e}' for i, e in enumerate(s, start=1)
    )

def main():
    n = int(sys.argv[1])
    for c in range(2, max_c_by_n(n)):
        for f, e in representations(c, n):
            fixed_factor = math.prod(b ** e for b, e in f)
            fixed_expr = ' * '.join(str(b) if e == 1 else f'{b}^{e}' for b, e in f)
            if e == 1:
                print(f'{fixed_factor}    ({c}) = {fixed_expr}')
            else:
                for f, s in series(e, fixed_factor, n, set(b for b, _ in f)):
                    series_part = show_series(s)
                    print(f'{f}... ({c}) = {fixed_expr}', '*', series_part)

main()


Как ускорить в python преобразование огромного списка/кортежа русских слов в нормальную форму?
Есть потребность преобразовывать на регулярной основе большие списки русских слов в нормальную форму.
Популярная библиотека Pymorphy2 работает очень качественно, но очень медленно на больших количествах слов в циклах. Например, 880 тыс. слов на моём компьютере (AMD Phenom II X6 1090T, 3617 MHz, 20Гб ОЗУ) обрабатывает 4 минуты вот в таком коде:
<code>
import pymorphy2
morph = pymorphy2.MorphAnalyzer()
<...>
lst_newlist = [morph.parse(str_word)[0].normal_form for str_word in tuple_somewords]
</code>
Экспериментировал с массивами numpy - ускорения не получил. Всё равно упирался в цикл for.
Пытался распараллелить c помощью библиотеки joblib  - тоже не получил ускорения.
В самой библиотеке Pymorphy2, насколько я понял, проблема в том, что она не заточена на обработку массивов/списков слов - при каждом вызове очередного слова снова загружает в память свои словари и выполняет  одну и ту же рутину, которую можно было бы по-хорошему сделать один раз перед обработкой списка, а не одного слова.
Копаться и переделывать код Pymorphy2 не готов.
Pymystem3 работает значительно быстрее (раза в четыре), но по идеалогическим причинам не хочу загружать скомпилированные exe файлы на компьютер. И, похоже, что при каждом обращении к Pymystem3 требуется доступ к интернет, иначе вываливаются ошибки исполнения.
Стемминг категорически не пригоден.
Есть ли возможность ускорить Pymorphy2? Или, может быть, есть другие качественные и быстрые библиотеки для преобразования русских слов в нормальную форму?

Попробуйте закешировать результат (если память позволяет):

import pymorphy2

morph = pymorphy2.MorphAnalyzer()
norm = {}

def norm_form(word):
    res = norm.get(word)
    if res:
        return res
    res = morph.parse(word)[0].normal_form
    norm[word] = res
    return res

lst_newlist = [norm_form(str_word) for str_word in tuple_somewords]

Можно также воспользоваться встроенным Python cache декоратором, как советует @insolor:

from functools import lru_cache

# начиная с Python 3.9 можно использовать `@cache` вместо `@lru_cache(maxsize=None)`
@lru_cache(maxsize=None)
def norm_form_cached(word):
    return morph.parse(word)[0].normal_form

Сравнение скорости обработки для ~202.000 слов (роман "Идиот" Достоевского):

In [61]: with open("idiot.txt") as f:
    ...:     data = f.read()
    ...:

In [62]: %time norm_words = [morph.parse(word)[0].normal_form for word in word_tokenize(data) if word.isalpha()]
CPU times: user 35.9 s, sys: 42.8 ms, total: 36 s
Wall time: 36.1 s

In [63]: norm = {}

In [64]: %time norm_words = [norm_form(word) for word in word_tokenize(data) if word.isalpha()]
CPU times: user 4.25 s, sys: 7.62 ms, total: 4.26 s
Wall time: 4.27 s

In [65]: len(norm_words)
Out[65]: 202336

In [66]: 36.1 / 4.27
Out[66]: 8.45433255269321

In [83]: %time norm_words = [norm_form_cached(word) for word in word_tokenize(data) if word.isalpha()]
CPU times: user 4.18 s, sys: 8.45 ms, total: 4.19 s
Wall time: 4.2 s

Выигрыш в ~8.5 раз.
Статистика использования кеша:

In [84]: norm_form_cached.cache_info()
Out[84]: CacheInfo(hits=174582, misses=27754, maxsize=None, currsize=27754)

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


Возможно отформатировать код без методов списка и строк?
Формат ввода: Одна строка, состоящая из букв
о (орел) и
р (решка) — результаты бросков монеты.
Формат вывода: Одно целое число — максимальное число орлов, выпавших подряд
Написал такой код:

string = input()
counter = 0
k = 0
spisok = set()
for i in range(len(string) - 1):
    if i <= len(string):
        if string[i] == string[i + 1] == "о":
            counter += 1

        spisok.add(counter)
        if string[i] == "р":
            counter = 0

print(max(spisok) + 1)

Как можно решить эту задачу без методов списка и строк?

Списки здесь вообще лишнее.
<code>
s = input()
max_counter = 0
counter = 0
for c in s:
    if c == "о":
        counter += 1
        max_counter = max(counter, max_counter)
    else:
        counter = 0

print(max_counter)
</code>


Столбец Rap не существует! postgreSQL! Постоянно выбивает эту ошибку при попытке занести инфу
import sqlalchemy
import psycopg2
engine = sqlalchemy.create_engine('postgresql://ssvt:qqq@localhost:5432/hw')
connection = engine.connect()
add_new = connection.execute("""INSERT INTO genre(id,genre_name) VALUES(1,rap)""")

Вы пытаетесь вставить переменную с именем rap которая нигде не определена, а не какое-то значение.

connection.execute("""INSERT INTO genre(id,genre_name) VALUES(1,rap)""")

Необходимо rap взять в кавычки:

connection.execute("""INSERT INTO genre(id,genre_name) VALUES(1,'rap')""")


Поиск и суммирование всех значений на странице Python Selenium
На странице такой исходный код:

<li id="transaction-100" class="bankingTransaction " >
    <div class="extra">
                <span class="negativeAmount">-100</span>
    </div>
    <div class="alertText">
        <h3>Оплата </h3>

    </div>
</li>
<li id="transaction-101" class="bankingTransaction " >
    <div class="extra">
                <span class="negativeAmount">-200</span>
    </div>
    <div class="alertText">
        <h3>Оплата </h3>

    </div>
</li>
<li id="transaction-102" class="bankingTransaction " >
    <div class="extra">
                <span class="negativeAmount">-300</span>
    </div>
    <div class="alertText">
        <h3>Другое</h3>

    </div>
</li>

Как мне собрать только те значения (без знака минус), где в теге
<h3> есть текст "Оплата" и просуммировать их?
Т.е. из этого когда мне нужно получить 100+200= 300
Пытался хотя бы просто все классы найти и просуммировать значения.

 balance = driver.find_elements_by_class_name('negativeAmount')
 print(sum(balance))

Как итог:

TypeError: unsupported operand type(s) for +: 'int' and 'WebElement'

Когда вы получаете элемент страницы через функцию find_element_by_class_name, она в свою очередь возвращает тоже элемент страницы.
Чтобы суммировать значения, в данном случае нужно получить текст элемента, и перевести его из str в int тип.
Решение для одного элемента:

text = driver.find_element_by_class_name("class").text
amount = int(text)

Решение для нескольких элементов вариант 1:

elements = driver.find_elements_by_class_name("class")
amount_list = [int(element.text) for element in elements]

Решение для нескольких элементов вариант 2:

elements = driver.find_elements_by_class_name("class")
amount_list = []

for element in elements:
    element = int(element)
    amount_list.append(element)

Последние два решения идентичны, просто второе более явное чем первое.


Как осуществить движение точки по заданному вектору?
Пытаюсь реализовать функцию движения объекта в 2D пространстве. Есть вектор AB, точка B которого привязана к местоположению объекта. Мы знаем направление вектора и его координаты. Как переместить объект по направлению вектора?
Пример: Имея вектор (0, 0), (1, 0.5) нужно переместиться на 0.1 единицу вперед по направлению. Не помешала бы формула, по которой можно это вычислить.

Пример: Имея вектор (0, 0), (1, 0.5) нужно переместиться на 0.1
единицу вперед по направлению. Не помешала бы формула, по которой
можно это вычислить.

вообще-то:
x = coord + vector
т.е.

x1 = x0 + vx
y1 = y0 + vy

У вас же совершенно непонятно как из вектора (1, 0.5) можно получить перемещение на 0.1 по оси x
Если же вы имели в виду, что из точки надо переместиться в сторону вектора на 0.1, то тогда формула

x1 = x0 + 0.1 * vx / size(vector)
y1 = y0 + 0.1 * vy / size(vector)

где

size(vector) = sqrt(vx*vx + vy*vy)


Подскажите как обратиться к последнему, добавленному в базу данных, элементу? [дубликат]

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

Получение последней строки из базы данных sqlite

                                (2 ответа)

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

У меня есть таблица в базе там id, name, age, как можно обратиться последнему добавленному в эту таблицу id
Я использую sqlite

Если вы хотите получить последнюю добавленную запись, то следует написать такой запрос:
<code>
select id, name, age from table
where id = (select max(id) from table)
</code>


Где лучше всего размещать код создания таблицы базы данных?
Ребят подскажите пожалуйста, вот у меня есть программа, которая состоит из модуля main, класса persona и класса database. В database там будет происходить добавление, изменение и удаление в базе, а где лучше всего разместить создание этой базы, чтобы при первом запуске программы создала базу и больше этот код не выполнялся, как это можно реализовать или может я ни так это вообще понимаю
Я использую sqlite3
Где разместить вот этот код:
<code>
conn = sql.connect('data_per.db')
        cur = conn.cursor()
        cur.execute("""CREATE TABLE IF NOT EXISTS users(
            id INTEGER,
            name TEXT,
            gender TEXT,
            weight REAL,
            height INT,
            age INT,
            coefficient REAL
            );
        """)
        conn.commit()
</code>

Тогда уже сделайте метод в database, чтобы весь код по БД был в одном месте. А при запуске программы сделайте проверку на наличие БД, если ее нет, то вызывается метод создания.


Определить количество точек которое входит в окружность радиуса R и произвольным центром окружности (x0, y0) и вывести координаты этих точек
Не могу правильно решить задачу на количество точек, помещающихся в окружность радиуса R. Все что я додумал это вот такой код.
<code>
R = int(input())
x0 = int(input())
y0 = int(input())
arr = []
for x in range(x0 - R, (R + x0) + 1):
    for y in range(y0 - R, (R + y0) + 1):
        if (x * x) + (y * y) <= R * R:
            arr.append([x, y])

print(arr)
</code>
Но он работает корректно только в том случае, когда координаты центра это 0 и 0. Как можно подправить этот код, чтобы он корректно выводил выводил координаты всех точек, лежащих в окружности с произвольным центром (не 0 и 0)


Python трансляция видео потока [закрыт]

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

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

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

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

Можно ли устроить трансляцию веб камеры без выделенного ip ?

Можно. Но потребуется дополнительных усилий.

Например воспользоваться сторонним сервисом, который решает проблему отсутствия "белого" IP, но скорее всего такой сервис будет платным.
Либо можете арендовать VPS (он не дорогой, и у VPS будет статический 'белый' IP), там поднять VPN сервер и через VPN туннель соединить камеру с сервером.
Есть еще более экзотический вариант, посмотреть в сторону IPv6.


Вывод на экран конкатенации элементов разных списков [закрыт]

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

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

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

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

На вход даются несколько списков:

auto = ['KIA', 'Volkswagen', 'Mitsubishi', 'Renault']
auto_model1 = ['Cerato', 'Sorento', 'C`eed', 'Carnival']
auto_model3 = ['Passat', 'Tiguan', 'Golf', 'Touran']
auto_model2 = ['Galant', 'Pajero', 'Colt', 'Grandis']
auto_model4 = ['Megan', 'Kaptur', 'Clio', 'C4 Picasso']
car_body = ['sedan', 'crossover', 'hatchback', 'minivan']

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

KIA Cerato --> sedan
KIA Sorento --> crossover
KIA C`eed --> hatchback
KIA Carnival --> minivan

Важно! Задание для новичков, т.е. совсем новичков.

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

Уже всю голову сломал. Не понимаю, как можно использовать циклы, но так, чтобы не перебирать все элементы списка. Заранее благодарю за помощь!

вот это требовалось?

auto = ['KIA', 'Volkswagen', 'Mitsubishi', 'Renault']
auto_model1 = ['Cerato', 'Sorento', 'C`eed', 'Carnival']
auto_model3 = ['Passat', 'Tiguan', 'Golf', 'Touran']
auto_model2 = ['Galant', 'Pajero', 'Colt', 'Grandis']
auto_model4 = ['Megan', 'Kaptur', 'Clio', 'C4 Picasso']
car_body = ['sedan', 'crossover', 'hatchback', 'minivan']

text = "KIA C`eed"

models = [auto_model1, auto_model2, auto_model3, auto_model4]

components = text.split()

index_auto = auto.index(components[0])
index_model = models[index_auto].index(components[1])

body = car_body[index_model]

print(text, "-->", body)

ну и по хорошему надо проверку на
-1 при получении индексов поставить (ситуация, когда объект в списке не найден


Есть ли выход из лабиринта?
Нужно узнать есть ли выход из лабиринта, вход всегда [0,0], выход [-1,-1].
'.' - дорога, 'W' - стена.
Я написал код, который основан на правиле левой руки и обозначении тупиков.
Код работает, но скорость выполнения слишком большая. Необходимо ускориться примерно на 30%.
Возможно ли как то оптимизировать if/elif/else? К примеру используя словарь.
<code>
import numpy

def path_finder(maze):
    lab = numpy.array([list(x) for x in maze.split()])
    checked = []
    i = 0
    j = 0
    size = len(lab)
    while i != (size - 1) or j != (size - 1):
        if (i, j) not in checked:
            checked.append(tuple((i, j)))
        if j + 1 < size and lab[i][j + 1] == '.' and (i, j + 1) not in checked:
            j += 1
        elif i + 1 < size and lab[i + 1][j] == '.' and (i + 1, j) not in checked:
            i += 1
        elif j - 1 > -1 and lab[i][j - 1] == '.' and (i, j - 1) not in checked:
            j -= 1
        elif i - 1 > -1 and lab[i - 1][j] == '.' and (i - 1, j) not in checked:
            i -= 1
        else:
            checked.pop()
            lab[i][j] = 'W'
            if not checked:
                return False
            else:
                i, j = checked[-1]

    return True

print(path_finder("\n".join([
    "..W",
    ".WW",
    "..."])))
</code>

можно попробовать так изменить код:

убрать
numpy за ненадобностью

список кортежей заменить на список целых чисел (позиций в массиве)

в список не добавлять и не удалять из списка элементы, а сразу сделать список размером N*N и ходить по нему вправо влево

код:

def get_pos(i, j, width):
    return i + j * width

def path_finder(maze):
    lab = [[j for j in i] for i in maze.split('\n')]
    width = len(lab)

    checked = [0 for i in range(width * width)]
    pos = 0

    i, j = 0, 0
    width = len(lab)

    while i != (width - 1) or j != (width - 1):
        if get_pos(i, j, width) not in checked[:pos]:
            checked[pos] = get_pos(i, j, width)
            pos += 1

        if j + 1 < width and lab[i][j + 1] == '.' and get_pos(i, j + 1, width) not in checked[:pos]:
            j += 1
        elif i + 1 < width and lab[i + 1][j] == '.' and get_pos(i + 1, j, width) not in checked[:pos]:
            i += 1
        elif j - 1 > -1 and lab[i][j - 1] == '.' and get_pos(i, j - 1, width) not in checked[:pos]:
            j -= 1
        elif i - 1 > -1 and lab[i - 1][j] == '.' and get_pos(i - 1, j, width) not in checked[:pos]:
            i -= 1
        else:
            pos -= 1
            if pos == 0:
                return False

            lab[i][j] = 'W'
            coord = checked[pos - 1]
            i, j = coord % width, coord // width

    return True

вариант 2:

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

в проверке на направление убрана вообще проверка на наличие в списке за ненадобностью

вместо этого в клетку помещается символ
'*', так что проверки на
'.' уже становится достаточным и не нужно проверять что-то дополнительно

код:

def get_pos(i, j, width):
    return i + j * width

def path_finder(maze):
    lab = [[j for j in i] for i in maze.split('\n')]
    width = len(lab)

    checked = [0 for i in range(width * width)]
    pos = 0

    i, j = 0, 0
    width = len(lab)

    while i != (width - 1) or j != (width - 1):
        if get_pos(i, j, width) not in checked[:pos]:
            checked[pos] = get_pos(i, j, width)
            lab[i][j] = '*'
            pos += 1

        if j + 1 < width and lab[i][j + 1] == '.':
            j += 1
        elif i + 1 < width and lab[i + 1][j] == '.':
            i += 1
        elif j - 1 > -1 and lab[i][j - 1] == '.':
            j -= 1
        elif i - 1 > -1 and lab[i - 1][j] == '.':
            i -= 1
        else:
            pos -= 1
            if pos == 0:
                return False

            lab[i][j] = 'W'
            coord = checked[pos - 1]
            i, j = coord % width, coord // width

    return True

вариант 3:
по идее еще быстрее было бы решение, если и список
lab сделать из двумерного списка одномерным и перемещаться уже в нем используя координаты как это сделано при работе со списком
checked


Зачем нужен тип окна Dekstop PyQt5?
Зачем нужен тип окна Dekstop, если подобное окно не отображается на экране? Как таким образом можно взаимодействовать с рабочим столом?

Тип окна Qt::Desktop
0x00000010 | Window   указывает что это виджет типа QDesktopWidget.
QDesktopWidget не совсем виджет, скорее интерфейс к рутовому окну. Нужен был (сейчас не рекомендуется) для того чтоб узнать геометрию экранов и мониторов.


Asyncio и aiohttp отправка запросов
Я не совсем понимаю, как работает aiohttp вместе с create_task с asyncio, порой всё работает так как нужно, а порой наоборот.
Я написал небольшой код, который казалось бы, что должен вывести результаты после отправки запросов, но это не происходит, ошибок никаких нет, код просто прекращает работу:
<code>
    from asyncio import create_task, run
from aiohttp import ClientSession

PARSING_LINKS = [
    '' # я убрал отсюда ссылки, перед тем как вставить код сюда, но они тут были
]

async def GET_PRODUCTS_INFO(url):
    async with ClientSession() as session:
        async with session.get(url) as request_response:
            print(request_response.status)

async def main():
    for TTT__ in PARSING_LINKS:
        create_task(GET_PRODUCTS_INFO(url=TTT__))

if __name__ == '__main__':
    run(main())
</code>
Я пытаюсь запустить одну и туже функцию с другой ссылкой в переменной TTT___, которая получает значение с списка со ссылками, спустя секунду мой код просто закрывается вывода никакого нет. Я не знаю, как можно правильно параллельно запустить другие функции в этом коде.

Нужно подождать, когда корутина запущенная с помощью
create_task закончится:

async def main():
    tasks = []
    for TTT__ in PARSING_LINKS:
        tasks.append(create_task(GET_PRODUCTS_INFO(url=TTT__)))
    for task in tasks:
        await task


Вычислить количество товаров в каждой подпапке
Имеется CSV со строками URL вида:

/cat1-name/sub-cat-1/item-1.html
/cat1-name/sub-cat-1/item-2.html
/cat1-name/sub-cat-1/item-3.html
/cat1-name/sub-cat-1/item-4.html
/cat1-name/sub-cat-1/item-5.html
/cat1-name/sub-cat-1/item-6.html
/cat1-name/sub-cat-1/item-7.html
/cat1-name/sub-cat-1/item-8.html
/cat1-name/sub-cat-1/item-9.html
/cat1-name/sub-cat-1/item-10.html
/cat1-name/sub-cat-1/item-11.html
/cat1-name/sub-cat-1/item-12.html
/cat1-name/sub-cat-1/item-13.html
/cat1-name/sub-cat-1/item-14.html
/cat1-name/sub-cat-1/item-15.html
/cat1-name/sub-cat-1/item-16.html
/cat1-name/sub-cat-1/item-17.html
/cat1-name/sub-cat-1/item-18.html
/cat1-name/sub-cat-1/item-19.html
/cat1-name/sub-cat-1/item-20.html
/cat1-name/sub-cat-1/item-21.html
/cat1-name/sub-cat-1/item-22.html
/cat1-name/sub-cat-1/item-23.html
/cat1-name/sub-cat-1/item-24.html
/cat1-name/sub-cat-1/item-25.html
/cat1-name/sub-cat-2/item-1.html
/cat1-name/sub-cat-2/item-2.html
/cat1-name/sub-cat-2/item-3.html
/cat1-name/sub-cat-2/item-4.html
/cat1-name/sub-cat-2/item-5.html
/cat1-name/sub-cat-2/item-6.html
/cat1-name/sub-cat-2/item-7.html
/cat1-name/sub-cat-2/item-8.html
/cat1-name/sub-cat-2/item-9.html
/cat1-name/sub-cat-2/item-10.html
/cat1-name/sub-cat-2/item-11.html
/cat1-name/sub-cat-2/item-12.html
/cat1-name/sub-cat-3/item-1.html
/cat1-name/sub-cat-3/item-2.html
/cat1-name/sub-cat-3/item-3.html
/cat1-name/sub-cat-3/item-4.html
/cat1-name/sub-cat-3/item-5.html
/cat1-name/sub-cat-3/item-6.html
/cat1-name/sub-cat-3/item-7.html
/cat1-name/sub-cat-3/item-8.html
/cat1-name/sub-cat-3/item-9.html
/cat1-name/sub-cat-3/item-10.html
/cat1-name/sub-cat-3/item-11.html
/cat1-name/sub-cat-3/item-12.html
/cat1-name/sub-cat-3/item-13.html
/cat1-name/sub-cat-3/item-14.html
/cat1-name/sub-cat-3/item-15.html
/cat1-name/sub-cat-3/item-16.html
/cat1-name/sub-cat-3/item-17.html
/cat1-name/sub-cat-3/item-18.html
/cat1-name/sub-cat-3/item-19.html
/cat1-name/sub-cat-3/item-20.html
/cat1-name/sub-cat-3/item-21.html
/cat1-name/sub-cat-3/item-22.html
/cat1-name/sub-cat-4/item-1.html
/cat1-name/sub-cat-4/item-2.html
/cat1-name/sub-cat-4/item-3.html
/cat1-name/sub-cat-4/item-4.html
/cat1-name/sub-cat-4/item-5.html
/cat1-name/sub-cat-4/item-6.html
/cat1-name/sub-cat-4/item-7.html
/cat1-name/sub-cat-4/item-8.html
/cat1-name/sub-cat-4/item-9.html
/cat1-name/sub-cat-4/item-10.html
/cat1-name/sub-cat-4/item-11.html
/cat1-name/sub-cat-4/item-12.html
/cat1-name/sub-cat-4/item-13.html
/cat1-name/sub-cat-4/item-14.html
/cat1-name/sub-cat-4/item-15.html
/cat1-name/sub-cat-4/item-16.html
/cat1-name/image-1.html
/cat1-name/image-2.html
/cat2-name/item-1.html
/cat2-name/item-2.html
/cat2-name/item-3.html
/cat2-name/item-4.html
/cat2-name/item-5.html
/cat2-name/item-6.html
/cat2-name/item-7.html
/cat2-name/item-8.html
/cat2-name/item-9.html
/cat2-name/item-10.html
/cat2-name/item-11.html
/cat2-name/item-12.html
/cat2-name/item-13.html
/cat2-name/item-14.html
/cat2-name/item-15.html
/cat2-name/item-16.html
/cat2-name/image-1.html
/cat2-name/image-2.html

и т.д.
Строки отсортированы по имени категории, подкатегории и объекту
Мне нужно подсчитать:
общее количество item в категории;
количество item в каждой подкатегории;
количество image в каждой категории.
Задача тривиальная, но справиться пока не выходит.
Попытался начать с простого: для каждой категории создал объект класса, записал полный список URL, относящихся к категории, подсчитал общее количество item для каждой категории.
Далее попытался для каждой подкатегории подсчитать:

for cat in categoryList:
    persubcat = 0
    newSerList.clear()
    exstr = ""
    images = 0
    for i in range(cat.totalItems):
        if(exstr == ""):
            exstr = cat.url[i]
            persubcat += 1
        else:
            if(cat.url[i].split("/")[2] == exstr.split("/")[2]):
                persubcat += 1
            elif(cat.url[i].split("/")[2].split("/")[0] == "image"):
                images += 1
            elif(cat.url[i].split("/")[2].split("/")[0] == "item"):
                persubcat += 1
            elif(cat.url[i].split("/")[2] != exstr.split("/")[2]):
                persubcat += 1
                subcatLsit.append(persubcat)

    cat.subcats = subcatList
    subcatList.clear()
    persubcat = 0

Выглядит ужасно, работает тоже (не работает). Прошу неравнодушных помочь. Спасибо

Наверное, тут удобнее использовать
Pandas:

import pandas as pd

s = '''/cat1-name/sub-cat-1/item-1.html
/cat1-name/sub-cat-1/item-2.html
/cat1-name/sub-cat-1/item-3.html
/cat1-name/sub-cat-1/item-4.html
/cat1-name/sub-cat-1/item-5.html
/cat1-name/sub-cat-1/item-6.html
/cat1-name/sub-cat-1/item-7.html
/cat1-name/sub-cat-1/item-8.html
/cat1-name/sub-cat-1/item-9.html
/cat1-name/sub-cat-1/item-10.html
/cat1-name/sub-cat-1/item-11.html
/cat1-name/sub-cat-1/item-12.html
/cat1-name/sub-cat-1/item-13.html
/cat1-name/sub-cat-1/item-14.html
/cat1-name/sub-cat-1/item-15.html
/cat1-name/sub-cat-1/item-16.html
/cat1-name/sub-cat-1/item-17.html
/cat1-name/sub-cat-1/item-18.html
/cat1-name/sub-cat-1/item-19.html
/cat1-name/sub-cat-1/item-20.html
/cat1-name/sub-cat-1/item-21.html
/cat1-name/sub-cat-1/item-22.html
/cat1-name/sub-cat-1/item-23.html
/cat1-name/sub-cat-1/item-24.html
/cat1-name/sub-cat-1/item-25.html
/cat1-name/sub-cat-2/item-1.html
/cat1-name/sub-cat-2/item-2.html
/cat1-name/sub-cat-2/item-3.html
/cat1-name/sub-cat-2/item-4.html
/cat1-name/sub-cat-2/item-5.html
/cat1-name/sub-cat-2/item-6.html
/cat1-name/sub-cat-2/item-7.html
/cat1-name/sub-cat-2/item-8.html
/cat1-name/sub-cat-2/item-9.html
/cat1-name/sub-cat-2/item-10.html
/cat1-name/sub-cat-2/item-11.html
/cat1-name/sub-cat-2/item-12.html
/cat1-name/sub-cat-3/item-1.html
/cat1-name/sub-cat-3/item-2.html
/cat1-name/sub-cat-3/item-3.html
/cat1-name/sub-cat-3/item-4.html
/cat1-name/sub-cat-3/item-5.html
/cat1-name/sub-cat-3/item-6.html
/cat1-name/sub-cat-3/item-7.html
/cat1-name/sub-cat-3/item-8.html
/cat1-name/sub-cat-3/item-9.html
/cat1-name/sub-cat-3/item-10.html
/cat1-name/sub-cat-3/item-11.html
/cat1-name/sub-cat-3/item-12.html
/cat1-name/sub-cat-3/item-13.html
/cat1-name/sub-cat-3/item-14.html
/cat1-name/sub-cat-3/item-15.html
/cat1-name/sub-cat-3/item-16.html
/cat1-name/sub-cat-3/item-17.html
/cat1-name/sub-cat-3/item-18.html
/cat1-name/sub-cat-3/item-19.html
/cat1-name/sub-cat-3/item-20.html
/cat1-name/sub-cat-3/item-21.html
/cat1-name/sub-cat-3/item-22.html
/cat1-name/sub-cat-4/item-1.html
/cat1-name/sub-cat-4/item-2.html
/cat1-name/sub-cat-4/item-3.html
/cat1-name/sub-cat-4/item-4.html
/cat1-name/sub-cat-4/item-5.html
/cat1-name/sub-cat-4/item-6.html
/cat1-name/sub-cat-4/item-7.html
/cat1-name/sub-cat-4/item-8.html
/cat1-name/sub-cat-4/item-9.html
/cat1-name/sub-cat-4/item-10.html
/cat1-name/sub-cat-4/item-11.html
/cat1-name/sub-cat-4/item-12.html
/cat1-name/sub-cat-4/item-13.html
/cat1-name/sub-cat-4/item-14.html
/cat1-name/sub-cat-4/item-15.html
/cat1-name/sub-cat-4/item-16.html
/cat1-name/image-1.html
/cat1-name/image-2.html
/cat2-name/item-1.html
/cat2-name/item-2.html
/cat2-name/item-3.html
/cat2-name/item-4.html
/cat2-name/item-5.html
/cat2-name/item-6.html
/cat2-name/item-7.html
/cat2-name/item-8.html
/cat2-name/item-9.html
/cat2-name/item-10.html
/cat2-name/item-11.html
/cat2-name/item-12.html
/cat2-name/item-13.html
/cat2-name/item-14.html
/cat2-name/item-15.html
/cat2-name/item-16.html
/cat2-name/image-1.html
/cat2-name/image-2.html'''.split('\n')

items = []
for it in s:
    _, cat, *rest = it.split('/')
    subcat = ''.join(rest[-2:-1])
    item = rest[-1]
    items.append((cat, subcat, item))

df = pd.DataFrame(items, columns=['category','subcategory','item'])
df.head()

Получается такой датафрейм:

    category    subcategory item
0   cat1-name   sub-cat-1   item-1.html
1   cat1-name   sub-cat-1   item-2.html
2   cat1-name   sub-cat-1   item-3.html
3   cat1-name   sub-cat-1   item-4.html
4   cat1-name   sub-cat-1   item-5.html
...

Дальше всё просто:

print('общее количество item в категории:\n',
      df[df['item'].str.contains('item')].groupby('category').size())
print('------')
print('количество item в каждой подкатегории:\n',
      df[df['item'].str.contains('item')].groupby(['category','subcategory']).size())
print('------')
print('количество image в каждой категории:\n',
      df[df['item'].str.contains('image')].groupby('category').size())

Вывод:

общее количество item в категории:
 category
cat1-name    75
cat2-name    16
dtype: int64
------
количество item в каждой подкатегории:
 category   subcategory
cat1-name  sub-cat-1      25
           sub-cat-2      12
           sub-cat-3      22
           sub-cat-4      16
cat2-name                 16
dtype: int64
------
количество image в каждой категории:
 category
cat1-name    2
cat2-name    2
dtype: int64

Вывод если нужно можно сделать по-другому, главное, что всё работает и всё довольно просто выбирать и аггрегировать.


Вывод цифры в ENTRY после нажатия
<code>

from tkinter import *

window = Tk()
window.title("Python window")
window.geometry("300x200")

btn1 = Button(text="1", height="3", width="3").grid(row=1, column=1, padx=80, pady=100)
entry = Entry(width=50)
entry.grid(row=0, column=0, columnspan=5)

window.mainloop()
</code>
Как можно сделать так, чтобы при нажатии на кнопку "1" в ENTRY выскакивала эта цифра?

Вот полный код:
<code>
from tkinter import *
window = Tk()
window.title("Python window")
window.geometry("300x200")
entry = Entry(width=50)
entry.pack()
def ad2():
    entry.delete(0, END)
def ad():
    entry.delete(0, END)
    entry.insert(END, '1')
btn1 = Button(text="1", height="3", width="3", command=ad).pack()
btn2 = Button(text="удалить", command=ad2).pack()
entry.pack()
window.mainloop()
</code>


Выбор столбцов с разным типом данных с пробелами и пропусками Pandas Python
Есть следующий массив данных:

Col1    Col2    Col3    Col4    Col5    Col6
6   3   rjhj    8       10
10  2   dsad    8   8   8
4   7   fasd    6       6
    9   fasd    9   5   9
    8   sfd 3       7
            6   2   9
8           9   3   4
6           5   2   2
10  3   fasd    2   10  6
10  10      8   2   6

В некоторых местах будут
NaN , а в некоторых записан пробел. Необходимо оставить только те столбцы, в которых не более 20% пропусков/пробелов/NaN. То есть на выходе нужно получить:

Col4    Col6
8   10
8   8
6   6
9   9
3   7
6   9
9   4
5   2
2   6
8   6

Залил файл для проверки

Замените пробелы на
NaN и воспользуйтесь решением из ответа на ваш предыдущий вопрос:

res = df.replace(["", " "], np.nan).dropna(thresh=int(len(df) * 0.8), axis=1)


Отобрать уникальные по коду и суммировать их значения
Исходный DF:

Код                       Название     Сумма
03.2.01.01-0001         Цемент           300
14.5.06.03-0002         Паста            125
03.2.01.01-0001         Цемент           120
14.5.06.03-0002         Паста            62

Надо получить:

Код                       Название     Сумма
03.2.01.01-0001         Цемент           420
14.5.06.03-0002         Паста            187

Сгруппируйте по столбцам
["Код", "Название"] и просуммируйте столбец
"Сумма":

In [106]: df.groupby(["Код", "Название"])["Сумма"].sum().reset_index()
Out[106]:
               Код Название  Сумма
0  03.2.01.01-0001   Цемент    420
1  14.5.06.03-0002    Паста    187


Резко перестала работать программа. В чём дело? [закрыт]

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

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

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

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

Некоторое время назад программа работала - выводила уравнения и слова. Сейчас же она не запускается
<code>
def main():
    argument1 = [[1, 1, 1],
                 [1, 0, 0]]
    argument2 = [[0, 0, 0],
                 [1, 1, 1]]
    template = [argument1, argument2]

    n = 1
    for data in template:
        print_data(data)

def print_data(data):
    for i in range(len(data)):
        for j in range(len(data[i])):
            print_images_foreach_delta(data, i, j)

def print_images_foreach_delta(data, i, j):
    size = len(data[0])
    for delta in range(1, size - (i + j)):
        for image_index in range(len(data)):
            print_image(data, image_index, i, j, delta)

def print_image(data, image_index, i, j, delta):
    print('Изображение номер - ', image_index + 1, sep="")
    for func in range(len(data)):
        print(f'{int(func == image_index)} = R{func + 1} = {data[image_index][i]} * A1({func + 1}) + {data[image_index][i + j + delta]} * A2({func + 1})')

if name == "main":
    main()
</code>


Numpy array множественное присвоение
имеется код

import numpy as np
a = np.array([1, 2, 3])
b = np.array([[1, 1], [0, 0]])
c = np.array([[1], [2], [3]])
np.savez( file, a=a, b=b, c=c )
res = np.load( "file.npz" )
print( res.files ) # ['a','b','c']
a=res['a'] #[1 2 3]
b=res['b'] #[[1 1],[0 0]]
c=res['c'] #[[1],[2],[3]]

Хочется на подобие

a,b,c=list(1,2,3)

Кто нибут может мне посоветовать как правильно произвести множественое присвоение по именам в массиве, или в цикле с вытягиванием имен из самого массива.
Буду признателен за любую подзказку.