Не работает else в if [дубликат]

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

Неправильно работает сравнение переменной с несколькими значениями через or

                                (3 ответа)

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

В этом коде

def follow(thefile):
    thefile.seek(0, 2)
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.1)
            continue
        yield line

if __name__ == "__main__":
    logfile = open(os.getenv("APPDATA") + "/.minecraft/logs/latest.log", "r")
    loglines = follow(logfile)
    for line in loglines:
        if "§r§6Type §r/tpy §r§7" in line:
            logline = line[line.find('[CHAT] ')+35:]
            notfullnick = logline.split('§')[5]

            nickname = notfullnick.split('7')[1]

            if nickname == "Serverexe" or "Korffi_":
                pag.hotkey('alt', 'tab')
                pag.press('/')
                pag.typewrite(f'tpy {nickname}')
                pag.press('enter')

                print(f"Игроку {nickname} разрешён доступ!")
            else:
                pag.hotkey('alt', 'tab')
                pag.press('/')
                pag.typewrite(f'tpn {nickname}')
                pag.press('enter')

                print(f"Игроку {nickname} НЕТ разрешён доступ!")

                pag.press('/')
                pag.typewrite(f'w {nickname} you are not allowed to access the request!')
                pag.press('enter')

не работает

else:
  pag.hotkey('alt', 'tab')
  pag.press('/')
  pag.typewrite(f'tpn {nickname}')
  pag.press('enter')

  print(f"Игроку {nickname} НЕТ разрешён доступ!")

  pag.press('/')
  pag.typewrite(f'w {nickname} you are not allowed to access the request!')
  pag.press('enter')

поясняю, идет проверка на nuickname, если никнейм "Serverexe" или "Korffi_" то выполняется

pag.hotkey('alt', 'tab')
pag.press('/')
pag.typewrite(f'tpy {nickname}')
pag.press('enter')
print(f"Игроку {nickname} разрешён доступ!")

а если из обоих ников не один ник не схож, то выполняется

pag.hotkey('alt', 'tab')
pag.press('/')
pag.typewrite(f'tpn {nickname}')
pag.press('enter')
print(f"Игроку {nickname} НЕТ разрешён доступ!")
pag.press('/')
pag.typewrite(f'w {nickname} you are not allowed to access the request!')
pag.press('enter')

но это не выполняется, else не работает, пробовал elseif nickname != "Serverexe" or "Korffi_" всё равно не работает

Вобще-то, сильно предполагаю, что это не else не работает, а это вы не понимаете, как с ним работать. А вину сваливаете на бедный оператор. И что на самом деле, ваше условие должно выглядеть вот так:
<code>
if nickname == "Serverexe" or nickname =="Korffi_":
</code>


Извлечение подстрок
Необходимо извлечь определённые части строки. Пример:

"Суббота" => "Суббота"
"Суббота02окт" => "Суббота", "02", "окт"
"Суббота02окт." => "Суббота", "02", "окт"

Если в конце строки есть точка, то она должна быть проигнорирована. Пробовал реализовать это так:

pattern = re.compile(r'([А-Я][А-Яа-я]+)([0-9]+)([А-Я][А-Яа-я]+)')
date_result = re.findall(pattern, date)

Но получаю пустой массив, что я делаю не так?

Проблема в том, что вы ищете целый паттерн
слово-цифры-слово, а нужно
слово ИЛИ цифры. Для этого используйте знак
|:

import re
dates = ["Суббота", "Суббота02окт", "Суббота02окт."]
pattern = re.compile(r'[0-9]+|[А-ЯЁа-яё]+')
for date in dates:
    print(re.findall(pattern, date))
# ['Суббота']
# ['Суббота', '02', 'окт']
# ['Суббота', '02', 'окт']


Turn String Input into Hash Python
Решая задания на Codewars наткнулся на такую задачу:
Please write a function that will take a string as input and return a hash. The string will be formatted as such. The key will always be a symbol and the value will always be an integer.

"a=1, b=2, c=3, d=4"
This string should return a hash that looks like

{ 'a': 1, 'b': 2, 'c': 3, 'd': 4}
Мое решение этой задачи:

def str_to_hash(s):
    s.split(', ')
    s = dict([tuple(i.split('=')) for i in s])
    s = {k:int(v) for k,v in s.items()}
    return s

Выводит ошибку:

ValueError: dictionary update sequence element #0 has length 1; 2 is required

Подскажите, что я делаю не так?

Результат сплита никуда не записывается.
И не экономьте переменные...
<code>
def str_to_hash(s):
    q = s.split(', ')
    t = dict([tuple(i.split('=')) for i in q])
    u = {k:int(v) for k,v in t.items()}
    return u
</code>


Связь элементов в двух массива (reference)
Есть массив
results = [1, 3, 5, 1, 8, 5, 0, 6], берём, например, массив первых двух значений
results2 = [results[0], results[1]]. Как сделать так, чтобы изменяя массив
results2, изменялось значение в массиве
results
Т.е. результат должен быть таким:

var results = [1, 3, 5, 1, 8, 5, 0, 6]
var results2 = [results[0], results[1]]
results2[1] - 1

Вывод (см. на 2-й элемент массива):

results = [1, 2, 5, 1, 8, 5, 0, 6]

Если вы храните в массивах объекты типа
struct (как в случае с
Int), то нужно для них сделать обертку в виде класса для обращения по ссылкам, а не копирования
Пример

class IntWrapper : CustomStringConvertible {

    private var value = 0

    var description: String {
        String(value)
    }

    init(_ value: Int) {
        self.value = value
    }

    func setValue(_ value: Int) {
        self.value = value
    }

}

var results = [IntWrapper(1), IntWrapper(3)]
var results2 = [results[0], results[1]]
results2[1].setValue(999)

print(results, results2)

Вывод:

[1, 999] [1, 999]


Как сделать чтобы бот удалял определенное сообщение, а не удалял из большого текста?
Например: (правильно)

Я пишу:  Привет
Бот пишет:  Хай

      (неправильно)

Я пишу:  Я дома Привет
Бот пишет:  Хай

Помогите пожалуйста, а то в интернете вообще найти не могу.
Мой код:

import discord

client = discord.Client()

@client.event
async def on_ready():
    print('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
    message.content = message.content.lower()
    if message.author == client.user:
        return

    if message.content.startswith('Привет'):
        await message.channel.send(f'>>> **_{message.author}_  хотел сказать:**  Хай')
        await message.delete()

client.run('TOKEN_BOT') ```

Допустим, у вас есть строка
text = 'один два три'

Если вам нужно проверить, начинается ли строка с какого-то определенного слова или другой строки, вы можете проверить это через свойство строки
startswith()

# если text начинается со слова 'один'
if text.startswith('один'):
   # это True, условие выполнится

# если text начинается со слова 'два'
if text.startswith('два'):
    # это False; строка 'два' содержится в text, но text не начинается с нее

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

if text == 'три четыре пять шесть':
    # это False, так как text = 'один два три'
if text == 'один два три':
    # это True, условие выполнится

Если вам нужно проверить наличие какого-то одного слова в строке (неважно где оно находится), можно использовать оператор
in

if 'два' in text:
    # это True, так как 'два' содержится в text
if 'четыре' in text:
    # это False, 'четыре' не содержится в text

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


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

from itertools import groupby

nums = map(int, input().split())

def isPrime(n):
    if n < 0:
        n = -n
    elif n == 0 or n == 1:
        return False
    for a in range(2, (n//2)+1):
        if n % a == 0:
            return False
    return True

primes = [list(g) for k,g in groupby(map(int,nums),key=isPrime) if k]

res = max(filter(lambda x: x==sorted(x),primes),key=sum,default=[])

print(len(res), sum(res))

Вот пример ввода и вывода:
Ввод:

20 -7 -7 -2 0 1 3 5 5 10
Вывод:

3 13
Тут посчиталось что сумма ряда
3 5 5  больше чем
-7 -7 -2, из за этого взяли
3 5 5
Ещё один пример
Ввод:

5 -2 -2 10 8
Вывод:

2   -4
вроде бы на вот эти вводы код работает, но когда ввожу

7 2 7 4 4 10 12 7 -2 -4 7
мне почему разбивает на эти массивы:

[7, 2, 7], [7, -2], [7] a должен был на эти
[7], [2, 7], [7], [-2], [7]
Смысл в том, что он ищет среди этих массивов самый длинный а потом считает их сумму, в этом случае, это массив
[2, 7]
Не могу понять, почему иногда код работает, а иногда нет.
Может выдать мне, когда ввожу, например:

2 2 2 2 2 7 5
он разбивает на массив:

[2, 2, 2, 2, 2, 7, 5]
а не на массивы

 [2, 2, 2, 2, 2, 7], [5]

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

k - ключ/номер группы. Ключ увеличивается если очередное число не простое или простое но меньше предыдущего. Наружу выдаются пары
(ключ, число) только для простых чисел (это не оптимизация!).

def group_primes(seq):
    k = 0
    prev_n = 0
    for n in seq:
        prime = is_prime(abs(n))
        if not prime or prev_n > n:
            k += 1
        if prime:
            yield k, n
        prev_n = n

[2, 2, 2, 2, 2, 7, 5] ->
[(0, 2), (0, 2), (0, 2), (0, 2), (0, 2), (0, 7), (1, 5)]

[7, 2, 7, 4, 4, 10, 12, 7, -2, -4, 7] ->
[(0, 7), (1, 2), (1, 7), (6, 7), (7, -2), (8, 7)]

Из аннотированной последовательности
groupby с соответствующим ключом правильно соберёт группы, которые нужно будет очистить удалив ключи и оставив числа.

import itertools
import math

def is_prime(n):
    assert n >= 0
    if n < 2:
        return False
    return all(n % d != 0 for d in range(2, math.floor(math.sqrt(n)) + 1))

def group_primes(seq):
    k = 0
    prev_n = 0
    for n in seq:
        prime = is_prime(abs(n))
        if not prime or prev_n > n:
            k += 1
        if prime:
            yield k, n
        prev_n = n

def main():
    # все числа
    a = map(int, input().split())

    # простые числа, аннотированные ключами
    b = group_primes(a)

    # простые числа, собранные в группы
    c = (
        # из группы оставляем только числа без ключей
        tuple(n for _, n in g)
        # группировка только по ключу, значение игнорируется
        for k, g in itertools.groupby(b, key=lambda v: v[0])
    )

    # переделываем группы в пары (длинна, сумма)
    d = ((len(g), sum(g)) for g in c)

    # выбираем самую длинную группу
    # если таких несколько, то с самой большой суммой
    e = max(d, default=(0, 0))

    print(*e)

main()

Группа
3 5 5 обходит
-7 -7 -2:

$ echo "20 -7 -7 -2 0 1 3 5 5 10" | python ascending-primes.py
3 13

Здесь наибольшая по сумме группа
2 7:

$ echo "7 2 7 4 4 10 12 7 -2 -4 7" | python ascending-primes.py
2 9

Переход через ноль в группе
-3 -2 2 3:

$ echo "-3 -2 2 3" | python ascending-primes.py
4 0

Ни одного простого:

$ echo "0 1 4 6 8 9 10 12" | python ascending-primes.py
0 0

Длина группы важнее суммы (и снова переход через ноль):

$ echo "7 2 5 5 5 15 10 -7 -7 -5 -2 -2 5" | python ascending-primes.py
6 -18


Это padding (выравнивание) до границы блока в 16 байт. Надо просто отрезать столько с конца, сколько указано в последнем байте. И согласно PKCS эти все байты будут идентичны. У AES всегда в конце есть выравнивание, даже когда исходные данные кратны 16 (в этом случае в конце будут 16 байт из чисел 16).
Код для отрезания:

decrypted = decrypted[:-decrypted[-1]]

И вообще, все эти игры с кодировками (всякие encode/chr) здесь абсолютно не нужны (и могут быть даже вредны).

from Crypto.Cipher import AES

def aes_decrypt(secretKey, encoded):
     initVector = encoded[0:16]
     data = encoded[16:]
     decryptor = AES.new(secretKey, AES.MODE_CBC, initVector)
     decoded = decryptor.decrypt(data)
     return decoded[:-decoded[-1]] # отрезаем padding с конца

key_longs = [170, 71, 107, 76, 96, 150, 29, 197, 242, 164, 75, 84, 212, 215, 74, 190]
content = [165, 171, 188, 243, 150, 242, 158, 103, 131, 84, 239, 147, 235, 81, 135, 61, 70, 0, 173, 155, 78, 246, 203, 0, 14, 68, 137, 156, 179, 226, 166, 27, 99, 119, 143, 53, 230, 39, 206, 104, 108, 113, 103, 230, 213, 163, 243, 243, 78, 91, 4, 204, 98, 175, 46, 215, 198, 129, 98, 94, 30, 124, 102, 114, 133, 168, 215, 112, 86, 255, 233, 22, 120, 81, 106, 90, 218, 192, 134, 153, 169, 223, 178, 193, 208, 41, 188, 108, 190, 146, 84, 53, 63, 94, 40, 18]

decrypted = aes_decrypt(bytes(key_longs), bytes(content))

print(list(decrypted))


Как вызвать функцию класса из другого файла на python [закрыт]

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

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

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

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

У меня есть файл parser.py

import requests
from bs4 import BeautifulSoup
import time
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

class Currency:
    url = 'юрл для сокращения'
    headers = {
        'юзер агент'}
    diferent = 1
    compare_currency = 0

 # init
    def __init__(self):
        self.compare_currency = float(self.get_currency())

# get currency bitcoin
    def get_currency(self):
        full_page = requests.get(self.url, headers=self.headers)
        soup = BeautifulSoup(full_page.content, 'html.parser')
        convert = soup.findAll(
            "span", {"class": "DFlfde SwHCTb"})
        return (convert[0].text).replace(",", "")

# compare and conclusion
    def check_currency(self):
        price = float(self.get_currency())
        if price >= self.compare_currency + self.diferent:
            print("Цена биткоина выросла, можно отдыхать.")
            self.send_mail()
        elif price <= self.compare_currency - self.diferent:

            print("Цена упала надо что-то делать!")
            self.send_mail()
        print("Сейчас курс биткоина= " + str(price))
        time.sleep(3)
        self.check_currency()

и пустой файл bot.py. Так вот я не понимаю как вызвать функцию check_currency через файл bot.py. Попытался сделать так

import parser
s = Currency()
s.check_currency()

но выдаёт ошибку NameError: name 'Currency' is not defined


Помог первый комментарий к вопросу.
Полное решение:
<code>
df = df[sorted(df.columns, key=lambda x: int(x.strip('!*')))]
</code>


модуль re, особенности работы
Всем привет. Есть задача: найти первое слово в строке. В строке могут встречатся точки и запятые
Строка может начинаться с буквы или, к примеру, с пробела или точки. В слове может быть апостроф и он является частью слова. Весь текст может быть представлен только одним словом и все. Первое слово можеть быть представлено 1 буквой.
Используя библиотеку re успешно решил задачу(первый опыт работы с ней)

text = "_first'word second word"
result = re.search(r"[a-zA-Z]*'*[a-zA-Z]",text)
result.group()

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

*

на

+

То слова которые представлены 1 буквой, не будут найдены.
Спасибо.

* означает, что предыдущая "сущность" (в данном случае последовательность
[a-zA-Z]) может повторяться 0 и более раз. А
+ означает, что 1 и более раз.
Соответственно, если вы напишите
+, то выражение будет интерпретироваться как:

[a-zA-Z]+ - любая буква (один и более раз)

'* - апостроф (ноль и более раз)

[a-zA-Z] - любая буква (одна штука)

Итого, минимальная последовательность, которая будет соответствовать этому выражению:
1 + 0 + 1 = 2 символа.
Вообще, ваше выражение будет соответствовать словам, к примеру, начинающимся с апострофа, не будет находить слова с апострофом на конце. Если разбирать английские слова, то апостроф на конце вполне может быть (типа Jones’ car).
Как по мне логичнее разбирать как читаешь, т.е. сначала обязательное слово из букв, а потом не обязательные апостроф и буквы:
[a-zA-Z]+'?[a-zA-Z]*. Хотя, буквально в считанных случаях слова и с апострофа могут начинаться ('cause -> because), тогда и спереди надо добавить
'? чтобы сматчилось.


A = list не одно и тоже, что и A = []?
код ниже складывает строки из эксель файла во вложенный список.
Если во второй строке объявлять массив как
prepared_data = list
Получаю ошибку
TypeError: append() takes exactly one argument (0 given)
Если объявлять как в коде, то все работает
В чем разница между a = list и a = []? Python 3.7

def collection_data(self, excel_data):
        prepared_data = []
        for index, row in excel_data.iterrows():
            frame_to_send = []
            for i in range(3):
                frame_to_send.append(row[i])
            prepared_data.append(frame_to_send)
        print(prepared_data)

list - это встроенная функция и класс языка питон, а не инициализатор для списка. Создать объект класса - это вызвать конструктор, а не присвоить имя класса переменной:
prepared_data=list()
Вы целые числа инициализируете с помощью выражения?
i = int


Как преобразовать object в формат времени для столбца?
Необходимо преобразовать строку в формате 'object' 10:22:55 в формат 'time'.
Попробовал в таком формате:
<code>
data['start_time'] = datetime.time.strptime(data['start_time']).isoformat()
</code>

В Pandas и в NumPy не существует типа данных
time - есть только
datetime64, который обязан содержать компоненту даты, и
timedelta64.
Вот пример преобразования в
timedelta64:

In [34]: df = pd.DataFrame({"x": ["10:22:55"]})

In [35]: df
Out[35]:
          x
0  10:22:55

In [36]: df.dtypes
Out[36]:
x    object
dtype: object

In [37]: df["timedelta"] = pd.to_timedelta(df["x"])

In [38]: df
Out[38]:
          x       timedelta
0  10:22:55 0 days 10:22:55

In [39]: df.dtypes
Out[39]:
x                     object
timedelta    timedelta64[ns]
dtype: object


Здравствуйте, не понимаю почему не работает код в питоне, посмотрите, пожалуйтса
Нужно посчитать сколько существует двузначных чисел, у которых сумма цифр равна сумме цифр при умножение на n (1<=n<=10) Например :
(При умножении двузначных чисел на 2 не меняют сумму цифр такие числа: 18 27 36 45 54 63 72 81 90 99.)
Мне кажется, что вроде всё правильно написал, а программа работает неверно. При вводе n=2 должно выдавать: 10
<code>
n = int(input())
counter = 0
for i in range(1, 100):
    o = i // 10
    d = i % 10
    o_1 = (n * i) // 10
    d_1 = (n * i) % 10 #36 72
    if i * n < 100:
        if d + o == d_1 + o_1:
            counter += 1
    else:
        s_1 = (n * i) // 10 % 10  #104
        if d + o == d_1 + o_1 + s_1:
            counter += 1
print(counter)
</code>
Ссылка на задание

Я вижу 2 ошибки.

Числа должны быть двузначные, а цикл у вас от 1
for i in range(1, 100). Должен быть от 10.

s_1 вы считаете неправильно. Т.к. программа попала в этот
else блок, то для трехзначного числа у вас
o_1 будет больше или равен 10. Тогда
s_1 (совсем старшая цифра) должна считаться от
o_1 как результат дальнейшего деления на 10. А
o_1 (средняя цифра) - её нужно пересчитать как остаток от деления её же на 10.

        s_1 = o_1 // 10
        o_1 = o_1 % 10

Либо, если оставить вашу формулу для
s_1 как есть, тогда она олицетворяет среднюю цифру, и
o_1 надо высчитать для старшей:

        o_1 = (n * i) // 10 // 10


Сохранение два раза в базу данных
Я изучаю sqlite3, как сделать так, чтобы при прописке playe имя ещё раз не создавалось в таблице?
вот мой не рабочий код:
<code>
import sqlite3

connect = sqlite3.connect("Stats.db")
cursor = connect.cursor()

cursor.execute("""CREATE TABLE IF NOT EXISTS player(
    name TEXT,
    cash INT,
    level INT
)""")
connect.commit()

playe = input("Ваш никнэйм: ")
balance = 10
leve = 0

def start():
    print(f"\nНачать(/p)\nНастройки(/n)\nНовости(/w)")

cursor.execute(f"SELECT name FROM player WHERE name = {playe}")
if cursor.fetchone() is None:
    cursor.execute("INSERT INTO player VALUES(?,?,?);", (playe, balance, leve))
    connect.commit()
    start()
else:
    start()
</code>

Для того чтобы не было дубликатов в таблице нужно:

на уровне БД создать уникальный констрейнт
в бизнес логики использовать апсерт с последующим апдейтом или исключением


Сортировка списка списков по первому элементу python
Есть список списков:

[[(4, 0.454453), (5, 0.563333),(1, 0.879905)],
[(5, 0.769977), (1, 0.123533),(4, 0.986533)]]

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

[[(1, 0.879905), (4, 0.454453), (5, 0.563333)],
[(1, 0.123533), (4, 0.986533), (5, 0.769977)]]


Вопрос по вложенности python
При введении значения 14, 17 и т.д., получаю ошибку:

AttributeError: 'map' object has no attribute 'append'

sum = 0
mainList = list()
if count < 10:
  if count < 0:
      print("very small number")
  else:
    for num in range(0, count):
      sum += num
      print(sum)
elif count in range(10, 20):
  for num in range(0, count):
    mainList.append(num)
    mainList = map(str, mainList)
    print("used numbers=", ', '.join(mainList))
else:
    print("very big number")```

Исходя из условия вашей задачи, думаю, вам подойдет такое решение.

В первой части находим сумму всех чисел с помощью функции
sum. Эта функция принимает на ход список чисел. Создаем этот список с помощью спискового включения.

По второму условию используем
f-строки и функцию
join. Она принимает список строк. Поэтому в списковом вкючении приводим каждый элемент к строке.

В третьем условии просто выводим строку, которую от нас хотят.

if n < 10:
    print(sum(range(n)))
elif 10 <= n < 20:
    print(f'used numbers= {", ".join([str(x) for x in range(n)])}')
else:
    print('very big number')


Перевести число X в системе счисления s1 в систему счисления s2
Цель: написать универсальную программу, которая решает задачу для любых X, s1 и s2..
Входные данные:
Во входных данных вашей программе дается 3 числа: исходное число X, основания систем счисления s1 и s2 (2  ≤  s1, s2  ≤  10). Число X в десятичной системе счисления не превышает 2 × 109.
Выходные данные:
В выходных данных должно находиться одно число, равное числу X в системе счисления s2, или -1, если входные данные некорректны.
Мой код:
<code>
x, s1, s2 = map(int,input().split())
x = str(x)
x1 = int(x, s1)
if s2 == 10:
    print(x1)
else:
    s = str(" ")
    d = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    v = 0
    if x1<0:
        x1 = -x1
        v = 1
    while x1>0:
        s = d[x1%s2] + s
        x1 = x1//s2
    if v == 1:
        s = "-" + s
    print(s)
</code>
Его надо дополнить, чтобы при некорректных данных (например 200, 2, 10) выводилось -1, а не ошибка. Как это сделать?

x, s1, s2 = map(int,input().split())
x = str(x)
try:
    x1 = int(x, s1)
except ValueError:
    print(-1)
else:

    if s2 == 10:
        print(x1)
    else:
        s = str(" ")
        d = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        v = 0
        if x1<0:
            x1 = -x1
            v = 1
        while x1>0:
            s = d[x1%s2] + s
            x1 = x1//s2
        if v == 1:
            s = "-" + s
        print(s)


Разобрать строку регулярным выражением python
Нужно разобрать строку, например:

line = '1) среднее профессиональное (Дошкольное образование; Воспитатель дошкольного образования); 2) высшее (Дошкольная педагогика и психология; Преподаватель дошкольной педагогики и психологии)'

Нужно разобрать ее чтобы получилось следующее:

post = [{ edu: 'Cреднее профессиональное',
          qualification: 'Дошкольное образование; Воспитатель дошкольного образования'}, ...]

Используя python re:

_line = re.sub(r'\([^()]*\)', '', post).title()
print(_line)
1) Среднее Профессиональное ; 2) Высшее
_line = _line.split(';')
print(_line)
['1) Среднее Профессиональное ', ' 2) Высшее ']

Получился список, а как вытащить значения в скобках, не понятно

import re

line = '1) среднее профессиональное (Дошкольное образование; Воспитатель дошкольного образования); 2) высшее (Дошкольная педагогика и психология; Преподаватель дошкольной педагогики и психологии)'
fields = ('edu', 'qualification')

result = [dict(zip(fields, x)) for x in re.findall(r'\d+\)\s*(.*?)\s*\((.*?)\)', line)]
print(result)

[{'edu': 'среднее профессиональное', 'qualification': 'Дошкольное образование; Воспитатель дошкольного образования'},
 {'edu': 'высшее', 'qualification': 'Дошкольная педагогика и психология; Преподаватель дошкольной педагогики и психологии'}]


динамическое создание окон и присвоение им идентификатора
Есть программа, в которой по нажатию на кнопку создаются окна соответствующего класса. Окна являются элементами списка.
Надо сделать, чтобы каждому окну присваивался свой
id и по этому
id, введенному в
QLineEdit, можно было отправлять окну переменную,  содержащую некое значение и команду, например закрытия окна, сделать его не активным или наоборот активным или изменить его цвет.
Как вообще правильно создавать и работать с дочерними окнами?
Подскажите где найти хороший урок, учебники, потому что тот Гоша Дударь это жесть! В delphi все намного проще было.
Почему Python легкий? Он очень тяжелый :-(
На сколько мой код безграмотный?
Код всей программы:

    from PyQt5 import QtWidgets
    from PyQt5.QtWidgets import QApplication, QMainWindow

    import sys

    child_count = 0
    child_window = []

    class main_window_class(QMainWindow):

        def __init__(self):
            super(main_window_class, self).__init__()
            self.setWindowTitle("Prog_1 Main Window")
            self.setGeometry(100, 100, 500, 500)

            self.btn1 = QtWidgets.QPushButton("Создать дочернее окно", self)
            self.btn1.clicked.connect(self.btn1_on_click)
            self.btn1.setGeometry(0,50,300,50)
            self.name_edit = QtWidgets.QLineEdit("Ваш ник",self)
            self.name_edit.setGeometry(0, 0, 300, 50)

        def print_close_message(self):
            print("кто-то сдох :-(")

        def btn1_on_click(self):
            global child_count, child_window
            child_window.append(child_window_class())
            child_window[child_count].show()
            print(len(child_window))
            child_count += 1
            print("нас стало:",child_count)
            id = child_window.index(child_window) #тут вываливается ошибка
            print("мой id:",id)

    class child_window_class(QMainWindow):
        def __init__(self):
            super(child_window_class, self).__init__()
            self.setWindowTitle("Prog_1 Main Window")
            self.setGeometry(100, 100, 500, 500)

        def closeEvent(self, event):
            global child_count
            event.accept()
            main_window_class().print_close_message()
            child_count -= 1
            print("нас осталось:",child_count)

    def main_application_init():
        app = QApplication(sys.argv)
        main_window = main_window_class()
        main_window.show()
        sys.exit(app.exec_())

    if __name__ == "__main__":
        main_application_init()

id = child_window.index(child_window) #тут вываливается ошибка

Функция
index ищет в списке объект и если его не будет, выбросит исключение
ValueError, а у вас в функцию передается число, хотя в списке объекты дочерних окон. Исключения нужно ловить через
try/
except. В примере покажу как обрабатывать исключения, что не были пойманы в
try/
except, через
sys.excepthook
Насчет кода, я бы сказал выглядит неплохо. Но названия классов нужно писать с верхнего регистра и в верблюжьей нотации, и думаю лучше не писать в названии
class, для примера:
MainWindow.
А переменные
child_count = 0, child_window = [] я бы перенес в сам класс
MainWindow. Да и
child_count не нужно, т.к. количество можно получить из списка
child_window
Тут, кст, фигня:

main_window_class().print_close_message()

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

import sys
import traceback

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLineEdit, QMessageBox

def log_uncaught_exceptions(ex_cls, ex, tb):
    text = '{}: {}:\n'.format(ex_cls.__name__, ex)
    text += ''.join(traceback.format_tb(tb))

    print(text)
    QMessageBox.critical(None, 'Error', text)
    sys.exit(1)

sys.excepthook = log_uncaught_exceptions

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Prog_1 Main Window")
        self.setGeometry(100, 100, 500, 500)

        self.btn1 = QPushButton("Создать дочернее окно", self)
        self.btn1.clicked.connect(self.btn1_on_click)
        self.btn1.setGeometry(0, 50, 300, 50)
        self.name_edit = QLineEdit("Ваш ник", self)
        self.name_edit.setGeometry(0, 0, 300, 50)

        self.child_windows = []

    def print_close_message(self, child: 'ChildWindow'):
        self.child_windows.remove(child)

        print(f"кто-то сдох :-(\nнас осталось: {len(self.child_windows)}")

    def btn1_on_click(self):
        child_window = ChildWindow(self)
        child_window.show()

        self.child_windows.append(child_window)
        print(len(self.child_windows))

        print("Нас стало:", len(self.child_windows))
        idx = self.child_windows.index(child_window)
        print("Мой id:", idx)

class ChildWindow(QMainWindow):
    def __init__(self, parent: MainWindow):
        super().__init__()

        self.parent = parent

        self.setWindowTitle("Prog_1 ChildWindow")
        self.setGeometry(100, 100, 500, 500)

    def closeEvent(self, event):
        event.accept()
        self.parent.print_close_message(self)

def main():
    app = QApplication(sys.argv)

    main_window = MainWindow()
    main_window.show()

    sys.exit(app.exec_())

if __name__ == "__main__":
    main()


Измение цвета подсветки синтаксиса в Atom
Как изменить цвет подсветки синтаксиса Python в редакторе Atom?
Я новичок в программировании, по этому извиняюсь за возможно примитивный вопрос.

Чтобы изменить цвет синтаксиса, тебе нужно поменять тему оформления в Atom.
Для этого заходишь в настройки, во вкладку Install, далее в поиске вводишь название темы(их список можешь найти здесь). И далее устанавливаешь её. После этого в настройках во вкладке Themes находишь Syntax Theme  в правой стороне окна, и меняешь тему оформления на скачанную.
Надеюсь мой ответ помог вам!


Добавление в бд по критерию
В общем хочу добавить данные в бд по критерию, т.е. допустим insert into Table (name) values("value") where id=2, но в этой команде нельзя использовать where. Как быть?

Надо использовать не
INSERT .. VALUES, а
INSERT .. SELECT, который допускает WHERE clause в SELECT-части.
То есть формально это будет

insert into Table (name)
SELECT "value"
where id=2

Понятно, что именно этот запрос не будет выполнен - ибо сервер вполне ожидаемо спросит "А что это за
id и откуда его брать?". И будет прав - в моём коде в предложении SELECT отсутствует источник данных (FROM).
Хотя если дело происходит в процедуре/функции, то это может быть локальная переменная, тогда запрос выполнится.


Как в sqlite сделать запрос, чтобы из полного ФИО получить сокращенное?
Как в sqlite сделать запрос, чтобы из полного ФИО (фамилия, имя и отчество) получить на выходе сокращенное ФИО (фамилию и инициалы)?
В ячейке t_name указано полное ФИО (фамилия, имя и отчество)
Функция

conn = sqlite3.connect(settings.DATA_BASE)
cursor = conn.cursor()
sql = f"""SELECT data, para, idgroup, subj_name, t_name, t_aud
         FROM subs
         WHERE strftime('%Y-%m-%d', data) = strftime('%Y-%m-%d', 'now', 'localtime') AND lower(t_name) like ?
         ORDER BY para ASC"""
query = "%{}%".format(message.text.casefold())
query = query.title()
cursor.execute(sql, (query,))
result = cursor.fetchall()
if not result:
    msg = f"Не має замін для {message.text}."
    bot.send_message(message.from_user.id, msg, reply_markup=teacher, parse_mode='HTML')
    return
else:
    for ln in result:
        msg = f"🗂 Лента:   {ln[1]}\n" \
              f"👥 Группа:   {ln[2]}\n" \
              f"📖 Предмет:   {ln[3]}\n" \
              f"👤 Преподаватель:   {ln[4]}\n" \
              f"🚪 Кабинет:  {ln[5]}\n"
        bot.send_message(message.from_user.id, msg, reply_markup=teacher, parse_mode='HTML')
conn.commit()
conn.close()

Вот такой в итоге получился запрос
<code>
sql = f"""SELECT data, para, idgroup, subj_name,
    SUBSTR(t_name, 1, INSTR(t_name, ' ')-1) as f_name,
    SUBSTR(t_name, INSTR(t_name, ' ')+1,1) as l_name,
    SUBSTR(t_name, INSTR(SUBSTR(t_name, INSTR(t_name, ' ')+1), ' ')+ INSTR(t_name, ' ')+1,1) as o_name,
    t_aud
FROM subs
WHERE strftime('%Y-%m-%d', data) = strftime('%Y-%m-%d', 'now', 'localtime') AND lower(t_name) like ?
ORDER BY para ASC"""
</code>
Если в строке находится 2 (два) ФИО, то он только работает с одним ФИО (с первым)


Как достать из natasha?
НЕ могли бы вы сказать, как можно достать text и pos из проанализированного текста
<code>
[DocToken(stop=9, text='Появление', pos='NOUN', feats=<Inan,Nom,Neut,Sing>), DocToken(start=10, stop=13, text='ООН', pos='PROPN', feats=<Inan,Gen,Fem,Sing>), DocToken(start=14, stop=18, text='было', pos='AUX', feats=<Imp,Neut,Ind,Sing,Past,Fin,Act>)]

появление NOUN
ООН PROPN

tt = 'Появление ООН было обусловлено целым рядом объективных факторов'

from natasha import (
    Segmenter,
    NewsEmbedding,
    NewsMorphTagger,
    Doc)

segmenter = Segmenter()

emb = NewsEmbedding()
morph_tagger = NewsMorphTagger(emb)
doc = Doc(tt)
doc.segment(segmenter)
doc.tag_morph(morph_tagger)
doc.tag_morph(morph_tagger)
doc.tokens
</code>

Из
doc.tokens можно взять список токенов, каждый токен это объект
DocToken, у которого можно запросить атрибуты
pos и
text
Пример:

from natasha import Segmenter, NewsEmbedding, NewsMorphTagger, Doc

tt = 'Появление ООН было обусловлено целым рядом объективных факторов'

segmenter = Segmenter()

emb = NewsEmbedding()
morph_tagger = NewsMorphTagger(emb)
doc = Doc(tt)
doc.segment(segmenter)
doc.tag_morph(morph_tagger)

for token in doc.tokens:
    print(token.pos, token.text)

Результат:

NOUN Появление
PROPN ООН
AUX было
VERB обусловлено
ADJ целым
NOUN рядом
ADJ объективных
NOUN факторов


Как запретить админу редактировать поле Django
Есть такая модель в models.py:

class Test(models.Model):
    name = models.CharField(max_length=256)
    date_started = models.DateField(default=datetime.now)
    date_ended = models.DateField(null=True)
    description = models.TextField(max_length=512)

Эта модель регистрируется в admin.py:

from .models import Test

admin.site.register(Test)

И мне надо сделать так, чтобы в админке можно было добавлять объекты для Test и выбирать что угодно, но нельзя было редактировать поле date_started после того как объект уже был создан. То есть, можно выбрать дату при создании, но нельзя редактировать после. Как это сделать?

Проблему решил так:
admin.py
<code>
from .models import Test

class TestAdmin(admin.ModelAdmin):
    readonly_fields = ('date_started',)

admin.site.register(Test, TestAdmin)
</code>


Как правильно подсчитать совпадающие элементы в двух списках?
У меня есть два списка

list_1 = [['появление', 'NOUN'], ['ООН', 'PROPN'], ['было', 'AUX'], ['обусловлено', 'VERB'], ['целым', 'ADJ'], ['рядом', 'NOUN'], ['объективных', 'ADJ'], ['факторов', 'NOUN'], ['военно', 'ADJ'], ['стратегического', 'ADJ'], ['политического', 'ADJ'], ['экономического', 'ADJ'], ['развития', 'NOUN'], ['человеческого', 'ADJ'], ['общества', 'NOUN'], ['конца', 'NOUN'], ['второго', 'NUM'], ['тысячелетия', 'NOUN'], ['создание', 'NOUN'], ['ООН', 'NOUN'], ['явилось', 'VERB'], ['воплощением', 'NOUN'], ['извечной', 'ADJ'], ['мечты', 'NOUN'], ['человечества', 'NOUN'], ['о', 'ADP'], ['таком', 'PRON'], ['устройстве', 'NOUN'], ['и', 'CCONJ'], ['организации', 'NOUN'], ['международного', 'ADJ'], ['общежития', 'NOUN'], ['которые', 'PRON'], ['избавили', 'VERB'], ['бы', 'x'], ['человечество', 'NOUN'], ['от', 'ADP'], ['бесконечности', 'NOUN'], ['череды', 'NOUN'], ['войн', 'NOUN'], ['и', 'CCONJ'], ['обеспечили', 'VERB'], ['бы', 'x'], ['мирные', 'ADJ'], ['условия', 'NOUN'], ['жизни', 'NOUN'], ['народов', 'NOUN'], ['их', 'PRON'], ['поступательное', 'ADJ']]
list_2 = [['появление', 'NOUN'], ['ООН', 'NOUN'], ['было', 'VERB'], ['обусловлено', 'VERB'], ['целым', 'ADJ'], ['рядом', 'NOUN'], ['объективных', 'ADJ'], ['факторов', 'NOUN'], ['военно', 'ADJ'], ['стратегического', 'ADJ'], ['политического', 'ADJ'], ['экономического', 'ADJ'], ['развития', 'NOUN'], ['человеческого', 'ADJ'], ['общества', 'NOUN'], ['конца', 'NOUN'], ['второго', 'NUM'], ['тысячелетия', 'NOUN'], ['создание', 'NOUN'], ['ООН', 'PROPN'], ['явилось', 'VERB'], ['воплощением', 'NOUN'], ['извечной', 'ADJ'], ['мечты', 'NOUN'], ['человечества', 'NOUN'], ['о', 'ADP'], ['таком', 'DET'], ['устройстве', 'NOUN'], ['и', 'CCONJ'], ['организации', 'NOUN'], ['международного', 'ADJ'], ['общежития', 'NOUN'], ['которые', 'PRON'], ['избавили', 'VERB'], ['бы', 'x'], ['человечество', 'NOUN'], ['от', 'ADP'], ['бесконечности', 'NOUN'], ['череды', 'NOUN'], ['войн', 'NOUN'], ['и', 'CCONJ'], ['обеспечили', 'VERB'], ['бы', 'x'], ['мирные', 'ADJ'], ['условия', 'NOUN'], ['жизни', 'NOUN'], ['народов', 'NOUN'], ['их', 'PRON'], ['поступательное', 'ADJ']]

Я хочу сравнить два списка и подсчитать сколько элементов совпадает.
мой код:

result22 = []
for c in list_1:
    for x in list_2:
        if c == x:
            result22.append(c)
        else:
            break
print(len(result22))

У меня выходит ответ 1, но должно получиться около 45. Подскажите, пожалуйста, где ошибка?

У вас если первый элемент второго списка не равен текущему элементу первого списка, то дальнейшее сравнение не производится. Нужно убрать
 else.

if c == x:
    result22.append(c)
    break


Как понять что текст соответствует примеру
Ну вот допустим, есть вот такая python строка:
some(shit("Hello, ", "world!")). И как понять, что она соответствует такому примеру:
some(shit("...", "...")). Вместо точек любые символы

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

some\(shit\("[^"]+", "[^"]+"\)\)

Как использовать (если вернулся объект
re.Match, то шаблон соответствует, иначе
None):

import re

pattern = re.compile(r'some\(shit\("[^"]+", "[^"]+"\)\)')

print(pattern.search('some(shit("Hello, ", "world!"))'))
print(pattern.search('some(shit("...", "..."))'))
print(pattern.search('some(shit("...", "...", "..."))'))
print(pattern.search('some(shit("..."))'))

Результат:

<re.Match object; span=(0, 31), match='some(shit("Hello, ", "world!"))'>
<re.Match object; span=(0, 24), match='some(shit("...", "..."))'>
None
None

PS.
Для получения
True/
False результат
re.search оберните в
bool:

print(bool(pattern.search('some(shit("..."))')))

Хотя можно и без этого в
if помещать:

text = 'some(shit("..."))'
m = pattern.search(text)
if not m:
    # Логика если строка text не соответствует шаблону


Работа с консолью(терминалом) Python
Кратко говоря, к этому коду:

import pyttsx3
text = 'Это работает'
tts = pyttsx3.init()
tts.setProperty('rate', 120)

volume = tts.getProperty('volume')
tts.setProperty('volume', volume+0.9)

# Задать голос по умолчанию
tts.setProperty('voice', 'ru')

tts.say(text)
tts.runAndWait()

Я хочу добавить что-то подобное:

if переменная == 'сообщение из консоли/терминала PyCharm':
   tts.say(text)

Можете подсказать библиотеку или другое решение? Библиотека argparse мне не помогла, а другие варианты я не нашёл... Извиняюсь за предположительно глупый вопрос.

text = 'Это работает'
tts = pyttsx3.init()
tts.setProperty('rate', 120)

volume = tts.getProperty('volume')
tts.setProperty('volume', volume+0.9)

# Задать голос по умолчанию
tts.setProperty('voice', 'ru')
#ввод из терминала
text=str(input('Что мне сказать? '))
tts.say(text)
tts.runAndWait()

аналог аргпарсе

import docopt
_doc_="""I say.

Usage:
    file.py -t <text>
    file.py -text <text>

Options:
  -t --text Text for speach

Description:
    The description of apps
"""
dc=docopt.docopt(_doc_, version='i say 1.0')
#file.py -t "the sample"
#{'--text': "the sample"}

tts.say(dc['text'],dc['t'])


Как поменять элемент в списке?
У меня список с маленькими списками в нем. Мне нужно поменять во всех маленьких списках элемент ADJF на ADJ.
Скажите, пожалуйста, как это можно сделать?
<code>
result = [['появление', 'NOUN'], ['оон', 'NOUN'], ['быть', 'VERB'], ['обусловить', 'PRTS'], ['целый', 'ADJF'], ['рядом', 'ADVB']]

for tt in result:
    list_B = [word if word != 'ADJF' else 'ADJ' for word in tt]
</code>
Но вообще ничего не получается

Если заменять прямо в том же списке:

for i in range(len(result)):
    if result[i][1] == 'ADJF':
        result[i][1] = 'ADJ'

Если надо создать новый:

list_B = [[a,'ADJ'] if b == 'ADJF' else [a,b] for a,b in result]


Как убрать лишнее?
У меня есть скрипт

import os
import time

def follow(thefile):
    thefile.seek(0, 2)
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.1)
            continue
        yield line

if __name__ == "__main__":
    logfile = open(os.getenv("APPDATA") + "/.minecraft/logs/latest.log", "r")
    loglines = follow(logfile)
    for line in loglines:
        if "[CHAT] Serverexe" in line:
            print(line.strip("\n"))

котоырй отслеживает логи майна и выводит в консоль сообщение от определённого игрока, так вот, когда этот игрок написал сообщение, скрипт его нашёл и вывел, то выводит он его так

[19:20:04] [Client thread/INFO]: [CHAT] Serverexe: oooooooooops
[19:20:07] [Client thread/INFO]: [CHAT] Serverexe: sorry
[19:20:15] [Client thread/INFO]: [CHAT] Serverexe: bro?

тут много лишнего, как мне убрать это и оставить только вот это

Serverexe: oooooooooops
Serverexe: sorry
Serverexe: bro?

Можно использовать метод
partition() у строки:

>>> line = '[19:20:04] [Client thread/INFO]: [CHAT] Serverexe: oooooooooops'
>>> line.partition('[CHAT] ')[2]
'Serverexe: oooooooooops'

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

>>> line[line.find('[CHAT] ')+7:]
'Serverexe: oooooooooops'


Найти первый подсписок по букве. Python
Всем привет!
Мне нужно найти первый подсписок в слове по какой-то букве. Например, пользователь дает слово, затем дает букву, и если в слове есть эта буква, нам нужно проверить, есть ли у нас 2 следующие буквы? если да, то печатаем букву + 2 следующие буквы в слове. Если буквы нет в слове, ничего не печатайеm.
Например:
word: banan
letter: n
"nan"
word: Orange
letter: r
"ran"
word: python
letter: n
мой код совершенно неправильный. не понимаю, как это сделать.
<code>
word=input("word: ")
letter=input("letter: ")
lst=[i[-2:] for line in word for i in line.split()]

print(lst)
</code>

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

word = 'banan'
letter = 'b'

i = word.find(letter)
print(word[i:i+3])  # ban

UPD
как верно заметил в комментариях ganz, необходимо немного изменить параметры вызова функции:

word = 'python'
letter = 'o'

i = word.find(letter,0,-2)
print(word[i:i+3])


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

T, t = 7, 7
V, v = \/, \/
W, w = \v/, \v/
Z, z = 2, 2
L, l = 1, 1
I, i = |, |
G, g = 6, 6
D, d = [), [)
C, c = (, (

вот как должно это выглядеть

Hello, my name is Liquid, bruh client
He11o, my name |s 1|qu|[), bruh (1|en7

Можно, например через функцию строки
replace, или через генерацию новой строки с подменой символов, или через функцию строки
translate:

Для алгоритма с
replace проходим по словарю и вызываем замену ключа на значение
При генерации новой строки, перебирая символы запрашиваем значение по ключу и если ключа не будет, вернется сам символ, такая логика в
.get(c, c)
Для использования функции строки
translate нужна таблица, которую получим через
maketrans использя словарь с ассоциацией символов, а дальше вызываем метод

Для удобства работы, оформил ассоциацию символов в виде словаря. А для проверки работы использовал оператор
assert
Пример:

CHAR_BY_REPLACED = {
    'T': '7', 't': '7',
    'V': r'\/', 'v': r'\/',
    'W': r'\v/', 'w': r'\v/',
    'Z': '2', 'z': '2',
    'L': '1', 'l': '1',
    'I': '|', 'i': '|',
    'G': '6', 'g': '6',
    'D': '[)', 'd': '[)',
    'C': '(', 'c': '(',
}

def using_replace(text: str) -> str:
    for c1, c2 in CHAR_BY_REPLACED.items():
        text = text.replace(c1, c2)
    return text

def create_new_string(text: str) -> str:
    return ''.join(CHAR_BY_REPLACED.get(c, c) for c in text)

def using_translate(text: str) -> str:
    trans_table = str.maketrans(CHAR_BY_REPLACED)
    return text.translate(trans_table)

text = 'Hello, my name is Liquid, bruh client'
expected = 'He11o, my name |s 1|qu|[), bruh (1|en7'

print(using_replace(text))
assert using_replace(text) == expected

print(create_new_string(text))
assert create_new_string(text) == expected

print(using_translate(text))
assert using_translate(text) == expected


Как записать в список?
Я провожу анализ текста с помощью pymorphy2. Из анализа я выаскиваю само слово (parse.normal_form) и его часть речи (parse.tag.POS).
Вот что у меня выходит

появление NOUN
оон NOUN
быть VERB
обусловить PRTS
целый ADJF

Как можно записать все это в список, который содержал много маленьких списков

[['появление','NOUN'],['оон','NOUN'],['быть','VERB']]

words = text.split()
pos_tag = []
for word in words:
  parse = morph.parse(word)[0]
  print(parse.normal_form,parse.tag.POS)

Это очень просто сделать, просто создайте пустой список и добавляйте в него список двух значений:

words = text.split()
res = []
for word in words:
  parse = morph.parse(word)[0]
  res.append([parse.normal_form, parse.tag.POS])
print(res)

Вывод:

[['появление','NOUN'],['оон','NOUN'],['быть','VERB']]


Как назначить асинхронную обработку горячих клавиш?
Нужно добавить глобальные горячие клавиши. Например,
f4 и
f8. Использую библиотеку keyboard. Есть проблема, пока первый обработчик не закончит работу, новые нажатия клавиш игнорируются.
Другими словами, сейчас работает так

pressed f4
end for f4
pressed f8
end for f8

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

pressed f4
pressed f8
end for f4
end for f8

Демо код

# pip install keyboard
from keyboard import add_hotkey, wait
from time import sleep

def on_callback(key):
    print('pressed', key)
    sleep(5) # эмуляция долгой работы
    print('end for', key)

add_hotkey("f4", lambda: on_callback("f4"))
add_hotkey("f8", lambda: on_callback("f8"))

wait('esc')

Попробовал
asyncio, но ничего не изменилось

pressed f4
end for f4
pressed f8
end for f8

from keyboard import add_hotkey, wait
import asyncio

async def on_callback(key):
    print('pressed', key)
    await asyncio.sleep(5)
    print('end for', key)

add_hotkey("f4", lambda: asyncio.run(on_callback("f4")))
add_hotkey("f8", lambda: asyncio.run(on_callback("f8")))

wait('esc')

Попробуйте через потоки
<code>
from threading import Thread

def main(key):
    add_hotkey(key, lambda: on_callback(key))

Thread(target=main,args=(“f4”).start()
Thread(target=main,args=(“f8”).start()
</code>


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

import logging

logger_1 = logging.getLogger('Logger1')
logger_2 = logging.getLogger('Logger2')

STRING_FORMAT = '{name} {levelname:<8} > {msg}'
LEVEL = logging.DEBUG

logger_1.basicConfig(
    level=LEVEL,
    filename='errors.log',
    filemode='a',
    style='{',
    format=STRING_FORMAT,
)

logger_1.error('Error from <logger 1>')
# Файл   :  Logger1 ERROR    > Error from <logger 1>

logger_2.error('Error from <logger 2>')
# Консоль:  Error from <logger 2>

logger_1.debug('Error from <logger 1>')
# Файл   :  Logger1 DEBUG    > Debug from <logger 1>

При настройке
logging.basicConfig у меня изменяются настройки всех остальных логгеров, и они тоже начинают писать в файл, а у отдельных логгеров нет этой настройки. Могу я и как настроить вывод одного из логгеров в другое место (а, желательно, формат и уровень тоже), не изменяя настроек других?

Оригинал ответа
Код, который исправляет эту ситуацию:
<code>
import logging

def create_logger(name, file=None, format_=None, level=logging.INFO):
    logger = logging.getLogger(name)
    logger.setLevel(level)
    if file is not None:
        handler = logging.FileHandler(file)
        handler.setFormatter(format_)
        logger.addHandler(handler)
    return logger

formatter = logging.Formatter('{name} {levelname:<8} > {msg}', style='{')
level = logging.DEBUG

logger_1 = create_logger('Logger1', 'errors.log', formatter, level)
logger_2 = create_logger('Logger2')

logger_1.error('Error from <logger 1>')
logger_2.error('Error from <logger 2>')
logger_1.debug('Error from <logger 1>')
</code>


как передать в godot переменную из python-скрипта в godot-скрипт
есть два скрипта - один .gd, второй .py
из .py мне нужны только переменные (строковые, числовые, списки, словари),
их нужно забрать(импортировать) в .gd
каким образом можно это сделать?
пример ScriptPy.py (синглтон)

a='Hello'
b=3

пример ScriptGd.gd

var t=ScriptPy.a
var i=ScriptPy.b
print(t) #не работает
print(i) #не работает

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


Циклы внутри цикла. Как оптимизировать?
На вход подается натуральное число n.
Допустим, если  n = 3, то код должен выполнять такую функцию:

for i in x:
    print(i)
    for j in x:
        print(j)
        for q in x:
            print(q)

Если n = 1, то:

for i in x:
    print(i)

То есть, если n будет равно, допустим, 50, то таких циклов должно быть 50.
Есть ли способ написать такой код без расписывания минимум ста циклов внутри цикла?

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

def recfun(n, x):
    if n:
        for i in x:
            print(i)
            recfun(n-1, x)

А можно сделать цикл
for по значениям
k от
0 до Q^n-1, где
Q - размер
x, и выводить представление
k в Q-ричной системе счисления.
А можно так, как электросчётчик работает... Однако рекурсивный код проще всего.

def recfun(n, x, s = ""):
    if n:
        for i in x:
            #print(i)
            recfun(n-1, x, s + i)
    else:
        print(s)

recfun(3, "01")


Ошибка при попытке удалить виджет в KivyMD
Я пытаюсь написать простейшее приложение на python и kivymd, но столкнулся с ошибкой.

line 172, in clears
self.General.ids.BL.remove_widget(self.test)
AttributeError: 'Game' object has no attribute 'test'

Ниже я постараюсь написать только основной код, для этого уберу ненужные детали, чтобы они не мешали восприятию.
Проблема -> Виджет не может быть удален. После появления MDIconButton из кода Python их нужно через некоторое время удалить. Я думаю, что к элементам MDIconButton из кода вам нужно будет добавить идентификатор с помощью идентификаторов, но пока невозможно удалить даже виджет из разметки KV, у которого уже есть идентификатор. Я попытался удалить виджет с помощью

self.General.ids.BL.remove_widget(self.test)

Но это дает ошибку, которая была выше.
В идеале я хотел бы выяснить, как удалить виджеты из кода python, но я был бы благодарен за любую помощь. При необходимости я готов показать весь код целиком.

from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.animation import Animation
from kivymd.uix import screen
from kivymd.uix.screen import MDScreen
from kivymd.uix.button import MDIconButton
from kivymd.uix.label import MDIcon, MDLabel

from kivy.uix.widget import Widget

import random
import os

KV = '''
ScreenManager:

    Screen:
        FitImage:
            source: 'path'

        MDIconButton:
            icon: 'path'
            pos_hint: {"center_x": .5, "center_y": .70}
            user_font_size: '35dp'
            on_release:app.start()

    Screen:
        name: 'start_game'
        FitImage:
            source: 'path'

        FloatLayout:
            id : BL
            orientation: 'vertical'

            MDIconButton:
                id:test
                icon: 'path'
                pos_hint: {"center_x": .30, "center_y": .15}
                user_font_size: '35dp'
                on_release:app.Games("one")

            MDIconButton:
                id:two
                icon: 'path'
                pos_hint: {"center_x": .45, "center_y": .2}
                user_font_size: '35dp'
                on_release:app.Games("two")

            MDIconButton:
                id:three
                icon: 'path'
                pos_hint: {"center_x": .60, "center_y": .15}
                user_font_size: '35dp'
                on_release:app.Games("three")

'''

        #self.General.ids.BL.remove_widget(self.test)

class Game(MDApp):
    def build(self):
        self.General = Builder.load_string(KV)
        return self.General

    def hod_igrok(self, igrok, mix, miy,status=None):
        status = '0'
        if status == 'long':
            igrok = igrok[0].replace(' ','')
        else:
            pass
        print(igrok)

        self.General.ids.BL.add_widget(
            MDIconButton(
                pos_hint={"center_x": mix, "center_y": miy},
                icon=r"path %s.png"%igrok,
                user_font_size= '50dp'

            )
        )

        return self.General

    def hod_comp(self, comp, c_x, c_y, status=None):

        print(comp)
        status = ' '
        if status == 'long':
            comp = comp[0].replace(' ','')
        else:
            pass

        self.General.ids.BL.add_widget(
            MDIconButton(
                pos_hint={"center_x": c_x, "center_y":c_y},
                icon= r"path c_%s.png"%comp,
                user_font_size='50dp'
                )
            )

        return self.General

    def clears(self):
        self.General.ids.BL.remove_widget(self.test)

    def Games(self, igrok):

        lis = ['kamen','nojnicy', 'bumaga']
        comp= random.choice(lis)

        if comp == "kamen" and igrok == "kamen" or comp == "nojnicy" and igrok == "nojnicy" or comp == "bumaga" and igrok == "bumaga":
            print(comp,'/n',igrok)
            print("Ничья")
            self.hod_igrok(igrok, .45,.50, 'long')
            self.clears()

        elif comp == "kamen" and igrok == "bumaga" or comp == "nojnicy" and igrok == "bumaga" or comp == "bumaga" and igrok == "kamen":
            print(comp,'/n',igrok)
            print("Победил компьютор")
        elif igrok == "bumaga" and comp == "kamen" or igrok == "nojnicy" and comp == "bumaga" or igrok == "kamen" and comp == "nojnicy":
            print(comp,'/n',igrok)
            print("Выиграл игрок")

    def start(self):
        self.root.current= 'start_game'

Game().run()

Вместо
self.test попробуйте
self.General.ids.test
Пример:

self.General.ids.BL.remove_widget(self.General.ids.test)


NameError: name '_' is not defined (python, phonenumbers)
как убрать ошибку
NameError: name '_' is not defined?
models.py

from django.core.exceptions import ValidationError
import phonenumbers

def validate_phone_number(value):
    try:
        z = phonenumbers.parse(value, None)
    except phonenumbers.NumberParseException:
        raise ValidationError(_('%(value) is not a valid phone number'), params={'value': value},)
    if not phonenumbers.is_valid_number(z):
        raise ValidationError(_('%(value) is not a valid phone number'),params={'value': value},)

class Storehouses(models.Model):
    phone = models.CharField(validators=[validate_phone_number], unique=True, max_length=17, verbose_name='Телефон')

Вы забыли импортировать библиотеку django.utils.translation, а именно её модуль gettext.
Для этого следует прописать в начале следующее:
<code>
from django.utils.translation import gettext as _
</code>
Подробности о gettext() модуле вы можете прочитать здесь
Надеюсь, мой ответ вам поможет!


Как сделать чтобы когда у кого-то была определенная роль и когда он просит через команду другую роль прошлая роль у него снималась на Discord.py
Например, человек получил роль через команду !role1 и он пишет команду !role2, и как сделать чтобы role1 у него снималась, а role2 присваивалась и писалось "Вам выдана роль 2, убраны роли: 1"

@bot.command()
async def role1(ctx):
    role1 = discord.utils.get(ctx.guild.roles, id=role_id1)
    role2 = discord.utils.get(ctx.guild.roles, id=role_id2)
    if role2 in ctx.author.roles:
        await ctx.author.remove_roles(role2)
        await ctx.send(f"{ctx.author.mention} У вас удалена роль {role2.name}")
    await ctx.author.add_roles(role1)
    await ctx.send(f"{ctx.author.mention} Вам выдана роль {role1.name}")

@bot.command()
async def role2(ctx):
    role1 = discord.utils.get(ctx.guild.roles, id=role_id1)
    role2 = discord.utils.get(ctx.guild.roles, id=role_id2)
    if role1 in ctx.author.roles:
        await ctx.author.remove_roles(role1)
        await ctx.send(f"{ctx.author.mention} У вас удалена роль {role1.name}")
    await ctx.author.add_roles(role2)
    await ctx.send(f"{ctx.author.mention} Вам выдана роль {role2.name}")


Как сделать чтобы кто-то отмечал роль в определенном канале и он получал эту роль на Discord.py
Например кто-то отметит в канале  #роли @123 и бот выдавал бы роль @123 этому человеку

В принципе можно через
on_message

@commands.Cog.listener()
async def on_message(self, message):
    role = discord.utils.get(message.author.guild.roles, id=role_id)
    channel = discord.utils.get(message.author.guild.text_channels, id=channel_id)
    if message.content == role.mention:
        if message.channel == channel:
            await message.author.add_roles(role)
            return await message.channel.send(f'{message.author.mention} Вам добавлена роль {role.name}')


Можно ли в python преобразовать строку в словарь? [дубликат]

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

Как безопасно превратить строку в словарь Python

                                (1 ответ)

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

Из строчки:

string = '{"name":"Иван Иванов","ids":[1,2,3],"balance":12345}'

В словарь:

dict = {"name":"Иван Иванов","ids":[1,2,3],"balance":12345}

Да и очень легко! Вам просто надо выполнить следующую строку:

data = eval('{"name":"Иван Иванов","ids":[1,2,3],"balance":12345}')

Функция
eval просто выполняет код из строки. В данном случае мы просто инициализируем словарь.
Надеюсь, информация была полезна. Удачи!


Вывод элементов двумерного массива построчно через запятую
Размерность квадратной матрицы вводится с клавиатуры (size). Генерируется матрица, у которой в строке содержатся первые size натуральных чисел (начиная с 1).

n = int(input())
mas = []
for i in range(0, n, 1):
    mas.append([])
    for j in range(1, n+1, 1):
        mas[i].append(j)

tmas = [*zip(*mas)]
index = 0
for row in mas:
    for elem in row:
        print(elem, end=', ')
    print()

Пытаюсь вывести двумерный массив вот так:

1, 2, 3, 4
1, 2, 3, 4
1, 2, 3, 4
1, 2, 3, 4

а выводится вот так:

1, 2, 3, 4,
1, 2, 3, 4,
1, 2, 3, 4,
1, 2, 3, 4,

Как исправит?

Просто выводить построчно, а не поэлементно.
<code>
n = 4
mas = [list(range(1,n+1)) for _ in range(n)]
for row in mas:
    print(*row, sep=', ')
</code>


Как сделать проверку на файл конфига
У меня есть конфигурационный файл
config.ini вот его содержание

[Browser]
chrome= 55, 755
huiman= 702, 469

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

[Browser]
chrome= Place your coordinates
huiman= Place your coordinates

вот для чего это надо

import pyautogui as pag
import configparser

config = configparser.ConfigParser()
config.read("config.ini")

def chrome_mail():
    pag.moveTo(config["Browser"]["chrome"])
    pag.click()

if __name__ == '__main__':
    chrome_mail()

Используйте блок
try/except

import pyautogui as pag
import configparser

config = configparser.ConfigParser()
try:
    config.read("config.ini")
except:
    file = open("config.ini", "w", encoding="utf8")
    file.write("[Browser]\n"
               "chrome= Place your coordinates\n"
               "huiman= Place your coordinates")
    file.close()
    config.read("config.ini")

def chrome_mail():
    pag.moveTo(config["Browser"]["chrome"])
    pag.click()

if __name__ == '__main__':
    chrome_mail()

Теперь если файл
config.ini не существует, он автоматически создатся


Почему так выводит?
Есть некий Dataframe:

print(data.values)

Выводит:

[   nan   0.8635   0.8674   0.86925  0.86155  0.851675 0.8503   0.855425
 0.859525 0.87385  0.90065 ]

Однако когда пишу:

print(data.iloc[-1])

Выводит:

0.9006499999999997

А нужно 0.90065. В чем проблема? Как выводить числа точь в точь как в data.values?

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

print(df.iloc[-1])

0    0.90065

pd.options.display.float_format = "{:,.3f}".format # 3 знака
print(df.iloc[-1])

0   0.901


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

 self.job_func = functools.partial(job_func, *args, **kwargs)
TypeError: the first argument must be callable

код у меня такой

def get_not(user:User):
        if user.notifation:
            price = get_btc()
            bot.send_message(chat_id = user.chat_id, text=price )

schedule.every(1).minutes.do(get_not(user))

да просто следом указать параметры. Как в доках написанно.
<code>
import schedule, time

def job(param1, param2):
    print(str(param1) + str(param2))

schedule.every(10).seconds.do(job,'do something', 'like this')

while True:
    schedule.run_pending()
    time.sleep(1)
</code>


Как удалить некоторые напечатанные символы?
Вообщем, такая проблема, надо разложить целое число N на простые множители и вывести результат в порядке возрастания, указав степень числа (т. Е. Выводить не 2 2 2, а 2 ^ 3). Если число в 1 степени, степень указывать не надо. Мой код:
<code>

a = []
def pr(m):
    d = 2
    from math import sqrt
    while d <= int(sqrt(m)):
        if m%d == 0:
            return d
        d += 1
    return 1
n = int(input())
f = 1
while f == 1:
    d = int(pr(n))
    if d != 1:
        a.append(d)
        n = int(n/d)
    else:
        f = 0
a.append(n)
k, n = 2, max(a)
if k == 1:
    k = k+1
if k == 0:
    k = k+2
r=[]
for x in range(k,n+1):
    i=2
    while i*i<=x:
        if x%i==0:
            break
        i+=1
    else:
        r.append(x)
t = []
for g in r:
    if g in a:
        t.append(g)
for l in t:
    u = []
    e = a.count(l)
    print(l, '^', e, "*", end=" ")
</code>
Однако, мне выдает в конце "*", чего не должно быть, а также если, например число x в степени 1, то выводит "x^1", а надо "x". Как это исправить?

Вообще, там желательно бы все переделать, но незачем вам мозг пока ломать. В рамках логики вашего примера (только последний цикл вывода подкорректировал) вот так:
<code>
a = []
def pr(m):
    d = 2
    from math import sqrt
    while d <= int(sqrt(m)):
        if m%d == 0:
            return d
        d += 1
    return 1
n = int(input())
f = 1
while f == 1:
    d = int(pr(n))
    if d != 1:
        a.append(d)
        n = int(n/d)
    else:
        f = 0
a.append(n)
k, n = 2, max(a)
if k == 1:
    k = k+1
if k == 0:
    k = k+2
r=[]
for x in range(k,n+1):
    i=2
    while i*i<=x:
        if x%i==0:
            break
        i+=1
    else:
        r.append(x)
t = []
for g in r:
    if g in a:
        t.append(g)
cnt = 0
for l in t:
    cnt = cnt + 1
    u = []
    e = a.count(l)
    if cnt == len(t):
        if e == 1:
            print(l)
        else:
            print(l, '^', e)
    else:
        if e == 1:
            print(l, "*", end=" ")
        else:
            print(l, '^', e, "*", end=" ")
</code>


построчное вычитание из pandas dataframe элементов списка
Подскажите пожалуйста
есть список

x = [0.454453, 0.563333, 0.879905, 0.769977, 0.123533, 0.986533]

есть

dataframe = [[0.754553, 0.563333, 0.899055, 0.769877, 0.123232, 0.785633]
             [0.954553, 0.863333, 0.399055, 0.669877, 0.723232, 0.185633]
             [0.854553, 0.463333, 0.699055, 0.969877, 0.223232, 0.385633]]

как из dataframe вычесть элементы списка x построчно, т.е.

0.754553 - 0.454453
0.563333 - 0.454453 и т.д

соответственно дальше:

0.954553 - 0.563333
0.863333 - 0.563333

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


Вывести слова на python [закрыт]

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

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

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

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

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

Получил и вывел все слова
<code>
predlozhenie ="this is sparta"
print(predlozhenie)
</code>


Как поступить с функцией?
Не знаю, что делать. То ли код переписывать, то ли костыли лепить.
Есть куча функций. К примеру возьмем 3.

astatic23()
astatic27()
bstatic27()

По итогу некого списка
[a, b, a,] нужно подставлять первый элемент списка
a к
static27(), для того чтобы исполнить функцию.
Как это сделать?

list1 = [a, b, a,]
str(list[0]) + static() # Как это правильно сделать?

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

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

def astatic27(): print('astatic27')
def bstatic27(): print('bstatic27')

funcs_map = {'a': astatic27,
             'b': bstatic27}

lst = ['a', 'b', 'a']

for el in lst:
    funcs_map[el]()

Вызовутся соответствующие функции.

astatic27
bstatic27
astatic27

Ещё можно собрать имя (как строку) и поискать функцию в атрибутах глобального/локального (или где ещё) пространства. Но это уже почти что хакинг.
Пример для глобальных функций:

for el in lst:
    globals()[el+'static27']()

Ещё как вариант, собирать имя функции и делать
eval. Но так поступать вообще не советую.


Можно ли создать диалоговое окно через Qt designer? И как подключить данное окно к коду-логике?
Можно ли создать диалоговое окно в qt designer и подключить его к логике?

Помог комментарий S.Nick:
Qt Designer можно встроить любой виджет и вы можете найти на SO ответы на поставленный вами вопрос.


Оптимизация записи в таблицу excel
Всем привет, столкнулся с такой проблемой - у меня в папке лежит 26 000 xml файлов, я каждый файл проверяю и записываю в таблицу excel.
<code>
from bs4 import BeautifulSoup
import requests as req
from fake_useragent import *
import xml.etree.ElementTree as ET
import os
import openpyxl

myDOC = r'XMLfiles/1.xml'
#
# beginTree = ET.parse(myDOC)
# file_root = beginTree.getroot()
# elem = file_root.find('vendor')
# print(elem.text)
allFiles = os.listdir('C:/Content/SplitFiles')
Description_item = 'У данного товара нет этого поля'
DOP_Description_item = 'У данного товара нет этого поля'
BRAND_item = 'Информация не указана'
NAME_item = 'Название товара не указанно'
print(len(allFiles))
statusList = []
countList = []
priceList = []
barcodeList = []
itemIDlist = []
urlList = []

nameList = []
brandList = []
descriptionList = []
DOPDescriptionList = []
book = openpyxl.Workbook()
sheet = book.active
for i in range(2, len(allFiles)):
    beginTree = ET.parse(r'C:/Content/SplitFiles/' + allFiles[i])

    file_root = beginTree.getroot()
    barcode = file_root.find('barcode')
    if barcode is not None:
        bar = barcode.text
        sheet['D' + str(i)].value = bar
    else:
        sheet['D' + str(i)].value = 'Информация отсутствует'
    #
    elem = file_root.find('price')
    PRICE_item = elem.text
    sheet['B' + str(i)].value = PRICE_item
    #
    count = file_root.find('count')
    if count is not None:
        cnt = count.text
        sheet['E' + str(i)].value = cnt
    else:
        sheet['E' + str(i)].value = 'Информация отсутствует'
    #
    elem = file_root.find('name')
    if elem is not None:
        NAME_item = elem.text
        sheet['A' + str(i)].value = NAME_item
    #
    status = file_root.find('status')
    if status is not None:
        if status.text == '200' or status.text == '2':
            sheet['C' + str(i)].value = 'Нет в наличии'
        if status.text == '100' or status.text == '1':
            sheet['C' + str(i)].value = 'Нет в наличии'
    #
    urlItem = file_root.find('url')
    link = urlItem.text
    res = req.get(link, headers={'User-Agent': UserAgent().chrome})
    html = BeautifulSoup(res.text, 'html.parser')
    IDs = html.select('#catalog-model-supertop #catalog-item-code')
    for ID in IDs:
        a = ID.text.replace('Код товара: ','')
        sheet['F' + str(i)].value = a
        print('Выполнено {0} из {1}'.format(i, len(allFiles)))
    #
    elem = file_root.find('url')
    URL_item = elem.text
    sheet['G' + str(i)].value = URL_item
    book.save('items1.xlsx')

sheet['A1'], sheet['B1'], sheet['C1'] = 'Название', 'Цена', 'Статус',
sheet['D1'], sheet['E1'], sheet['F1'] =  'Бар-код', 'Count', 'ID'
sheet['G1'] = 'URL'
</code>
и загрузка даже 4 000 файлов у меня заняла порядка 2-3 часов, можете подсказать, в чем дело?

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


Вложенный import в python
Прошу прощения за возможную очевидность, недавно серьезно изучаю Питон.
В целом разобрался с
import, но остался наивный вопрос.
Есть главный модуль
main, он импортирует
numpy и пару вспомогательных:

import numpy
import func_1
import func_2

Но дело в том, что в
func_1,
func_2 также требуется
numpy.
По наивности я думал, что достаточно импортировать
numpy в главном модуле до импорта дочерних, и он туда как-бы подтянется. Понятно, я ошибался, и теперь импорт прописан в каждом модуле.
Но нельзя ли все же это сделать как-то экономнее?

Допустим, что это работало бы как вы предположили выше. А теперь представим себе, что вы пишите другую программу, где вы не используете numpy, но используете модуль func_1. Вы делаете импорт func_1 в главном модуле, запускаете main, и получаете ругань на непонимание что такое numpy. "Но постойте! Какой numpy? В главном модуле никакой numpy не используется, зачем я должен его импортировать?" - подумаете вы. И окажетесь правы. Вот почему всё необходимое для модуля должно импортироваться в самом модуле. Чтобы модуль был самодостаточен.


Как убедить PyCharm не ругаться на мой метод?
У меня в программе есть метод:

    def import_config(self, flag=None):
        """Функция 'посредник', между GUI и 'config_generate', работает в двух режимах, в зависимости от передаваемого
        флага. В режиме импорта забирает словарь, сгенерированный 'config_generate' и заполняет 'lineEdit's напротив
        'label's. А в режиме экспорта считывает с 'lineEdit's данные, формирует из них словарь и отдает его в
        'config_generate'."""

        dict_imp = config_generate()

        list_of_lines = sorted([x for x in dir(ui) if "lineEdit" in x], key=lambda x: int(x.split("_")[-1]))
        list_of_labels = sorted([x for x in dir(ui) if "label" in x], key=lambda x: int(x.split("_")[-1]))
        list_of_labels.remove('label_2')

        lst_eval_labels = list(eval("(self." + ", self.".join(list_of_labels) + ")"))
        lst_eval_lines = list(eval("(self." + ", self.".join(list_of_lines) + ")"))

        if flag != 'export':
            for x in range(0, 49):
                lst_eval_lines[x].setText(dict_imp[lst_eval_labels[x].text().rstrip()])
        else:
            values = []
            text_of_labels = []
            for x in range(len(lst_eval_labels)):
                text_of_labels.append(lst_eval_labels[x].text().rstrip())
            for x in lst_eval_lines:
                values.append(x.text())
            config_generate(dict(zip(text_of_labels, values)))

Ему не нравится, что это метод, а не функция:
"Method 'import_config' may be 'static'". Либо же он предлагает сделать его статическим. Если вы знакомы с методом
eval(), то вы сразу поймете в чем тут загвоздка. Я не могу пойти не на первый вариант, не на второй. Может быть у вас есть мысли, как решить проблему?

ругается PyCharm в данном примере из-за того, что функция является методом, но не использует преимуществ метода. другими словами ключевое слово
self нигде не используется. если хотите, вы можете выключить этот
warning. наведите курсор на имя функции и нажмите
Alt +
Enter, в всплывающем окне будут варианты решения вопроса, где один из них будет
Disable Inspection.


Как записать данные через Python в бд? [закрыт]

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

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

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

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

Возникла  проблема с записью данных.
Например, я хочу реализовать запись количество действий (для телеграм-бота).
По умолчанию для каждого пользователя значение равняется нулю, но я не знаю как прибавить к этому числу 1.
Гайды читал, как подключать бд знаю, нужен только алгоритм  счёта и записи в столбец для определенного id.
Использую библиотеку sqlite3

<code>
import sqlite3

with sqlite3.connect('example.db') as con:
    cur = con.cursor()
    cur.execute('UPDATE yourtable SET n = n + 1 WHERE id = ?', (user_id,))
</code>

Вместо example.db вставляете ваш файл с БД sqlite.
Вместо yourtable название нужной таблицы
В переменной user_id должен быть нужный id
Вместо n название столбца, в котором хранится количество.


Можно ли нажать 3 клавишу сразу в pyautogui?
и так, мне нужно нажать Ctrl + shift + n одновременно, но как я заю, в pyautogui можно нажать только 2 раза
pyautogui.hotkey('клавиша1', 'клавиша2')
но как мне нажать 3 клавишы?

<code>
pyautogui.hotkey('ctrl', 'shift', 'n')
</code>
В документации как раз пример на 3 клавиши и приведён.


текст не влезает в кнопки и в меню команд python aiogram
У меня есть бот для телеграмма на aiogram, в боте есть кнопки и меню команд, но текст, который я использую не влезает и сокращается. При чем на iphone текст не сокращается, а переносится, а на android обрезается. Как это можно исправить?

resize_keyboard = True - задано при вызове
ReplyKeyboardMarkup.


Как в ВК api нажать на одну из кнопок данной клавиатуры программно?
Как с помощью python зафиксировать event клавиатуры от условного сообщества и отправить нажатие на одну из кнопок клавиатуры?
Мне нужно именно отправить нажатие на кнопку, ибо отправить просто текст кнопки не решает проблему.

В
API ВКонтакте нет понятия "нажатие на кнопку", как и событий клавиатуры. Вся функциональность клавиатур реализуется непосредственно через сообщения (поэтому, кстати, нельзя воспользоваться клавиатурой без отправки сообщения).
Если более конкретно — то всё реализуется через метод
messages.send. Клавиатура прикладывается к нему в виде объекта JSON.
Когда пользователь нажимает одну из кнопок клавиатуры, отправляется сообщение с текстом из параметра
label. Если установлен параметр
payload, он также прикрепляется к сообщению.
На сервере есть только 2 способа узнать о нажатии кнопки — проверить либо
text, либо
payload. Если Вы говорите, что отправка текста не решает проблему, то Вам нужно приложить к сообщению
payload. Узнать его можете из сообщения, к которому прикладывалась клавиатура


Импорт модуля, который импортирует другие модули
Есть модуль
main.py:

try:
    from importer import Importer
    Importer._import_modules()

except ImportError:
    raise ImportError('Please reinstall module')

class Module(OtherModule):

    def __init__(self):
        super(Module, self).__init__()
        self.__version = settings.__version__
        self.debug = settings.DEBUG
        self.__author = settings.__author__
        self.settings = {
            "author": self.__author,
            "version": self.__version,
            "debug": self.debug
        }

    self.debug_text = {}

есть модуль
importer.py:

class Importer:
    @staticmethod
        def _import_modules():
            try:
                import pymysql
                from rich import print
                from rich.console import Console
                from rich.table import Table
                from rich.text import Text
                from prettytable import PrettyTable

            except ImportError:
                raise ImportError("Please install required modules.")

            try:
                import settings
                from somemodule import SomeClass
            except ImportError:
                raise ImportError('Please reinstall module')

            try:
                import sqlite3
            except ImportError:
                raise ImportError("Standard modules could not be imported")

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

Вам не нужно выносить импорты в отдельный файл, это плохая практика. Импортируйте всё, что нужно, в начале модуля

Но если интересно, то Ваш код не работает, потому что импорты производятся в теле функции, т.е. в локальной области видимости. Вы не можете получить к ним доступ ни через объект модуля, ни через класс, ни через функцию — по аналогии с объявлением локальной переменной.
Решением может быть вынос импортов в глобальную область видимости модуля:

import sqlite3

from importer import *
sqlite3

Ещё можно сделать импортируемый модуль статическим методом класса:

class Importer:
    import sqlite3
    sqlite3 = staticmethod(sqlite3)

from importer import Importer
Importer.sqlite3


Оптимизировать решение на python
Всем здравствуйте,решаю задачи на Python.Хочу максимально улучшить свои навыки, сама задача внизу и мое решение. Пожалуйста помогите улучшить мой код:
Напишите функцию
convert(L), принимающую на вход список, состоящий из чисел и строк вида:

[1, 2, '3', '4', '5', 6]

и возвращающую список целых чисел (в том же порядке):

[1, 2, 3, 4, 5, 6]

def convert(L):
    a = L
    for i in range(len(a)):
        if type(a[i]) == str:
            a[i] = int(a[i])
    return a

Ваше решение можно оптимизировать с использованием встроенной функции
map() и
list()

def convert(L):
    return list(map(int, L))


Python fuzzywuzzy поиск по словарю
подскажите как реализовать поиск по ключам в словаре но выдавать в результате значение словаря, использя fuzzywuzzy. У библиотеки есть метод process, ищущий совпадения в списке. Но он не работает со словарем. Есть код выводящий самый подходящий результат, но мне нужны все возможные результаты чтобы выбрать самые подходящие по score.
Любая подсказка будет полезна, благодарю!
<code>
from fuzzywuzzy import fuzz

information_code = {
'ярлык приложение смарт теминал': 'После установки приложения в личном кабинете ярлык отобразится на экране в зависимости от функционала.\
Подробную информацию вы можете посмотреть в описании приложения.',
'выгрузка данных приложение': 'Выгрузка данных из приложения обычно происходит автоматически раз в час.',
'терминал ккт регистрация': 'Чтобы зарегестрировать ККТ необходимо нажать на терминал....'
}

user_input_information = 'терминал'
close_match = max(information_code, key=lambda x: fuzz.token_ratio(x, user_input_information))

#print(close_match)
print(information_code[close_match])
</code>

from fuzzywuzzy import fuzz
from functools import partial

data_dict = {
    'ярлык приложение смарт теминал': 'После установки приложения в личном кабинете ярлык отобразится на экране в '
                                      'зависимости от функционала. Подробную информацию вы можете посмотреть в '
                                      'описании приложения.',
    'выгрузка данных приложение': 'Выгрузка данных из приложения обычно происходит автоматически раз в час.',
    'терминал ккт регистрация': 'Чтобы зарегестрировать ККТ необходимо нажать на терминал....'
}
input_str = 'терминал'

f = partial(fuzz.partial_ratio, input_str)

for k in data_dict:
    print(data_dict[k], f(k))

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

После установки приложения в личном кабинете ярлык отобразится на экране в зависимости от функционала. Подробную информацию вы можете посмотреть в описании приложения. 93
Выгрузка данных из приложения обычно происходит автоматически раз в час. 31
Чтобы зарегестрировать ККТ необходимо нажать на терминал.... 100


Как столбец датафрейма из формата строки со временем ('hh:mm:ss') привести к типу целых чисел (например все перевести в минуты или секунды) на Python
Столкнулся со следующей проблемой:
Мне нужно написать функцию, которая принимает на вход 3 значения: table(датафрейм, состоящий из 7 столбцов, одним из которых является столбец 'time', в котором записаны данные типа object, по факту это строка вида 'hh:mm:ss'), time1 (строка вида 'hh:mm'), time2(строка вида 'hh:mm'). Функция должна вернуть датафрейм, который получится из исходного путем сортировки по столбцу 'time'. Это означает что в новом датафрейме будут только те строки, в которых значения столбца 'time' удовлетворяют следующему условию: time1 <= time <= time2. Как привести данные time1, time, time2 к единому виду, чтобы фильтрацию можно было сделать с помощью логической индексации? Я понимаю каким образом можно перевести в минуты time1 и time2, но совсем не могу понять как быть со столбцом time (секунды можно отбросить и перевести все в минуты). Данную задачу скорее всего можно решить средствами обычного Python и модуля pandas, тк никаких особых модулей для работы со временем предварительно не изучалось.

Строковые значения вида
hh:mm:ss можно привести к типу данных
timedelta и после этого получить общее число секунд:

df["seconds"] = pd.to_timedelta(df["time"]).dt.total_seconds()


Вроде код работает но е олимп не хочет его полностью принимать
Нужно чтобы при вводе натурального числа (факториального (например 120)) выводился факториал этого числа (то есть !5 в данном случае)
Входные данные: только факториальные числа, значение n! (1 ≤ n ≤ 2000). Ссылка на задачу.
Помогите пожалуйста!
<code>
n = int(input())
f = 0
i = 1
while n % i == 0:
    f += 1
    n /= i
    i += 1
print(f)
</code>

У вас в общем-то всё верно. За исключением одного нюанса - надо использовать целочисленное деление
//. Т.е. написать
n //= i.
Ну и можно использовать всего одну переменную для счётчика. Т.к.
f у вас в любой момент времени равен
i-1.


не работают slash команды discord.py
Я хочу добавить в своего бота слешкоманды, но бот не работает. Подскажите, пожалуйста, что надо исправить?

import discord
from discord.ext import commands
from discord_slash import SlashCommand
from config import settings

Bot = commands.Bot(command_prefix="!")
slash = SlashCommand(Bot, sync_commands=True)

@slash.slash(description="Проверка бота")
async def ping(ctx):
    ping = Bot.ws.latency
    emb = discord.Embed(description="Ща сек...", colour=discord.Color.orange())
    msg = await ctx.send(embed=emb)
    emb = discord.Embed(description=f'Pong! `{ping * 1000:.0f}ms` :ping_pong:', colour=discord.Color.orange())
    await msg.edit(embed=emb)
    print(f'[Logs] На данный момент пинг == {ping * 1000:.0f}ms | ping')

Bot.run(settings['token'])

Ошибка:

discord.ext.commands.errors.CommandNotFound: Command "ping" is not found

Другой код, выполняющий эту же функцию выдает такую ошибку:

discord.errors.Forbidden: 403 Forbidden (error code: 50001): Missing Access

Сам код:

import discord
from discord.ext import commands
from discord_slash import SlashCommand
from discord_slash.utils.manage_commands import create_option
from config import settings

Bot = commands.Bot(command_prefix="!")
slash = SlashCommand(Bot, sync_commands=True)

@slash.slash(name='hi', description='hi', options=[{"name": "member", "description": "Бот поприветствует вас", "type": 6, "required": True}], guild_ids=[761950725508956160])
@Bot.command(aliase=['hi'])
async def hi(ctx, member: discord.Member = None):
    await ctx.send(f'Передаю привет {member.nick}!')

Bot.run(settings['token'])

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


Django. Получение данных из Queryset
Есть книга рецептов, в которой перечислены компоненты рецепта и их процентное соотношение.
Нужен функционал в виде формы, в которую пользователь вводи число - размер партии, и на выходе получает рецепт на заданный размер партии.
models.py

class Recipe(models.Model):
    recipe_name = models.CharField(max_length=200, verbose_name='Название рецепта')
    mass = models.FloatField(default=0, verbose_name='Общая масса')
    category = models.ForeignKey(Category, on_delete=models.CASCADE, default=0)

    def save(self, *args, **kwargs):
        ings = self.ingredient_set.all()
        for ing in ings:
            ing.concentration = ing.mass / self.mass
            ing.save()
        return super(Recipe, self).save(*args, **kwargs)

    def __str__(self):
        return self.recipe_name

class Ingredient(models.Model):
    recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name="ingredient_set")
    ingredient = models.CharField('Ингредиент',max_length=200)
    mass = models.FloatField('Масса', default=0)
    concentration = models.FloatField('Концентрация',default=-1)

    def __str__(self):
        return self.ingredient

    def save(self, *args, **kwargs):
        if not self.pk:
            self.recipe.mass += self.mass
            self.recipe.save()
        else:
            prev_mass = Ingredient.objects.get(pk=self.pk).mass
            if prev_mass != self.mass:
                self.recipe.mass += self.mass - prev_mass
                self.recipe.save()
        self.concentration = (self.mass / self.recipe.mass) * 100

        return super(Ingredient, self).save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        self.recipe.mass -= self.mass
        self.recipe.save()
        return super(Ingredient, self).delete(*args, **kwargs)

views.py

def batch(request, pk):
    recipe_id = Recipe.objects.get(pk=pk)
    recipe = recipe_id.ingredient_set.values()
    batch_size = request.POST.get('batch_size')
    if request.method == 'POST':
        form = RecipeBatchForm(request.POST)
        if form.is_valid():

                batch = recipe.ingredient.concentration/100*batch_size

        return batch
    else:
        form = RecipeBatchForm()

    return render(request, 'recipes/recipe_batch.html', {'form': form, 'batch': batch, 'batch_size': batch_size, 'recipe_id': recipe_id})

Выдает ошибку
'QuerySet' object has no attribute 'ingredient', хотя в local vars в
recipe все нужные мне данные есть -
<QuerySet [{'id': 11, 'recipe_id': 2, 'ingredient': 'Вода', 'mass': 37.8, 'concentration': 81.203007518797}, и так же для остальных компонентов.
Как правильно рассчитать
batch и вывести его в шаблоне?

В вашем случае, переменная
recipe это список объектов. И вы пытаетесь у этого списка вызвать метод
ingredient. В примере ингредиент один у рецепта - вода. Но ведь это связь один ко многим и ингредиентов может быть много. Соответственно, вам надо рассчитать размер порции для каждого из них.

У вас неудачные названия переменных. В
recipe_id у вас никакой не id, а целый
Recipe. В
recipe у вас не
Recipe, а список словарей из полей ингредиентов. В объекте
Ingredient есть поле
ingredient, хотя граздо лучше было бы назвать его
name, чтобы не вносить путаницу.

Нет необходимости брать только values от игредиентов.

В общем, примерно так

def batch(request, pk):
    recipe = Recipe.objects.get(pk=pk) # Получаем объект рецепта

    # Перебираем ингредиенты и считаем размер порции для каждого
    batches = []
    for ingredient in recipe.ingredient_set.all():
        batch = ingredient.concentration / 100 * batch_size
        batches.append({ingredient.id: batch})

Пример условный, т.к. не знаю точно ваших задач.


Как сделать autosave
У меня есть скрипт
<code>
import random

name = f'T{random.randint(1, 9)}kEn'
famil = f'L{random.randint(1, 9)}{random.randint(1, 9)}kEnGG{random.randint(1, 9)}D'
mail = f'CrushALT-{random.randint(1,999999999999999)}'
pols = f'CrushALT-{random.randint(10,99)}'

with open('accounts.txt', 'w') as ac:
    ac.write(f'Account: {pols}'
             f'\nMail: {mail}'
             f'\n\n\n')
</code>
он записывает переменные туда, но при повторном запуске он перезаписывает это, а мне нужно чтобы он при повторном запуске он не перезаписывал, а добавлял ниже

<code>
with open('accounts.txt', 'a') as ac:
    ac.write(f'Account: {pols}',
             f'\nMail: {mail}',
             f'\n\n\n')
</code>
Этот код при каждой записи будет не перезаписывать, а добавлять ниже.


Как сделать зацикливание pyautogui
Мне нужно рандомно от 1 до 27 нажать pyautogui.press('left')
я попробовал это сделать так

for i in range[random.randint(1,27)]:
    pyautogui.press('left')

но выдаёт ошибку

'type' object is not subscriptable

for i in range(random.randint(1, 27)):
    pyautogui.press('left')


Как устранить ошибку? "map" object is not subscriptable
Пользователь вводит последовательность из чисел, нужно определить, является последовательность монотонно возрастающей или убывающей(в т.ч. и нестрого) и вывести "Да" или "Нет".
При запуске программы выдает

'map' object is not subscriptable.

Что нужно исправить, чтобы заработало?
<code>
a = map(int, input().split(" "))
prev = a[0]
flag = True
for i in a[1:]:
    if prev <= i:
        prev = i
    else:
        flag = False
        break
if flag: print("Yes")
else: print("No")
</code>

Что такое
map?
Это функция, которая применит первый аргумент (функцию) к каждому элементу второго аргумента (коллекции), но в python3 это не происходит сразу, как в python2, где
map возвращает список:

>>> map(int, "12345")
[1, 2, 3, 4, 5]

А постепенно, т.к.
map возвращает итератор "map object":

>>> map(int, "12345")
<map object at 0x000001D51030BB50>

И как все итераторы, мы можем итерировать по
map с помощью
next:

>>> m = map(int, "12345")
>>> next(m)
1
>>> next(m)
2
>>> next(m)
3
>>> next(m)
4
>>> next(m)
5
>>> next(m)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

Или же с помощь.
for цикла:

>>> for i in map(int, "12345"):
...     print(i)
...
1
2
3
4
5

В чём проблема?
Вы пытаетесь получить первый элемент итератора, но т.к. у итератор нет элементов, он создаёт их "на лету", то и питон на это жалуется:

>>> map(int, "12345")[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'map' object is not subscriptable

Что же вы хотите сделать - превратить
map в коллекцию, например
list, тогда и по индексу можно будет обращаться:

>>> result = list(map(int, "12345"))
>>> result[0]
1
>>> for i in result[1:]:
...     print(i)
...
2
3
4
5

Альтернатива
В питоне также есть
comprehensions - это способ инициализировать что-то, в нашем случае список:

>>> [int(i) for i in "12345"]
[1, 2, 3, 4, 5]

Здесь используется
for цикл, чтобы создавать значения, а значение
int(i) уже записывается в конечный список.
Хитрость
Вы использовали
flag, чтобы проверить, вышли ли вы из цикла с помощью
break, но в питоне есть специальный синтаксис для этого -
for .. else ..:

>>> for i in 1, 2, 3:
...     if i == 2:
...             print("нашёл")
...             break
... else:
...     print("не нашёл")
...
нашёл

Если мы выходим из цикла через
break, то
else будет проигнорирован

>>> for i in 1, 3:
...     if i == 2:
...             print("нашёл")
...             break
... else:
...     print("не нашёл")
...
не нашёл

А если не выйдем, то выполнится.
Итог
Если мы применим наши новые знания, то получим:

a = [int(i) for i in input().split(" ")]

prev = a[0]

for i in a[1:]:
    if prev <= i:
        prev = i
    else:
        print("No")
        break
else:
    print("Yes")

или

a = list(map(int, input().split(" ")))

prev = a[0]

for i in a[1:]:
    if prev <= i:
        prev = i
    else:
        print("No")
        break
else:
    print("Yes")

в зависимости от того, что вы предпочитаете,
map или
comprehension.
(как по мне,
comprehensions намного более интуитивные :] )


Обновление вложенного словаря
Есть
dict, например:

{'a': {'b': {'c': {'d': 1}}, 'e': 'ref:a.b.c'}}

ключ
e - это путь (ключей словаря) для замены на значение из этого же словаря.
В итоге должен получиться словарь:

{'a': {'b': {'c': {'d': 1}}, 'e': {'d': 1}}}

Есть ли встроенные модули для решения такой задачи или как создать функцию (или метод), который изменяет переданный словарь или возвращает новый?

Если делать нечто более-менее универсальное, то предлагаю для определения ссылки завести отдельный класс для более наглядного хранения и лёгкого обнаружения. Тогда требуемый функционал можно реализовать как-то так:

class Ref:
    def __init__(self, path):
        if isinstance(path, list):
            self.path = '.'.join(path)
        else:
            self.path = path
    def get_path(self):
        return self.path

def dict_get_by_path(d:dict, key:str, default=None):
    def get_one_level(d, key_list, level=0):
        if level < len(key_list)-1:
            return get_one_level(d[key_list[level]], key_list, level+1)
        elif level == len(key_list)-1:
            return d[key_list[level]]
        raise IndexError

    try:
        return get_one_level(d, key.split('.'))
    except KeyError:
        return default

def replace_refs(d, sub_d=None):
    if sub_d is None: sub_d = d
    for k,v in sub_d.items():
        if isinstance(v, dict):
            replace_refs(d, v)
        elif isinstance(v, Ref):
            sub_d[k] = dict_get_by_path(d, v.get_path())

d = {'a': {'b': {'c': {'d': 1}}, 'e': Ref('a.b.c')}}
replace_refs(d)
print(d)

Где
dict_get_by_path() - функция, которая достает значение из словаря по пути вида
"a.b.c". А
replace_refs() рекурсивно проходит по всем элементам словаря и при обнаружении ссылок
Ref заменяет их на значения по ссылкам.
Если очень хочется без отдельного класса, то вместо

        elif isinstance(v, Ref):
            sub_d[k] = dict_get_by_path(d, v.get_path())

можно написать

        elif isinstance(v, str) and v.startswith('ref:'):
            sub_d[k] = dict_get_by_path(d, v[4:])


Как заменить точку на пробел? [закрыт]

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

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

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

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

Задача век и год, вводится год, программа должна вывести век и год через пробел.
<code>
a = int(input())

print((a/100) if(a%100==1) else(a/100+1))
</code>

У вас ошибка: при целочисленном делении должен получаться ноль, тогда век будет считаться правильно.
<code>
a = int(input())
if a%100==0:
    print(int(a/100), "00")
else:
    print(int(a//100 +1), a%100)
</code>


Как решить эту простую задачу? [закрыт]

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

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

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

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

Не до конца понимаю принцип работы этих циклов. Что нужно вставить в пустые места для правильной работы программы?
<code>
def square(n):
    return n*n

def sum_squares(x):
    sum = 0
    for n in ___:
        sum += __
    return __

print(sum_squares(10)) # Должно выводить 285
</code>

Ваш код реализует алгоритм получения суммы квадратов чисел в промежутке от 0 до 9.

Не называйте переменные именами объектов, так как имена зарезервированы питоном.

Если вы не знаете принцип работы циклов, то переходить к принципу работы функций не стоит, так как это базовые знания.

for n in ___: здесь вы должны подставить число, по которому будет происходить итерация, то есть напишите так:
for i in range(x), где
x - аргумент функции
sum_squares

Здесь
sum += __ вы должны вызвать функцию для сложения квадратов чисел
n:
sum_x += square(n), где
sum_x -
sum.

return sum_x возвращаем результат функции.

Полный код:

def square(n):
    return n*n

def sum_squares(x):
    sum_x = 0
    for n in range(x):
        sum_x += square(n)
    return sum_x

print(sum_squares(10)) # Должно выводить 285


Какими способами можно решить капчу на mail.ru [закрыт]

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

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

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

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

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

Попробуй Capmonster, XEvil, там есть тестовые периоды


Счетчик с конца строки в python
У меня есть строковая переменная, в которой содержится число 15, позже 200,  1029
Также есть другая переменная, с названием
result = '00000'

aa = '15'
result = '00000'

Как сделать так, чтобы значения 'аа' подставлялись в конец
result, примеры:

aa = '15'
result = '00015'

aa = '200'
result = '00200'

Итак дальше, ещё раз повторюсь необходимо добавлять значения с конца, нужен как можно меньше код

Самая короткая запись алгоритма решения:

aa = '200'
result = '00000'
print(aa.zfill(len(result)))

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

00200