Как посчитать кол-во определённых букв в слове, сгенерированным циклом - Python
Всем привет. Несколько дней ломаю себе голову и никак не могу найти решение поставленной задачи. Может кто-то подскажет или даст нужное направление?
В общем, суть задачи такова: нужно найти кол-во слов, в которых встречаются три буквы "А".
Ещё у нас на руках имеются следующие данные:
1. 5 букв [A, B, C, D, E];
2. Цикл, который перебирает вышеуказанные символы и генерирует из них новые слова;
3. А так же знаем, что сами слова, должны состоять из 8 символов.
Цикл я написал, там всё понятно, а вот как проверить сгенерированные циклом слова на наличие 3-х букв "А" - не понимаю (именно трёх, а не 4 и выше, т.к. первое сгенерированное слово имеет 8 букв "А", а по условию задачи, нужно найти слова, в которых их будет только 3 и не более).
Мой код (да, он может и не идеальный, но рабочий, учусь, так сказать):
<code>
## Мой словарь символов
symbols = ["A", "B", "C", "D", "E"]
## Мои строковые переменные
one = str()
two = str()
three = str()
four = str()
five = str()
six = str()
seven = str()
eight = str()
all_num = str()
## Мои численные переменные
count = 0
## Ещё одини строковые перемнные, но статичные, т.е. неизменяемые
one_str = str("Номер комбинации символов:")
two_str = str("комбинация символов:")
## Перебираем символы из словаря и присваиваем переменной "one"
for one in symbols:
    ## Перебираем символы из словаря и присваиваем переменной "two"
    for two in symbols:
        ## Перебираем символы из словаря и присваиваем переменной "three"
        for three in symbols:
            ## Перебираем символы из словаря и присваиваем переменной "four"
            for four in symbols:
                ## Перебираем символы из словаря и присваиваем переменной "five"
                for five in symbols:
                    ## Перебираем символы из словаря и присваиваем переменной "six"
                    for six in symbols:
                        ## Перебираем символы из словаря и присваиваем переменной "seven"
                        for seven in symbols:
                            ## Перебираем символы из словаря и присваиваем переменной "eight"
                            for eight in symbols:
                                ## Наш счётчик
                                count += 1
                                ## Наша основаная переменная, в которую мы передаём и, условно говоря, складываем, перебранные циклами значения
                                all_num = one + two + three + four + five + six + seven + eight
                                ## Выводим результат(-ы)
                                print(one_str, count, two_str, all_num)
</code>
Заранее благодарю за ответ, наводку или доработанный код. И, пожалуйста, можно с объяснить что к чему, всё-таки эта задача меня извела хорошо.

не понял, вам нужно это что-ли?

words = ['mama', 'papa', 'ararat', 'banana']

res = sum(word.count('a') == 3 for word in words)

print(res) # выведет 2 - 2 слова с 3 буками 'а'

Вообще если делать многосрочный код, то:

res = 0

for word in words: # перебираем все слова из списка
    if word.count('a') == 3: # с помощью метода 'count()' определяем сколько букв 'a' встречается в анализируемом слове
        res += 1 # увеличиваем счетчик слов у которых 3 буквы 'a' на 1

В короткой однострочной записи формируется список содержащий столько же элементов, сколько в списке со словами, где каждому слову ставится в соответствие
True или
False в зависимости от того, содержится ли в слове 3 буквы 'a' или нет. А затем вычисляется сумма всех элементов нового списка, поскольку
True интерпретируется при сложении как
1, а
False как
0, то в результате вычисления суммы получается кол-во слов у которых 3 буквы 'a'
Аналогично работает и код

res = sum(1 for word in words if word.count('a') == 3)

только тут формируется список содержащий 1 для каждого слова из списка
words в котором было 3 буквы 'a'


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

one two one tho three

Результат

0 0 1 0 0

Я написала код, всячески проверила его, даже на очень большом случайном массиве данных. Все работает, считается быстро. Однако, при загрузке его в тестирующую систему, они мне его не засчитывают за решение, выдают ошибку "Превышен лимит времени".
Ниже выкладываю свой код. Пожалуйста, подскажите, какой его кусок и как можно оптимизировать, чтобы увеличить быстродействие:

string = str(input())
z1 = []
string.split()
new_string = ' '.join(string.split())
new_string1 = new_string.replace('\\', ' ')
workingList = list(new_string1.split())
def cntsubs(x, List):
    if x in List:
        return List.count(x)
    else:
        return '0'

for a in range(0, len(workingList)):
    a = workingList[-1]
    workingList.pop()
    x = str(cntsubs(a, workingList))
    z1.append(x)
print(*z1[::-1])

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

string = "one two one tho three"

words = string.split()
counts = dict()

for word in words:
    if word != []: # не анализируем слова нулевого размера (могли появиться если между словами было больше одного пробела
        count = counts.get(word, 0) # получаем счетчик для текущего слова, если в словаре не было такой записи, то получаем 0
        print(count, end=' ')
        counts[word] = count + 1 # увеличиваем счётчик для текущего слова

ну или так, если будет сравниваться строка:

words = string.split()
counts = dict()
res = []

for word in words:
    if word != []:
        count = counts.get(word, 0)
        res.append(count)
        counts[word] = count + 1

print(*res)

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

не надо переводить выход
input() в строку -
input() и так всегда возвращает строку

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

например:

string = "one two one \ntho;three"

string_updated = ''.join(i if i.isalpha() else ' ' for i in string)

print(string_updated)


Работа веб-камеры в opencv python
Вот код:
<code>
import cv2

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FPS, 24) # Частота кадров
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 600) # Ширина кадров в видеопотоке.
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # Высота кадров в видеопотоке.

while True:
    ret, img = cap.read()
    cv2.imshow("camera", img)
    if cv2.waitKey(10) == 27: # Клавиша Esc
        break

cap.release()
cv2.destroyAllWindows()
</code>
У меня самая простая вебка, подключена через usb, в других приложениях показывает  изображение, вообщем всё хорошо работает. Когда запускаю код, программа ничего не выводит в терминале, даже не создается окно под названием "camera". Подскажите, что почему не выводит изображение вебки?

Попробуй поменять цифры в строчке
cap = cv2.VideoCapture(0).Возможно у тебя вебка весит на
cap = cv2.VideoCapture(1) и так далее.


ValueError: dictionary update sequence element #0 has length 1; 2 is required
<code>
from docxtpl import DocxTemplate

doc = DocxTemplate("template.docx")
context = { 'name' :name, 'surname':surname, 'adress':adress,'phonenumber':phonenumber,'marital_status':marital_status,'Date_of_birth':Date_of_birth,'Objective':Objective,'education':education,'qualifications':qualifications,'work_exp':work_exp,'personal_qualities':personal_qualities, 'e_mail':e_mail }
doc.render("context")
doc.save("C:\scripts\CV.docx")
</code>
При попытке запуска выдаёт ошибку:

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

замените:

doc.render("context")

на

doc.render(context)

вы передаете строковой литерал (строку:
"context"), вместо ожидаемого словаря.

Причина возникновения данной ошибки: скорее всего в функции
doc.render() происходит попытка объединить другой словарь со словарем, переданным в качестве первого аргумента.
Воспроизведение ошибки:

d = {"a": 1}
d.update("context")

выдает:

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


Добавление в словарь Python
Есть фрагмент кода который перебирает текст посимвольно и подсчитывает сколько раз встретилось слово и добавляет +1 в словарь
<code>
word = ""
dic = {}
for c in file:
    if c not in punctuations:
        if word not in uninteresting_words:
            if c == " ":
                dic[word] += 1
                word = ""
                continue
            word += c
print(word)
</code>
Выходит ошибка: KeyError

ну так вы до конца дочитайте ошибку
в приведённом вами коде не определены переменные
punctuations и
uninteresting_words
кроме того (скорее всего указанные выше переменные у вас все таки определены) ошибка у вас вот тут

dic[word] += 1

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

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

касательно логики работы программы, то тоже всё не слава Богу - вот алгоритмические ошибки:

алгоритм не распознает вот такие конструкции
"word1,word2"

ваши символы пунктуации тоже должны служить разделителями слов

алгоритм неправильно обрабатывает вот такие конструкции
"word1 word2"

последнее слово, если за ним не идет разделитель не будет подсчитано

вы работает с какими-то "неинтересными словами", но алгоритм использует это при проверке каждого символа, а не выделенного слова, поэтому если первое слово было неинтересным, то дальше алгоритм не выделит НИ ОДНОГО слова больше

По идее ваш код должен был бы выглядеть так:

file = "word1,word2 word3"

punctuations = [' ', ',']
uninteresting_words = [''] # чтобы не делать дополнительную проверку на пустое слово (возникает если несколько разделителей один за другим)

word = ""
dic = {}

for i in range(len(file)):
    if file[i] not in punctuations:
        word += file[i]

    if file[i] in punctuations or i == len(file) - 1:
        if word not in uninteresting_words:
            dic[word] = dic.get(word, 0) + 1
        word = ""

print(dic)


Функция не сохраняет в базу данных изменения (sqlite3) в colab Python в проекте Flask
Писал проект изначально в Visual Studio 2019. После тестирования и полной работоспособности, решил продемонстрировать его знакомым, но я так с ngrok не разобрался и кроме меня на сайт зайти никто не смог, тогда решил перенести свой проект в colab там с ngrok проблем у меня не было. После переноса начал тестировать сайт и понял что функция отвечающая за получения данных и commit() не работает, точнее она работает на половину, Одна функция вытаскивает данные при обращении, но вторая функция которая загружает туда данные почему то не работает, я пробовал написать отдельную функцию для commit() но это тоже не произвело никакого результата. Ошибки не выдаёт.
<code>
def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = sqlite3.connect(DATABASE)
    return db

# Функция - запрос в БД. В случае необходимости, может закомитить информацию
def query_db(query, args=(), one=False, commit=False):
    cur = get_db().execute(query, args)
    rv = cur.fetchall()
    cur.close()
    if commit:
        get_db().commit()
    return (rv[0] if rv else None) if one else rv

# Создаёт короткую ссылку, пытается вставить в БД, при возникновении ошибки,
# вызванной повторным ключом, перезапускается
def generate_short_link(long_link):
    while True:
        try:
            short_link = "".join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for x in
                                 range(random.randrange(5, 8)))
            query_db('INSERT INTO links(local_addres,real_addres) VALUES (?, ?)', args=(short_link, long_link),
                     commit=True)
            return short_link
        except:
            pass
</code>

Вы закрываете объект до того как делаете commit:

cur = get_db().execute(query, args)
rv = cur.fetchall()
cur.close()
if commit:
    get_db().commit()

А следует сначала делать commit и только потом закрывать объект:

cur = get_db().execute(query, args)
rv = cur.fetchall()
if commit:
    get_db().commit()
cur.close()

И еще момент, все же commit необходимо выносить в отдельную функцию, так как там своя логика работы. Одно действие - одна функция.


Как стирать по одному символу (цифре)
У меня есть кнопка очистки калькулятора, а есть кнопка (
Clear_2), которая должна очищать по одному символу (цифре).
Как мне это сделать в методе
def clear_symbol(self)?

    def add_functions(self):
        self.Zero.clicked.connect(lambda: self.write_number(self.Zero.text()))
        self.One.clicked.connect(lambda: self.write_number(self.One.text()))
        self.Two.clicked.connect(lambda: self.write_number(self.Two.text()))
        self.Three.clicked.connect(lambda: self.write_number(self.Three.text()))
        self.Four.clicked.connect(lambda: self.write_number(self.Four.text()))
        self.Five.clicked.connect(lambda: self.write_number(self.Five.text()))
        self.Six.clicked.connect(lambda: self.write_number(self.Six.text()))
        self.Seven.clicked.connect(lambda: self.write_number(self.Seven.text()))
        self.Eight.clicked.connect(lambda: self.write_number(self.Eight.text()))
        self.Nine.clicked.connect(lambda: self.write_number(self.Nine.text()))
        self.Plus.clicked.connect(lambda: self.write_number(self.Plus.text()))
        self.Minus.clicked.connect(lambda: self.write_number(self.Minus.text()))
        self.Divide.clicked.connect(lambda: self.write_number(self.Divide.text()))
        self.Multiply.clicked.connect(lambda: self.write_number(self.Multiply.text()))
        self.Dot.clicked.connect(lambda: self.write_number(self.Dot.text()))
        self.BracketLeft.clicked.connect(lambda: self.write_number(self.BracketLeft.text()))
        self.BracketRight.clicked.connect(lambda: self.write_number(self.BracketRight.text()))
        self.Equal.clicked.connect(lambda: self.result())
        self.Clear.clicked.connect(lambda: self.clear_result())
        self.Clear_2.clicked.connect(lambda: self.clear_symbol())

    def write_number(self, number):
        if self.label.text() == '0':
            self.label.setText(number)
        else:
            self.label.setText(self.label.text() + number)

    def result(self):
        if not self.label.text():
            return
        res = eval(self.label.text())
        self.label.setText(str(round(res, 6)))

    def clear_result(self):
        self.label.setText("")

    def clear_symbol(self):
        self.label.setText

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Брать текущий текст
txt, и сразу же выводить
txt[:-1].

...

    def clear_symbol(self):
        self.label.setText(self.label.text()[:-1])
...


Почему значение в списке не пропадает?
<code>
a = list(str(input("Text: ")))
b = list(str(input("Text2: ")))

counter = 0
for i in a:
    if a[counter] == b[counter]:
        new_gen = list(a[counter])
        counter += 1
    else:
        counter += 1
        continue
    print(new_gen)
</code>
Я думал что список в который записываются новые значения в цикле перезаписываются, тем самым накопить элементы невозможно.

вы присваиваете переменной 1 символ

new_gen = list(a[counter])

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

new_gen += list(a[counter])

или

new_gen += [a[counter]]

или

new_gen.append(a[counter])

Кстати в вашем коде очень много лишнего -

ненужный счетчик
counter, когда можно пройтись по позиции
ненужный
continue, там и так переход в начало списка будет
дублирование
counter += 1, хотя можно было вынести за условие

Но самое главное - у вас ошибка!!!
Если первая строка будет больше второй, то возникнет ситуация, когда ко второй строке будет обращение по индексы за пределами этой строки и будет ошибка
Например код можно было бы переписать так:
вариант 1:

new_gen = []
for i in range(min(len(a), len(b))):
    if a[i] == b[i]:
        new_gen.append(a[i])
print(new_gen)

Если же говорить про короткие коды, то можно сделать такие варианты:
вариант 2:

new_gen = []
for obj in zip(a, b):
    if obj[0] == obj[1]:
        new_gen.append(obj[0])

и конечно все можно будет свернуть в 1 строку
вариант 3:

new_gen = [obj[0] for obj in zip(a, b) if obj[0] == obj[1]]


как сделать Добавление/изменение текста с последующим их запоминанием ботом. на pyTelegramBotAPI
pyTelegramBotAPI не могу использовать другие библиотеки так как сделал уже много функций для этого бота.
Мне надо добавить функцию в бота с помощью которого можно будет сохранять текст от пользователя и еще + потом изменять этот текст лучше всего сохранять все это в .txt .
Пожалуйста если можете помогите)

В каком смысле сохранять текст? Чтобы получить какой-то текст от пользователя используйте @bot.message_handler или bot.register_next_step_handler, чтобы изменить сообщение используйте bot.edit_message_text
Если ты хочешь просто получать его сообщение и записывать, то используй @bot.message_handler:
<code>
@bot.message_handler(content_types=["text"])
def write(message):
    text = message.text

    f = open("writes.txt", "a")
    f.write(text)
    f.close()
</code>


Как разделить строку на отдельные слова и вставить в вектор на c++
Строка: "Фамилия Имя Отчество"
массив(Вектор): [Фамилия;Имя;Отчество]
В python можно было использовать функция map и метод split для разделение строки на слова.
Может есть встроенные функции в плюсах?

можно так:
<code>
std::vector<std::string> res;

std::istringstream ss(text);

std::string word;

while (ss >> word)
{
    res.push_back(word);
}
</code>


Найти k чисел, ближайших к заданному значению, в упорядоченном массиве [закрыт]

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

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

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

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

Задача: найти k чисел, ближайших к заданному значению, в упорядоченном массиве. Само значение может не встретиться в массиве.
Пример:
<code>
closest([1,4,8,10], target=2, count=3) --> [1, 4, 8]
</code>
Решение должно иметь сложность O(log(n)+k). Использовать модуль bisect запрещено.

Пишете сами бинарный поиск для определения позиции элемента, потом идёте от неё вправо и влево (если разница с левым элементом меньше, то уменьшаете левый индекс, иначе увеличиваете правый), пока не наберёте k чисел.
<code>
def BS(arr, value):
    lo = 0
    hi = len(arr)-1
    while lo <= hi:
        mid = (lo + hi) // 2
        if arr[mid] == value:
            return mid
        elif arr[mid] < value:
            lo = mid + 1
        else:
            hi = mid - 1
    return -lo

a = [1,4,8,10]
value = 2 # 4, 8, -1, 15
k = 3
p = BS(a, value)
if p >= 0:
    l = p - 1
    r = p + 1
    n = 1
else:
    l = -p - 1
    r = -p
    n = 0

while n < k and l >= 0 and r < len(a):
    if value - a[l] <= a[r] - value:
        l -= 1
        n += 1
    else:
        r += 1
        n += 1
while n < k and l >= 0:
    l -= 1
    n += 1
while n < k and r < len(a):
    r += 1
    n += 1

if k==n:
    print(a[l+1:r])
</code>


Дан массив целых чисел A. Требуется найти число различных сумм, составленных из части его элементов
Дан массив целых чисел A. Требуется найти число различных сумм, составленных из части его элементов. Для массива [1,2,3] полный набор сумм — это [0, 1, 1+2, 1+3, 1+2+3, 2, 2+3, 3]. Различные суммы — это {0,1,2,3,4,5,6}. Итого 7 различных сумм.
Ограничения: длина массива A не превышает 500, его элементы принимают значения от 0 до 100.
Мой код:
<code>
def combinations(iterable, r):
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = list(range(r))
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)

def sums(array: list) -> int:
    combs = []

    for i in range(2, len(array)+1):
        combs += list(combinations(array, i))

    sumsSet = set([0] + array + list(map(sum, combs)))

    return len(sumsSet)

print(sums([49, 100, 98, 49, 0]))
</code>
Для коротких входных массивов алгоритм работает быстро, а для больших, к примеру: [1, 2, 4, 8, 16, 32, 64] + [100] * 493 выполняется очень долго. Как я могу сократить время выполнения алгоритма?

вот такое скорее всего нужно?

array = [1, 2, 4, 8, 16, 32, 64] + [100] * 493

res = {0}

for num in array:
    res = set(list(res) + [(i + num) for i in res])

print(len(res))

или так:

res = {0}

for num in array:
    res.update([(i + num) for i in res])


Vk_api Error 917. Бот не может отправить сообщения, все права ему выданы
Учусь писать ботов для бесед Вконтакте.

vk_session = vk_api.VkApi(token='мой токен')
longpoll = VkBotLongPoll(vk_session, 'id группы')
vk = vk_session.get_api()
Lslongpoll = VkLongPoll(vk_session)
Lsvk = vk_session.get_api()
vk.messages.send(chat_id='424', message='Сообщение', random_id=get_random_id())

Получаю такую ошибку:

vk_api.exceptions.ApiError: [917] You don't have access to this chat

Доступ к истории сообщений есть, права администратора тоже. В чём может быть дело?

chat_id у тебя и у бота для одной и той же беседы отличаются! Они относительны для каждого пользователя/бота.
Для того, что бы узнать
chat_id беседы, можно получить список всех бесед и уже среди всех бесед найти необходимую и записать
id.

print(vk.messages.getConversations()['items'])

Можно пройтись по этому списку (там находятся объекты бесед) и найти необходимую, например, по названию. Это уже зависит от ваших нужд.


Есть код, выдает ошибку - IndexError: string index out of range
Есть код, выдает ошибку

elif "#" == string[0] and "#" == string[1] and "#" == string[2] and "#" == string[3]: IndexError: string index out of range

n = int(input())

for i in range(n):
    string = input()
    if "%" == string[0] and "%" == string[1]:
        print(string[2:len(string) + 1])

    elif "#" == string[0] and "#" == string[1] and "#" == string[2] and "#" == string[3]:
        continue

    else:
        print(string)

Ввод:

12
ibiuH&tg7t628h####oij
nnkU%%jghlkhl
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[uuuuuuuuuuuuuuuuuuuuuuuuuuyyyyyy
%%%%%%%%%%%%%
###################
###444444444444444
#
%
yigigh
%%liuhli
####l;m;ol
oiho;i

У вас на входе есть короткие строки (например, строка длиной 1), а вы безо всяких проверок берёте от неё символы с позиций 1, 2 и 3. Естественно, в этом месте возникнет ошибка "выход за границы".
Не проще ли брать срез (на нём таких ошибок не возникнет) и сразу проверять на совпадение подстрок, чем делать это посимвольно?
<code>
n = int(input())

for i in range(n):
    string = input()
    if "%%" == string[:2]:
        print(string[2:])

    elif "####" == string[:4]:
        continue

    else:
        print(string)
</code>


Переписать часть кода из C++ на Python
как я могу переписать этот кусок кода на C++ в Python

void treeFork(treeNode* root)
{
    if (root)
    {
        treeFork(root->left);
        if (root->left && root->right)
            cout << root->data << " ";
        treeFork(root->right);
    }
}

вот мой код на Python

class Node:
   def init(self, data):
      self.left = None
      self.right = None
      self.data = data

   def insert(self, data):
      if self.data:
         if data < self.data:
            if self.left is None:
               self.left = Node(data)
            else:
               self.left.insert(data)
         elif data > self.data:
            if self.right is None:
               self.right = Node(data)
            else:
               self.right.insert(data)
         else:
            self.data = data

def fork(root):
    if root is None:
        return 0
    else:
        if root.left and root.right:
            print(root.data)

m, *n = map(int, input().split())
root = Node(m)
for i in n:
    if i!=0:
        root.insert(i)

print(str(fork(root)))

мне нужно переписать часть с функцией def fork(root)
суть в том что код должен вывести все разветвления дерева. в моем коде выводит только разветвление из корня, но он не идет дальше. не знаю как написать, что бы код шел дальше по дереву
спасибо за помощь

А куда вызовы функции самой себя потеряли?
<code>
def fork(root):
    if root is None:
        return 0
    else:
        fork(root.left)              # <<<<
        if root.left and root.right:
            print(root.data)
        fork(root.right)             # <<<<
</code>


Декоратор функции в Python
Изучаю тему с декораторами, есть задание.
Условие: Объявите функцию с именем get_sq , которая вычисляет площадь прямоугольника по двум
параметрам: width и height – ширина и высота прямоугольника и возвращает результат.
Определите декоратор для этой функции с именем (внешней функции) func_show , который
отображает результат на экране в виде строки (без кавычек): "Площадь прямоугольника:
<значение>". Вызовите декорированную функцию get_sq.
Составил код, вроде бы все работает, но не уверен в правильности, т.к. цикл будет перебирать все аргументы, а не именно два: width и height.
Хотел бы узнать, как можно оформить именно для двух аргументов. И правильно ли вызван декоратор?
Буду признателен за объяснения и советы. Спасибо.
<code>
def func_show(func):

def get_sq(**kwargs):
    x = 1
    for v in kwargs.values():
        x *= int(v)
    func(x)
return get_sq

@func_show
def result(kwargs):
    print(f"Площадь прямоугольника: {kwargs}")

if __name__ == '__main__':
    result(width=4, height=6)
</code>

Ваш код в принципе не будет работать - декоратор пустой, return get_sq вне функции, да и к чему перебор аргументов, если по заданию у вас их два...
Давайте подробнее разберем как надо
<code>
def func_show(func): # это наша функция декоратор
    # внутри декоратора у нас будет функция-обработчик, который и будет декорировать  оригинальную функцию
    # На вход этой функции примем те же аргументы что и оригинальная функция
    def wrapper(width, height):
        res = func(width, height) # обратимся к оригинальной функции для получения результата
        print(f"Площадь прямоугольника: {res}") # выведем текст в соответствии с заданием
        return res # и в конце вернем вычисленное значение (вдруг за декоратором кто-то им воспользоваться хотел)
    return wrapper # результат работы декоратора - вызов нашей функции-обработчика

# соственно декорирование вашей функции, вычисления площади
@func_show
def get_sq(width, height):
    return width*height

if __name__ == '__main__':
    # вызов декорированной функции
    get_sq(width=4, height=6)
</code>


Как в программе Tkinter умножать полученные данные от пользователя на числа с плавающей точкой?
При любой попытке в программе Tkinter умножить полученные числа от пользователя на заданные числа с плавающей точкой выдает ошибку.
При обозначении примера типа float(TypeError: float() argument must be a string or a number, not 'NoneType'), а если int - ValueError: invalid literal for int() with base 10: '0.0'.
<code>
num1 = float(a.get())
num2 = float(b.get())
num2 = b.set(num1*785.9)
num1 = a.set(num2*456.7)
</code>
Нужно чтобы значение первого поля при вводе числа во второе перемножались по примеру и наоборот.

Уберите присваивание когда делаете
.set(...).

b.set(num1*785.9)
a.set(num2*456.7)

Эти функции ничего не возвращают (т.е. по сути возвращают
None). И этим вы перетираете значения в переменных
num1 и
num2.


Определите длину самой длинной цепочки, состоящей только из символов A, B и C
Есть файл в котором записаны буквы A...Z. Необходимо, определите длину самой длинной цепочки, состоящей только из символов A, B и C.
Моя проблема в том, что код ищет только длину цепочки состоящую из одинаковых букв. Как можно исправить код?
<code>
file = open("2.txt").read().strip()
count = 1
max_count = 1
symbols = ""
for i in range(len(file)-1):
    if file[i] == file[i+1]:
        count += 1
    else:
         count = 1
    if count > max_count:
         max_count = count
         symbols = file[i]
print(symbols,max_count)
</code>

вариант 1 (решение в лоб):

text = "XABXCABBBCAADBXXBAADX"

max_size = 0
size = 0
for letter in text:
    if letter in 'ABC':
        size += 1
    else:
        if max_size < size:
            max_size = size

        size = 0

if max_size < size:
    max_size = size

print(max_size)

вариант 2 (укороченный):

size, max_size = 0, 0

for letter in text:
    size, max_size = (size + 1, max_size) if letter in 'ABC' else (0, size if max_size < size else max_size)

max_size = size if max_size < size else max_size

вариант 3 (однострочный):
правда тут небольшой изврат и работает помедленнее предыдущего:

res = max(map(len, ''.join(letter if letter in 'ABC' else ' ' for letter in text)).split())

вариант 3.1 (чуть-чуть покороче):

res = max(map(len, ''.join((' ', letter)[letter in 'ABC'] for letter in text).split()))


сначала можно получить вектор с минимумами столбцов, а потом получить из него абсолютный минимум и его индекс, воспользовавшись Series.idxmin():
<code>
mn = df.min()
min_, min_idx = mn.min(), mn.idxmin()
print(f"min: {min_}, min_index: {min_idx}")
# min: 2.0, min_index: 4
</code>


Работа с файлами в Python. С чего начать?
Я как новичок изучающий Python, быстро дошёл до момента , когда довольно обширная, как мне кажется, тема "Работа с файлами" ввела меня в тупик. Я прочитал документацию на Metanit`е & pythonworld, но позже подыскивая практические занятия , оказалось , что там многое не договаривают.
Суть вопроса : Подскажите план изучения темы "Работа с файлами"

Сейчас пишу учебник по прогаммированию на Python, помогли направиться на тему, спасибо за вопрос)
Как записать текст в файл?
Для этого впишите код:

a='Любой текст'
test=open('test1.txt', 'w')
test.write(a)
test.close()

Функция
open открывает любой файл, который можно прочитать в Python (кроме недопустимых расширений). Не беспокойтесь, если такого файла нет, так как в таком случает программа создаст новый файл. Если же такой файл есть, то он должен лежать в той папке, где лежит ваша программа. Если вы хотите положить файл в другую папку, вам придётся указывать полный путь к файлу, вот так (на Windows):

test=open('C:\\Users\\имя пользователя\\...')

Но что означает буква
'w' в конце функции
open? Это значит, что файл открывается для перезаписи, то есть весь текст из файла удаляется и в файл добавляется текст. Если вы хотите, чтобы файл открывался для дозаписи, замените
'w' на
'a'.
Как прочитать файл?
Давайте прочитаем наш файл прямо в оболочке Python. Для этого запишите код:

test=open('test1.txt')
print(test.read())

Если вы запустите программу, она выведет текст из файла. Обратите внимание, что при чтении файла ни
'w' ни
'a' в конце функции
open писать не нужно.
Вот план изучения:

Почитайте больше книг. Лично посоветую книгу Джейсона Бриггса "PYTHON для детей". Не обижайтесь, что для детей, там описаны многие полезные действия в Python, в том числе работа с файлами)

Почитайте интернет-документации на PythonDocs.

Почитайте интересные интернет-статьи про операции с файлами, одна из них тут.


Не могу придумать алгоритм для решения задачи на Python
Условие:
Сколько существует целых положительных чисел таких, что их запись в восьмеричной системе счисления оканчивается
на две одинаковые цифры, запись не содержит цифр 0, и сумма цифр в записи равна 8. В ответе укажите целое число.

Опять при всем уважении к Zhihar...
Но не лучше ли пойти с конца? Рассмотреть возможные варианты окончания — 11, 22, ..., 44 и к ним — количество представлений чисел 6, 4, 2, 0 всякими (ненулевыми :)) цифрами.
<code>
def cnt(s):
    if s < 0:  return 0
    if s == 0: return 1
    sum = 0
    for i in range(1,7):
        sum = sum + cnt(s-i)
    return sum

sum = 0
for i in range(0, 7, 2):
    sum = sum + cnt(i)

print(sum)
</code>
Результат верный — те же 43, глубина рекурсии очень небольшая, так что какая-нибудь мемоизация ни к чему.
Сам код — по сути перевод изначально написанного мною на С++, так что если можно написать красивее — перепишите...
Время у Zhihar — 1,06 c, у меня — 0,02 с...


Декораторы функций [закрыт]

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

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

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

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

Впервые на данном ресурсе, хотел попросить у вас помощи. Не понял до конца тему с декораторами, а нужно выполнить задание. Вот собственно само задание: Вводятся два списка (каждый с новой строки) из слов, записанных через пробел. Имеется
функция, которая преобразовывает эти две строки в два списка слов и возвращает эти
списки. Определите декоратор для этой функции, который из этих двух списков
формирует словарь, в котором ключами являются слова из первого списка, а значениями –
соответствующие элементы из второго списка. Полученный словарь
должен возвращаться при вызове декоратора. Примените декоратор к первой функции и
вызовите ее. Результат (словарь) отобразите на экране.
Буду признателен за помощь.

как я понимаю вам нужно вот это:
<code>
# первоначальная функция
def initial_func(text1, text2):
    return text1.split(), text2.split()

# декоратор
def decor(func):
    def decor_meat(text1, text2):
        data = func(text1, text2)
        return dict(zip(*data))

    return decor_meat

# подключаем декоратор
initial_func = decor(initial_func)

# использование декоратора
text1 = "key1 key2" #input('слова 1: ')
text2 = "value1 value2" #input('слова 2: ')

print(initial_func(text1, text2))
</code>


Сложение чисел из одного поля с результатом вывода в другое Tkinter
Помогите разобраться. Как c помощью программы Tkinter вывести окно, где будет запрос на ввод числа и после нажатия на кнопку "Добавить" число будет добавляться к введенным ранее. Тоесть в одном поле нужно вводить по числу (бесконечное количество раз), а в другом будет выводиться их сумма. Не понимаю как вывести сумму.
<code>
from tkinter import *
from tkinter import messagebox
import math

def calculation():
    num = int(a.get())
    num2 = int(b.get())
    num2 = num2 + num

root = Tk()
root.title("Додавання чисел")
root.geometry("400x150")

a = StringVar()
b = StringVar()
Label(root, text="Введіть число").place(x=20, y=20)
Entry(root, textvariable=a).place(x=115, y=10)
Label(root, text="Отримуємо").place(x=20, y=55)
Entry(root, textvariable=b).place(x=115, y=55)

but = Button(text="Додати", command=calculation).place(x=200, y=100)

root.mainloop()
</code>

Вызвать
b.set(...) в нужных местах.

from tkinter import *
from tkinter import messagebox
import math

def calculation():
    num = int(a.get())
    num2 = int(b.get())
    num2 = num2 + num
    b.set(str(num2))

root = Tk()
root.title("Додавання чисел")
root.geometry("400x150")

a = StringVar()
b = StringVar()
b.set("0")
Label(root, text="Введіть число").place(x=20, y=20)
Entry(root, textvariable=a).place(x=115, y=10)
Label(root, text="Отримуємо").place(x=20, y=55)
Entry(root, textvariable=b).place(x=115, y=55)

but = Button(text="Додати", command=calculation).place(x=200, y=100)

root.mainloop()


python как задать неравенство двух рандомных чисел? assert тут не работает [закрыт]

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

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

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

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

<code>
r1 = random.randrange(1,6,1)
r2 = random.randrange(1,6,1)
team_home, team_away = '', ''
rr = (r1, r2)
for r in rr:
    assert r1 != r2

AssertionError:
</code>
Что делать?

В модуле
random есть специальная функция для этого.

r1, r2 = random.sample(range(1,6), k=2)


Не работает exe переведенный из py
Нужно код ниже перевести в exe файл. Использовал pyinstaller, все скомпилировалось, но при запуске exe файла консоль появляется на миллисекунду и сразу исчезает. Текса в ней нет, она пустая.
В коде есть строчки скрывающие консоль, пробовал их комментировать и все перекомпилировать, но проблема осталась. Может можно сделать exe файл по другому?
На самом деле можно и я даже это делал с этим кодом, но я не помню, что именно использовал. Там был сайт с белым фоном, с подробной инструкцией. Также в ней говорилось создать отдельный setup.py. Может кто-нибудь помнит, что за сайт?
У меня даже есть билд той версии, может там можно где-нибудь узнать, с помощью чего он создавался?
UPD:
При запуске exe файла через консоль пишет

Traceback (most recent call last):
  File "main.py", line 5, in <module>
ModuleNotFoundError: No module named 'telethon'
[16492] Failed to execute script 'main' due to unhandled exception!

import random
from time import sleep
import win32gui
import win32.lib.win32con as win32con
from telethon import TelegramClient

def file_to_string_array(filename):
    result = []
    with open(filename) as f:
        for i in f.readlines():
            result.append(i.replace('\n', ''))
    return result

def split_input(array):
    result = []
    while True:
        try:
            result.append([array[0], array[1], array[2]])
            array.pop(0)
            array.pop(0)
            array.pop(0)
        except IndexError:
            break
    return result

def first_run_to_false():
    with open('telegram_input.txt') as f:
        lines = f.readlines()
    lines[0] = 'False\n'
    with open('telegram_input.txt', 'w') as f:
        f.writelines(lines)

async def main():
    await client.send_message(chat, text)
    sleep(2)
    async for message in client.iter_messages(chat):
        if 0 < message.button_count < 11:
            await message.click(random.randint(0, message.button_count - 1))
            break

if __name__ == '__main__':
    data = file_to_string_array('telegram_input.txt')
    first_run = data[0]
    users = split_input(data[1:])
    chat = '@aeawed'
    text = 'Hello'

    for user in users:
        client = TelegramClient(user[2], int(user[0]), user[1])
        with client:
            if first_run == 'False':
                the_program_to_hide = win32gui.GetForegroundWindow()
                win32gui.ShowWindow(the_program_to_hide, win32con.SW_HIDE)
            client.loop.run_until_complete(main())
            # if first_run == 'False':
            #     win32gui.ShowWindow(the_program_to_hide, win32con.SW_SHOW)

    if first_run == 'True':
        first_run_to_false()

Проблема в том, что я для тестов постоянно копировал папку с проектом, чтобы поставить pyinstaller, но видимо при копировании папки не копируются импорты. Помогло
pip install telethon в новой скопированной папке.
Также
the_program_to_hide = win32gui.GetForegroundWindow() win32gui.ShowWindow(the_program_to_hide, win32con.SW_HIDE) тут не совсем подходит. Консоль, во-первых, появится в самом начале все равно, так как перед этими строчками происходят вычисления с незакрытой консолью. Во-вторых, эти строки находятся в цикле. Первый раз они спрячут консоль, а все последующие разы - активные окна, которые потом можно будет закрыть только через Диспетчер задач.


Количество разных чисел по модулю (оптимизация)
столкнулся вроде бы как с простой задачкой, но не получается уложиться в ограничение по памяти, заданное на сайте.
Задан отсортированный массив целых чисел. Найдите количество различных по модулю чисел среди элементов массива.
Входные данные:
Первая строка содержит количество чисел n (n ≤ 2 * 10^6). Вторая строка содержит n целых чисел, отсортированных по возрастанию. Массив может содержать одинаковые элементы.
Выходные данные:
Выведите количество различных по модулю чисел.
Пример :
Входные данные:

9
-1 -1 -1 -1 0 1 1 1 1

Выходные данные:

2

У меня два теста кушают 131 072 KiB, когда заданное ограничение - 128 MiB
Есть подозрения, что нужно всё сделать через словари, но я не совсем понимаю, как это оформить.
Ссылка на задание
Вот мой код:

n = int(input())
lst_1 = [int(el) for el in input().split()]
counter = 0
lst = set(lst_1)
r = []
for i in lst:
    r.append(abs(i))
print(len(set(r)))

Задача оказалась про скорость ввода данных. Вот решение которое проходит все тесты (результаты):

import sys

def read():
    READ_SIZE = 1024
    tail = ''
    while True:
        block = sys.stdin.read(READ_SIZE)
        if len(block) == 0:
            yield from tail.split()
            return
        text = tail + block

        last_ws = text.rfind(' ')
        if last_ws == -1:
            tail = text
            continue

        yield from text[:last_ws].split()
        tail = text[last_ws:]

input()
print(len(set(abs(int(w)) for w in read())))

Ограничения задачи - одна секунда, 128MB. Я сделал несколько тестов, чтобы понять как эти ограничения работают.
Прочитаем данные самым привычным для Питона способом:

input()
print(len(input().split()))

Результаты. То что это решение не решает задачу не важно. Меня интересует только память и время. Тесты 9 и 10 исчерпывают память полностью. На что расходуется память? На строку, которую вернул
input(). На миллион (буквально) маленьких строчек, которые нарезал
.split() и на список хранящий эти строки.
Главный вывод: каким бы ни был алгоритм обработки этого списка в дальнейшем, мы не помещаемся в память. Так читать данные нельзя.
А как можно? Единственное решение высокого уровня, которое читает слова из строки без создания длинного списка -
re.finditer. Если вы знаете другие, подскажите.

import re

input()
print(sum(1 for _ in re.finditer('[0123456789]+', input())))

Результаты. Снова нас не интересует правильность, только память и время. На этот раз по памяти мы проходит свободно. Наибольшее потребление на девятом тесте - 24MB. Память расходуется на входную строку и миллион (буквально) объектов которые описывают найденные подстроки. Эти объекты не должны хранится, полагаю что сборщик мусора не успевает их убирать. Не суть.
Время работы этого варинта обескураживает:
re.finditer тратит 412ms на восьмой тест,
.split() - 146ms.
re.finditer в 2.8 раза хуже.
Времени, которое остаётся после чтения данных
re.finditer не хватает чтобы посчитать правильный ответ:

import re

input()
print(len(set(int(m.group(0)) for m in re.finditer('[0123456789]+', input()))))

Результаты. Этот вариант даёт верные ответы, но не проходит по времени в тестах 9 и 10. Сколько времени нам не хватает? Восьмой тест в этом варианте - 840ms, в предыдущем - 412ms. Девятый тест в предыдущем - 758ms. Предполагая что обе программы имеют линейную сложность, получаем пропорцию для девятого теста на последнем коде:
758 / 412 * 840 = 1547ms. На полсекунды больше лимита по времени.
Напишем ввод руками. Функция
read читает входной поток небольшими кусками, не хранит его целиком, выдаёт наружу как можно быстрее. Проверим как быстро читаются данные таким образом:

import sys

def read():
    READ_SIZE = 1024
    tail = ''
    while True:
        block = sys.stdin.read(READ_SIZE)
        if len(block) == 0:
            yield from tail.split()
            return
        text = tail + block

        last_ws = text.rfind(' ')
        if last_ws == -1:
            tail = text
            continue

        yield from text[:last_ws].split()
        tail = text[last_ws:]

input()
print(sum(1 for _ in read()))

Результаты. Девятый тест занимает 374ms. Аналогичное время для
re.finditer - 758ms. Рукописное чтение обогнало библиотечное в два раза - неожиданный результат.
Сравним времена
input().split(),
re.finditer(..., input()) и
read() на тестах которые прошли по памяти для всех трёх вариантах:

вариант                      тест 7   тест 8

input().split()               125       146
read()                        185       193
re.finditer(..., input())     395       412

Самописный
read() в полтора раза медленнее библиотечного
input().split(), что подтверждает правило "чем выше уровень, тем быстрее код на Питоне".
re.finditer разочаровал.
Для решения задачи пришлось идиоматичное но расточительное по памяти решение (
input().split()) заменить менее быстрым но экономным рукописным (
read()).


Добавление элемента в двусвязный список
Я пытаюсь создать отсортированный двусвязный список, состоящий из товаров. У товара есть название и цена, сортировка по цене. Соответственно товар с самой высокой стоимостью будет впереди итд.

class Node:
    def __init__(self, nextNode, prevNode, data):
        self.data = data
        self.nextNode = nextNode
        self.prevNode = prevNode

class Listnew:
    def __init__(self):
        self.head = None

    def push(self, item):
        if self.head is None:
            newNode = Node(None, None, item)
            self.head = newNode
            return
        else:
            newNode = Node(None, None, item)

            node = self.head
            while node is not None:
                if node.data.price > newNode.data.price:
                    break
                node = node.nextNode

            newNode.prevNode = node
            newNode.nextNode = node.prevNode

            if node.prevNode is not None:
                node.nextNode.prevNode = newNode
            node.prevNode = newNode

    def printList(self):
        node = self.head
        while node is not None:
            print(node.data.price)
            node = node.nextNode

class Item:
    def __init__(self, name, price):
        self.name = name
        self.price = price

Но при попытке добавить более одного элемента в список получаю следующую ошибку:

node.nextNode.prevNode = newNode
AttributeError: 'NoneType' object has no attribute 'prevNode'

class Node:
    def __init__(self, nextNode, prevNode, data):
        self.data = data
        self.nextNode = nextNode
        self.prevNode = prevNode

class Listnew:
    def __init__(self):
        self.head = None

  # Наполним двухсвязный список элементами
    def push(self, item):
        newNode = Node(None, None, item)
        if self.head is not None:
            newNode.nextNode = self.head
            self.head.prevNode = newNode
        self.head = newNode

    # Отсортируем элементы в двухсвязном списке по убыванию цены
    def sort_by_price(self):
        node = self.head
        while node is not None:
            nextNode = node.nextNode
            while nextNode is not None:
                if node.data.price < nextNode.data.price:
                    node.data, nextNode.data = nextNode.data, node.data
                nextNode = nextNode.nextNode
            node = node.nextNode

    def printList(self):
        node = self.head
        while node is not None:
            print(node.data.price)
            node = node.nextNode

class Item:
    def __init__(self, name, price):
        self.name = name
        self.price = price

# Создадим список
elements = Listnew()

# Добавим элементы
item_one = Item("A", 10)
item_two = Item("B", 20)
item_three = Item("C", 5)

elements.push(item_one)
elements.push(item_two)
elements.push(item_three)

# Отсортируем по цене по убыванию
elements.sort_by_price()

# Выведем результат
elements.printList()
# 20
# 10
# 5


Срезы python как правильно?
Я только начал изучать python и столкнулся проблемой ...
Есть список со 100 и больше элементов мне нухно выбрать с 1 по 6 через 10 т. е. 1-6,11-16,21-26 и т.д.
<code>
mylist=list(range(200))
x = milist[0:6:10]
print(x)
выводит [0]

</code>
как записать правильно используя [::]

вариант через срезы

data = [i for i in range(100)] # выборка для тестирования

res = []

for i in range(len(data) // 10 + 1):
    res += data[1 + 10 * i: 7 + 10 * i]

print(res)

более короткий вариант через срезы:

res = []

for i in range(1, len(data), 10):
    res += data[i: i + 6]

однострочный вариант (спасибо MaxU):

res = sum((data[i: i + 6] for i in range(1, len(data), 10)), [])


Разработать программу, имеющую графический интерфейс, которая позволяет считывать информацию из файла в соответствующие виджеты: Label, Entry, Text
У меня есть код, который считывает с Entry и Text некий текст, который вводит пользователь, и записывает его в файл. Нужно создать функции для считывания и вывода из этих файлов в Entry, Text, Label.
<code>
from tkinter import *
from tkinter import ttk

def registration():
    global entry

def get_entry():
    s = txt.get()
    file = open("test.txt", "a")
    file.write(s)
    file.close()

def insert_text():
    s = input()
    text.insert(1.0, s)

def get_text():
    s = text.get(1.0, END)
    file = open("MyText.txt", "a")
    file.write(s)
    file.close()

def delete_text():
    text.delete(1.0, END)

window = Tk()
window.title("Лабораторная №7")
window.geometry('650x300')

tab_control = ttk.Notebook(window)
tab1 = ttk.Frame(tab_control)
tab_control.add(tab1, text='Запись в файл через Entry')
tab_control.pack(expand=1, fill='both')

tab2 = ttk.Frame(tab_control)
tab_control.add(tab2, text='Запись в файл через Text')
tab_control.pack(expand=1, fill='both')

tab3 = ttk.Frame(tab_control)
tab_control.add(tab3, text='Чтение из файла через Entry')
tab_control.pack(expand=1, fill='both')

tab4 = ttk.Frame(tab_control)
tab_control.add(tab4, text='Чтение из файла через Text')
tab_control.pack(expand=1, fill='both')

lbl = Label(tab1,text="Введите текст, который хотите записать в файл")
lbl.grid(column=1, row=0, padx=170, pady=10)

txt = Entry(tab1,width=20)
txt.grid(column=1, row=1, padx=0, pady=10)

btn = Button(tab1, text="Записать в файл", command=get_entry)
btn.grid(column=1, row=2, padx=0, pady=10)

text = Text(tab2, width=30, height=5)
text.pack()

Button(tab2, text="Сохранить в файл",
       command=get_text).pack(side=LEFT)
Button(tab2, text="Очистить поле ввода",
       command=delete_text).pack(side=LEFT)

label = Label()
label.pack()

window.mainloop()
</code>
Может есть какие-нибудь идеи, как это сделать?

Напишите вот это (если я правильно Вас понял):
<code>
te=open('test.txt') #или надо MyText.txt вместо test.txt
Label(window, text=te.read()).pack()
</code>


Добавить столбец из нескольких файлов в цикле
У меня есть несколько папок из которых я считываю циклом файлы, создаю в них столбец name и count
Столбец name в каждом файле состоит из части значений из столбца name в ещё одном файле считанным в df. Во всех файлах значения name различны. Мне нужно по этим значениям добавить столбец count из каждого файла в df.
Для примера у меня есть две такие таблицы:

id
name
count

a
48/a
2

c
48/c
5

id
name
count

a
50/a
5

b
50/b
6

d
50/d
6

Нужно получить такую таблицу добавлением из двух предыдущих значения count  в изначальную таблицу df

name
count

48/a
2

48/b

48/c
5

50/a
5

50/b
6

50/c

50/d
6

Код
<code>
for i in range(len(file)) :
    obj = pd.read_csv(file[i])
    obj['count'] = obj.groupby('id')['id'].transform('count')
    for j in range(obj.shape[0]):
        obj['name'][j] = str(file[i])+'/'+str(obj['id'][j])
    obj.to_csv('frame'+str(i)+'.csv')
    df = df.merge(obj[['name','count']], on = 'link', how = 'outer' )

</code>
Но мой код мне выдает подобную таблицу:

name
count_x
count_y

48/a
2

48/b

48/c
5

50/a

5

50/b

6

50/c

50/d

6

Как можно переписать, чтоб все добавлялось в один столбец?

а что мешает установить новый индекс и сделать простую конкатенацию?

df1 = df1.set_index("name")
df2 = df2.set_index("name")
res = pd.concat([df1, df2])

res:

     id  count
name
48/a  a      2
48/c  c      5
50/a  a      5
50/b  b      6
50/d  d      6

Ненужные колонки можно убрать, и, если есть желание, сделать reset_index()
UPDATE
Если количество колонок может разнится, но нужные вам колонки везде имеют одно и то же имя и значения в колонке
name уникальны, то можно попробовать так:

res1 = pd.merge(res1[['name', 'count']], df2[['name', 'count']], how="outer")

res1:

   name  count
0  48/a      2
1  48/c      5
2  50/a      5
3  50/b      6
4  50/d      6


tf.test.is_gpu_available()) возвращает False

print(tf.test.is_gpu_available())
print(tf.test.is_built_with_cuda())

Возвращает

False
True

Tensorflow - 2.7.0
CUDA - 11.2
Что я сделал не так? Помогите

Следуйте гайду по установке Tensorflow + GPU

Software requirements
The following NVIDIA® software must be installed on your system:

NVIDIA® GPU drivers —CUDA® 11.2 requires 450.80.02 or higher.
CUDA® Toolkit —TensorFlow supports CUDA® 11.2 (TensorFlow >= 2.5.0)
CUPTI ships with the CUDA® Toolkit.
cuDNN SDK 8.1.0 cuDNN versions). (Optional) TensorRT 7 to improve latency and throughput for inference on some models.

Windows setup

See the hardware requirements and software requirements listed above. Read the CUDA® install guide for Windows.
Make sure the installed NVIDIA software packages match the versions
listed above. In particular, TensorFlow will not load without the
cuDNN64_8.dll file. To use a different version, see the Windows build
from source guide.
Add the CUDA®, CUPTI, and cuDNN installation directories to the %PATH%
environmental variable. For example, if the CUDA® Toolkit is installed
to C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0 and cuDNN
to C:\tools\cuda, update your %PATH% to match:

<code>
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin;%PATH%
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\extras\CUPTI\lib64;%PATH%
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include;%PATH%
SET PATH=C:\tools\cuda\bin;%PATH%
</code>


Получив на вход некоторое натуральное число X, этот алгоритм печатает одно число. Сколько существует чисел Х, для которых алгоритм напечатает 243?
<code>
x = int(input())
s = 5 * (x // 10)
n = 1
while s < 300:
    s = s + 28
    n = n * 3
print(n)
</code>

для начала определим какое x максимально, для которого s будет вычисляться:

300 > 5 * [x/10]
60 > [x/10]
x < 600

теперь по самому код -
если код

while s < 300:
    s = s + 28
    n = n * 3
    print(n)

тогда ответ 379
если код

while s < 300:
    s = s + 28
    n = n * 3
print(n)

тогда ответ 60
Проверить можно написав программку:

counter = 0

for x in range(1, 600):
    s = 5 * (x // 10)
    n = 1

    while s < 300:
        s = s + 28
        n = n * 3

        counter += 1 if n == 243 else 0

print(counter)

Касательно первого варианта можно определить теоретически кол-во:
Необходимо чтобы цикл прокрутился минимум 5 раз -
243 = 3^5,
значит s должно увеличиться минимум на
4 * 28 = 112,
а значит стартовая s должна быть не более, чем
s = 300 - 112 = 188,
откуда находим максимальное x:
188 < 5 * [x / 10]
откуда
x = 379
Касательно второго варианта можно определить теоретически кол-во:
рассуждения аналогичны предыдущим, но тут нам требуется СТРОГО 5 циклов, откуда находим диапазон для s:
[160-188)
откуда x в диапазоне
[320-379] т.е. 60 штук


Как в боте Telegram получить сообщение от бота, ничего ему не отправляя?
Помогите, пожалуйста, решить поставленную проблему.
Я хочу, чтобы при работе кода сообщение от бота отправлялось сразу же, как мы попадаем в функцию "sendp" без нужды отправлять новое сообщение.
Пример, как это работает:
Бот: /Отправил картинку/
Бот: Тебе нравится картинка?
Я: да
Бот: Вот и здорово, тогда отправлю её ещё раз!
Я: /записываю любую строку/
Бот: /Отправил картинку/
Бот: Тебе нравится картинка?
Пример, как мне нужно,чтобы это работало:
Бот: /Отправил картинку/
Бот: Тебе нравится картинка?
Я: да
Бот: Вот и здорово, тогда отправлю её ещё раз!
Бот: /Отправил картинку/
Бот: Тебе нравится картинка?
<code>
import telebot

bot = telebot.TeleBot(' ')

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

def sendp(message):
    bot.send_photo(message.from_user.id, open("filename.png", 'rb'))
    bot.send_message(message.from_user.id, 'Тебе нравится картинка?')
    bot.register_next_step_handler(message, likeit)

def likeit(message):
    if message.text == 'да':
        bot.send_message(message.from_user.id, 'Вот и здорово, тогда отправлю её ещё раз!')
        bot.register_next_step_handler(message, sendp)
    else:
        bot.send_message(message.from_user.id, 'А если подумать?')
        bot.register_next_step_handler(message, likeit)

bot.polling(none_stop=True)
</code>

Вам не нужно регистрировать обработчик функции sendp, просто вызывайте ее, и передавайте туда текст который должен отображатся под фото.
Вот полный код:
<code>
@bot.message_handler(commands=['start'])
def process_start(message):
    bot.send_message(
        chat_id=message.chat.id,
        text="Привет, я сейчас отправлю тебе картинку",
    )

    send_photo(message, "Тебе нравится эта картинка?")

def send_photo(message, text):
    bot.send_photo(
        chat_id=message.chat.id,
        photo=open("filename.png", 'rb'),
        caption=text,
    )
    bot.register_next_step_handler(
        message,
        question,
    )

def question(message):
    if message.text == "Да":
        bot.send_message(
            chat_id=message.chat.id,
            text="Вот и здорово, отправлю ее еще раз",
        )

        send_photo(message, "Тебе нравится эта картинка?")
    else:
        send_photo(message, "А если подумать?")
</code>


Очистка строки, удаление одиночных символов апострофов из списка слов содержащих апостроф
Всех приветствую!
Есть некие трудности в обработки списков. Предположим есть список:

words = ["we're", "'", "'''", "he's", "'abc", "ghe'", 'hello', "'h", "h'"]

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

from string import punctuation

Результат должен выглядеть так:

result_words = ["we're", "he's", "'abc", "ghe'", 'hello', "'h", "h'"]


как работает данный сценарий?
столкнулся с препятствиями при изучении ООП python'а. до меня не доходит, почему этот код работает:
<code>
class Smth:

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

    def num(self):
        print(self.x)

p = Smth(5)

p.num()
</code>
не понимаю зачем здесь нужен метод init и зачем мы пишем self.x = x
всем ответившим огромное спасибо!

class Smth:  # Это объявление класса или типа

    def __init__(self, x): # Как ужe написал @entithat
                           # эта функция запускается, когда объявляется
                           # переменная p ( ниже )
        self.x = x         # Здесь мы присвоили свойству значение 5
                           # при объявлении переменной p ( чуть ниже )
    def num(self):         # Это метод. Если у нас есть переменная
        print(self.x)      # типа Smth, значит все переменные
                           # или экземпляры могут вызвать данный метод

p = Smth( 5 ) # В этой строке мы говорим, что будет переменная
              # p типа Smth
p.num()       # вызывается метод класса и печатается свойство p ( т.е. 5 )


Как сохранить значение переменной в рекурсии ( значение - это число). Python
Я решал задачку. В ней нужно найти мультипликативную постоянство, то есть количество раз, которое вы должны умножать цифры,пока не дойдете до единственной цифры.На пример, дано число 39. 3*9 = 27. 2*7 = 14. Затем 1*4 = 4. И останавливаемся. Всего "шагов" 3.Причем, дается только 1 агрумент(number). Вот мой код:
<code>
from functools import reduce

# amount - total length of blocks
# 67 - number
# ['6','7']
def rec(number, *args):
    summ = args
    amount = 0
    t1 = tuple(map(int, list(str(number))))
    l1 = len(t1)
    amount += l1
    lst = list(summ)
    lst.append(1)
    if amount > 1:
        result1 = reduce(lambda x, y: x * y, t1)
        rec(result1, lst)
    else:
        return sum(list(args))
</code>

Еще вариант без строк, с двойной рекурсией. Значение переменной сохраняется через позиционный аргумент (
y в этом примере):

def rec(x, y=0):
    f = lambda i: i if i<10 else f(i//10) * (i%10)
    return y if x<10 else rec(f(x), y+1)

rec(39)  # 3


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

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

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

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

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

Мне выводит ошибку TypeError: 'int' object is not iterable. Я хочу вывести средний балл нажатиями на несколько кнопок.
<code>
import tkinter as tk
from tkinter import *

win = Tk()
win.geometry('450x250')
win.resizable(0,0)
win.title('Средний балл')

def btn_click(item):
    global expression
    expression = list(map(int, item)) / len(item)
    input_text.set(expression)
def bt_clear():
    global expression
    expression = ""
    input_text.set("")
expression = ""

input_text = StringVar()

myLabel1 = Label(win, textvariable=input_text, font=("Montserrat", 15))
myLabel1.pack()

one = Button(win, font=("Montserrat", 12), bg='#dadada', text="1", width=4, command=lambda: btn_click(1))
one.pack()
two = Button(win, font=("Montserrat", 12), bg='#dadada', text="2", width=4, command=lambda: btn_click(2))
two.pack()
three = Button(win, font=("Montserrat", 12), bg='#dadada', text="3", width=4, command=lambda: btn_click(3))
three.pack()
four = Button(win, font=("Montserrat", 12), bg='#dadada', text="4", width=4, command=lambda: btn_click(4))
four.pack()
five = Button(win, font=("Montserrat", 12), bg='#dadada', text="5", width=4, command=lambda: btn_click(5))
five.pack()

win.mainloop()
</code>

в функцию
btn_click(item) нужно передать список например
['1','2','3']

expression = sum(map(int, item)) / len(item)

sum(map(int, item)) -
map преобразует каждый элемент в число, а
sum подсчитает сумму. Ну, а
len(item) поделит на количество элементов

import tkinter as tk
from tkinter import *

win = Tk()
win.geometry('450x250')
win.resizable(0, 0)
win.title('Средний балл')

def btn_click(item):
    global expression
    expression = sum(map(int, item)) / len(item)
    input_text.set(expression)

def bt_clear():
    global expression
    expression = ""
    input_text.set("")

expression = ""

input_text = StringVar()

myLabel1 = Label(win, textvariable=input_text, font=("Montserrat", 15))
myLabel1.pack()
mylist = []
one = Button(win, font=("Montserrat", 12), bg='#dadada', text="1", width=4,
             command=lambda: mylist.append(1))
one.pack()
two = Button(win, font=("Montserrat", 12), bg='#dadada', text="2", width=4,
             command=lambda: mylist.append(2))
two.pack()
three = Button(win, font=("Montserrat", 12), bg='#dadada', text="3", width=4,
               command=lambda: mylist.append(3))
three.pack()
four = Button(win, font=("Montserrat", 12), bg='#dadada', text="4", width=4,
              command=lambda: mylist.append(4))
four.pack()
five = Button(win, font=("Montserrat", 12), bg='#dadada', text="5", width=4,
              command=lambda: mylist.append(5))
five.pack()
sr = Button(win, font=("Montserrat", 12), bg='#dadada', text="Среднее число", width=20,
            command=lambda: btn_click(mylist))
sr.pack()
win.mainloop()


Определение когда print() перестает писать Python [закрыт]

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

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

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

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

Всем привет! У меня появился вопрос по поводу print() в Python. Для одной фичи мне нужно реализовать функцию, где нужно будет определить когда перестанет в консоль писать значение. Можете пожалуйста подсказать. Максимум до чего я додумался это:
<code>
eyes2 = cv2.rectangle(img, (x+ex, y+ey), (x+ex + ew, y+ey + eh), (255, 0, 0), 2) # тут выдает значение, а я его компилирую yes
if eyes2.any():
   success2221 = "yes"
   success222 = print(success2221)
if 'yes' in success222:
   print('Есть такой текст')
if 'no' in success222:
   print('Нет такого текста')
</code>
Помогите мне пожалуйста!

Я наконец то понял вопрос. Проблема в том, что
print() возвращает
None

print() всегда возвращает
None в любом случае

success2221 = "yes"
success222 = print( success2221 ) # тут выводится yes
print( success222 )               # тут печатается None

Есть функции которые возвращают значение, например, квадратный корень, а есть функции, которые никогда ничего не возвращают в качестве результата ( они просто что-то выполняют и ничего не возвращают ). Если вы сделаете свою функцию и ничего не вернете в качестве
result, то Python сам неявно добавит в код
result = None. Точно так же и в функции
print() написано, что
result = None
Поэтому не зависимо от того, что делает
print() её результат

print( print( '' ) ) всегда будет
None


operands could not be broadcast together with shapes (3,3) (3,2)
Пытаюсь разобраться с многослойным персептроном
при обратном распространении считаю ошибки и корректирую веса.
вывожу размерность входных данных (inputs). = (150,3) и соответственно (3,150) при транспонировании
deltah также имеет размерность (150,3)
hidden1 тоже
в итоге, когда пытаюсь запустить код:

                deltah = hidden1*beta*(1.0-hidden1)*(np.dot(deltao,np.transpose(weights2)))     #  ошибки скрытых  нейронов
     58         print("deltah ", deltah, "\t", "shape", deltah.shape)
---> 59         updatew1 = teta*(np.dot(np.transpose(inputs),deltah)) + Alfa*updatew1    # корр. весов
     60         print("trans", np.transpose(inputs).shape)
     61         print("inputs", inputs, "updatew1", updatew1)

получаю ошибку
operands could not be broadcast together with shapes (3,3) (3,2) на участке выше
но, когда вместо
updatew1 = teta*(np.dot(np.transpose(inputs),deltah)) + Alfa*updatew1пишу

updatew1 = teta*(np.dot(np.transpose(inputs),deltah[:, :-1])) + Alfa*updatew1

все прекрасно, хотя по идее,
deltah[:, :-1]- матрица, за исключением последнего столбца
shape у deltah[:, :-1] получается (150, 2)
по моей логике, (3, 150) * (150, 3) лучше, чем (3, 150) * (150, 2), но видимо нет. помогите распутаться :)

У вас проблема не в умножении, а в сложении.
Умножение
np.dot(np.transpose(inputs),deltah) даёт массив размером
(3,3), а произведение
np.dot(np.transpose(inputs),deltah[:,:-1]) дает массив  размером
(3,2)
Соответственно, если у вас
inputw1 имеет размер
(3,2), то сложение c массивом размером
(3,3) выдаёт ошибку.


Прерывается проверка списка в цикле

import os
import win32api

path = ['E:/keys.txt', 'G:/keys.txt']  # Эти файлы не существуют

result_path = path
for x in path:
    if os.path.isfile(x) is False:
        volume_lbl = win32api.GetVolumeInformation(x[:3])
        print(f'Ключ отсутствует на накопителе {x[:3]} с меткой {volume_lbl[0]}!')
        result_path.remove(x)

Функция должна проверять наличие файла по пути, содержащемся в списке. Проблема в том, что если файлы не существуют, цикл
for прерывается, не доходя до конца списка
path. После выполнения result_path будет содержать ['G:/keys.txt'], хотя по моей логике список должен остаться пустым.
Я пробовал инвертировать if, делать цикл while (а-ля C++) - не помогло.
Как починить?

Всё дело в модели управления памятью в python.
Вы создаёте объект list path
Потом присваиваете result_path его "значение".
Внутри python это работает не так, как ожидает большинство новичков.
result_path и path ссылаются на один и тот же list.
В результате, при изменении в result_path изменяется path.
Это приводит к работе Вашего цикла for не как Вы задумывали.
Что делать?
Использовать например такие конструкции:

result_path  = deepcopy(path)

или

result_path  = list(path)


Как сделать удаление инлайн клавиатуры после нажатия?
@searchIT_bookbot - пример. Когда нажал на кнопку, то старая клавиатура удаляется и появляется новая. У нее новый текст сверху и кнопки.
Библиотека - pytelegrambotapi, язык - пайтон
Сначала я использовал edit_message_reply_markup, но там нельзя поменять текст над кнопками

<code>
update.message.reply_text(text=f"some text", reply_markup=ReplyKeyboardRemove(),)
</code>
попробуйте это.


Почему здесь не правильный вывод?
Почему здесь при вводе 3, выводится "Опасная температура. Сильное переохлаждение, есть шанс смерти", а при 4 ничего не выводится
<code>
while True:
    temp = input("Введи температуру тела: ")
    if temp >= '35.8' and temp <= '36.9':
        print("- Норма")
    elif temp >= '37' and temp <= '37.1':
        print("- Переутомление или начинаешь заболевать")
    elif temp >= '37.2' and temp <= '39.9':
        print("- Ты заболел(а)")
    elif temp >= '40' and temp <= '42.9':
        print("- Опасная температура! Сильный жар, есть шанс смерти")
    elif temp >= '33' and temp <= '35.7':
        print("- Переохлаждение")
    elif temp >= '28' and temp <= '32.9':
        print("- Опасная температура! Сильное переохлаждение, есть шанс смерти")
    elif temp <= '27.9':
        print("- Смерть 90%")
    elif temp >= '43':
        print("- Смерть 90%")
</code>

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

while True:
    temp = float(input("Введи температуру тела: "))
    if temp >= 35.8 and temp <= 36.9:
        print("- Норма")

кстати питон позволяет такие сравнения записывать проще:

if 35.8 <= temp <= 36.9:

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

if temp >= 35.8 and temp <= 36.9:
    print("- Норма")
elif temp >= 37 and temp <= 37.1:
    print("- Переутомление или начинаешь заболевать")

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

if 35.8 <= temp < 37.0:
    print("- Норма")
elif 37.0 <= temp < 37.2:
    print("- Переутомление или начинаешь заболевать")

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


Изменение содержимого элементов списка
Я хочу из этого

mas = ['1', '2.0', '3,0', '4%', '5.0%', '6,0%', 'seven1', 'eight.', 'nine,', 'ten%', ',11', '12,', '...', '.13', '14.', '']
n = True

получить это

mas = ['1', '2.0', '3.0', '4', '5.0', '6,0', 'seven1', 'eight.', 'nine.', 'ten', ',11', '12,', '...', '.13', '14.', '0']
n = False

Все ',' заменить на '.'
Все '%' удалить
Все '' заменить на '0'
переменная n принимает значение False, если переменная списка содержит буквы
переменная n принимает значение False, если переменная списка не содержит цифры
переменная n принимает значение False, если переменная списка начинается или заканчивается на '.'


Какая допустимая погрешность в исчислении производной по общей формуле и по частной?
Допустим, у нас есть функция с одной переменной:

f(x) = np.log((x + 1)**2 + 1)

Нам нужно исчислить ее производную в каждой точке на промежутке от -50 до 50.
Мы можем найти ее производную(частную), ее формула:

f'(x) = 2 * (x + 1) / (x**2 +1)

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

f'(x) = (f(x + e) - f(x))/ e

(при е = 0.01, примерно)
Погрешность(разница модулей частной и общей формулы производной, в одинаковых точках) в значении  от краев промежутка( - 50 и 50) к нулю равняется -+ 0.0016( на краях промежутка) и до -1.211 ( в точке 1)
Вопрос:
Допустима ли такая погрешность в исчислении?
Допускается ли такая погрешность ОБЩЕЙ ФОРМУЛЫ ПРОИЗВОДНОЙ, если ее использовать в поиске минимума функции(градиентный спуск)

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


Может ли лечь сайт при его непрерывном обновлении?
Пишу браузер. Хочу узнать, можно ли положить простенький сайт, если в течение, к примеру, 10 минут с помощью цикла постоянно обновлять страницу? Вообще можно ли таким способом довести сайт до болезненного состояния?

Вообще говоря, короткий ответ на Ваш вопрос - "можно".
Правда, "лежать" сайт будет ровно столько, сколько вы его "долбите" запросами.
Дело в том, что  даже на "простеньких" сайтах некотрые страницы генерируются динамически, например, вытаскивая инфу из базы. С точки зрения человека затраты времени на это - минимальны, но по сравнению с отдачей статической страницы такая последовательность - запрос данных из базы, построение страницы, выдача страницы пользователю - довольно долгая и затратная поо ресурсам.
Так что, если Вы обнариужите на сайте такую страницу - вы смело можете попробовать его "положить".
Теперь - как с таким бороться. Во первых, существуют rate limiters - такие штуки, которые ограничивают активность слишком активных.
Во вторых, многие сайта находятся за какой тоо штукой типа cloudflare - это такой "глобальный прокси", который как раз предназначен, в частности, для защиты от DDOS - атак.
Надеюсь, этой инфы будет для Вас достаточно, чтобы продолжить дальнейший поиск самостоятельно!


Python3 - как преобразовать строку в ansi?
Подскажите, у меня есть код вида
<code>
str0 ="\x31\xc9\xf7\xe1"
</code>
это бинарные данные, которые куда-то копируются. Этот код прекрасно работает в Python2, но при переходе на третью версию после каждого символа появляется еще \00, вероятно из-за каких-то внутренних особенностей юникода в питоне. Вопрос - мне преобразовать строку в ansi , в общем чтобы было как в python2 ?

Это не бинарные данные. Бинарные данные (bytes) в Питоне задаются с литеры b
b'...'.
Попробуйте преобразовать вашу строку в bytes и работать уже с ними.

bytes0 = str0.encode('latin-1')
print(bytes0)

b'1\xc9\xf7\xe1'


простейшая валидация e-mail без regexp и без использования list
Уважаемые форумчане, добрый вечер! Есть вопрос, понимаю смысл ошибки, но не могу найти правильное решение данной проблемы. Имеется следующая задача: напишите валидатор для поля email, используя только пройденный материал + инструкцию, находящуюся в этой задаче. Валидатор - это программа, которая проверяет корректность введенных данных. Если введенный адрес электронной почты валиден, то выведите YES, иначе NO.
Входные данные: email - строковое значение
Выходные данные: YES - если email валиден, NO - если email не валиден
Маска для поля email: @.___ - где ___ может содержать a-z, A-Z, 0-9 и точки. Каждый из блоков, кроме первого (до символа @) должен содержать хотя бы одну букву.
Пользоваться регулярными выражениями и списками нельзя, пытаюсь организовать посимвольное рсанение и проверку того, что после @ точка не является следующим символом.

# Простой валидатор почтового адреса (без использования regual expression)

# ввод строки пользователем
input_adr = input()

# счетчик первого символа (проверяем есть ли в адресе хотя бы один символ)
inint_count = 0

# верный адрес почты
correct_adr = '[email protected]'

# поиск символов '.', '@' во входой строке
for i in input_adr:
    at = '@'
    dot = '.'

# проверяем наличие первого символа в строке, которую ввел пользователь
# до символа @, первый блок
for inint_count in input_adr:
    if((ord(input_adr[inint_count])>= 48 and ord(input_adr[inint_count])<= 57) or
       (ord(input_adr[inint_count])>=64 and ord(input_adr[inint_count])<=90)
       or (ord(input_adr[inint_count])>= 97 and ord(input_adr[inint_count])<= 122)):
        inint_count += 1
# проверяем условия, что после символа @ идет хотя бы один символ,
# что символы @ и . не идут вместе
if(inint_count > 0 and at > 0  and (dot-at) > 0 and (dot+1) < len(input_adr)):
    print("Yes")
else:
    print("No")

Возникающая ошибка:

  File "main.py", line 20, in <module>
if((ord(input_adr[inint_count]>= 48) and ord(input_adr[inint_count]<= 57)) or

TypeError: string indices must be integers

if((ord(input_adr[inint_count]>= 48) and ord(input_adr[inint_count]<= 57)) or

считайте скобки - у вас получается следующее

ord(input_adr[inint_count]>= 48)

т.е. вы
ord делаете от булева типа
ord(True) или
ord(False)
скорее всего вы имели в виду

ord(input_adr[inint_count]) >= 48

P.S.
а вообще код по указанным правилам я бы сделал так:

address = '[email protected]'

address_parts = address.split('@')

checked = address.count('@') == 1

# проверить наличие точки
checked &= '.' in address_parts[1]

# проверить наличие хотя бы одной буквы
checked &= any(letter.isalpha() for letter in address_parts[1])

# проверить наличие букв, цифр и точки
checked &= all((letter.isalpha() or letter.isdigit() or letter == '.') for letter in address_parts[1])

# ВНИМАНИЕ: в условии не сказано проверять блок до @, так что последнюю проверку можно удалить скорее всего
# проверить наличие букв, цифр и точки
checked &= all((letter.isalpha() or letter.isdigit() or letter == '.') for letter in address_parts[0])

print(checked)

P.P.S.
если вообще ничего нельзя использовать, то можно вот такой код:

address = '[email protected]'

checked = True

# проверить кол-во символов @
symbols_count = 0

for i in address:
    symbols_count += 1 if i == '@' else 0

checked &= symbols_count == 1

# найти координату '@'
symbol_pos = 0

for pos in range(len(address)):
    if address[pos] == '@':
        symbol_pos = pos + 1
        break

# проверить наличие точки
isDot = False
for pos in range(symbol_pos, len(address)):
    isDot |= address[pos] == '.'

checked &= isDot

# проверить наличие хотя бы одной буквы
isAlpha = False
for pos in range(symbol_pos, len(address)):
    isAlpha |= ord('a') <= ord(address[pos]) <= ord('z') or ord('A') <= ord(address[pos]) <= ord('Z')

checked &= isAlpha

# проверить наличие букв, цифр и точки
isLetters = True
for pos in range(symbol_pos, len(address)):
    isLetters &= ord('a') <= ord(address[pos]) <= ord('z') or ord('A') <= ord(address[pos]) <= ord('Z') or ord('0') <= ord(address[pos]) <= ord('9') or address[pos] == '.'

checked &= isLetters

print(checked)

P.P.P.S.
кок который оценивает не только часть после @, но и отдельно блоки между точками в этой части:

address = '@a.com'

checked = True

# проверить кол-во символов @
symbols_count = 0

for i in address:
    symbols_count += 1 if i == '@' else 0

checked &= symbols_count == 1

# найти координату '@'
symbol_pos = 0

for pos in range(len(address)):
    if address[pos] == '@':
        symbol_pos = pos + 1
        break

# проверить наличие точки
isDot = False
for pos in range(symbol_pos, len(address)):
    isDot |= address[pos] == '.'

checked &= isDot

# проанализировать блоки (расположенные между точками)
start = symbol_pos
for index in range(symbol_pos, len(address)):
    if address[index] == '.' or index == len(address) - 1:
        finish = index if address[index] == '.' else (index + 1)

        # проверить наличие хотя бы одной буквы
        isAlpha = False
        for pos in range(start, finish):
            isAlpha |= ord('a') <= ord(address[pos]) <= ord('z') or ord('A') <= ord(address[pos]) <= ord('Z')

        checked &= isAlpha

        # проверить наличие букв, цифр и точки
        isLetters = True
        for pos in range(start, finish):
            isLetters &= ord('a') <= ord(address[pos]) <= ord('z') or ord('A') <= ord(address[pos]) <= ord('Z') or ord('0') <= ord(address[pos]) <= ord('9')

        checked &= isLetters

        start = index + 1

print(checked)


Программа ничего не делает
Сразу оговорюсь, что являюсь новичком в программировании. Возникла проблема при решении задачи из книги саммерфилда по питону (aveage2), где частью задания является сортировка списка от меньшего к большему. Посмотрел некоторые алгоритмы, решил использовать сравнение попарно. Написал код, а он ничего не делает со списком, будто бесконечно где-то застрял, и выполняет N-ное действие бесконечное кол-во раз(было видно по загрузке ЦП). Подскажите пожалуйста что и где стоит исправить, буду нереально благодарен. Если что, список представлен просто ради того, чтобы он был, в основной программе пользователь сам забивает числа в список.
Примечание: задачу надо решить без использования list.sort()
<code>
List = [12, 56, 3, 38, 2, 16]

x = 0

while x < len(List):
try:
    if List[x] <= List[x + 1]:
        x += 1
    else:
        if x - 1 < 0:
            a = 0
            List.insert(a, List[x + 1])
            List.remove(List[x + 2])
            x = 0
        else:
            List.insert(x - 1, List[x + 1])
            List.remove(List[x + 2])
            x = 0
except x + 1 == len(List):
    print(List)
    break
</code>

Я думаю, что ошибка происходит по следующей причине:
вы используете методы insert и remove в списке, одновременно итерируясь ("проходя") по нему.
Это приводит вот к какому результату: (я специально пишу объяснение очень простыми словами)
Вы нашли пару элементов. По сути, Вам нужно поменять их местами.
Но в тот момент, когда Вы сделалии remove элемента из списка - список изменился. Он стал другой длинны, и тот элемент, с которым Вы меняете "неподходящий" элемент местами, встал на его место.
Исправить это просто: достаточно вместо insert и remove менять местами элементы, просто исопльзуя присваивание.
Что, в общем то, и показано в другом ответе на Ваш вопрос. (
List[i], List[i + 1] = List[i + 1], List[i] - это и есть операция "поименять местами два элемента" )


остаток при делении равен одному
есть задача:
На колесе рулетки карманы пронумерованы от 0 до 36. Ниже приведены цвета карманов:

карман 0 зеленый;
для карманов с 1 по 10 карманы с нечетным номером имеют красный цвет, карманы с четным номером – черный;
для карманов с 19 по 28 карманы с нечетным номером имеют красный цвет, карманы с четным номером – черный;
для карманов с 29 по 36 карманы с нечетным номером имеют черный цвет, карманы с четным номером – красный.

Напишите программу, которая считывает номер кармана и показывает, является ли этот карман зеленым, красным или черным. Программа должна вывести сообщение об ошибке, если пользователь вводит число, которое лежит вне диапазона от 0 до 36.
Написал следующим образом:
<code>
a = int(input())
if a == 0:
    print("зеленый")
elif (1 <= a <= 10) and a % 2 == 1:
    print("красный")
elif (1 <= a <= 10) and a % 2 == 0:
    print("черный")
elif (11 <= a <= 19) and a % 2 == 1:
    print("черный")
elif (11 <= a <= 19) and a % 2 == 0:
    print("красный")
elif (19 <= a <= 28) and a % 2 == 1:
    print("красный")
elif (19 <= a <= 28) and a % 2 == 0:
    print("черный")
elif (29 <= a <= 36) and a % 2 == 1:
    print("черный")
elif (29 <= a <= 36) and a % 2 == 0:
    print("красный")
else:
    print("ошибка ввода")
</code>
при вводе 19 выводится "черный", но должно выводится "красный". т.к. 19 остаток при на 2 = 1.
где может быть ошибка?

Условия неполные, не описан промежуток от 11 до 18.
А в коде 19 подпадает под условие
<code>
elif (11 <= a <= 19) and a % 2 == 1:
    print("черный")
</code>


Как переместить объект в python (Pygame)

def _cheсk_events(self):
        """Реагировать на нажимание клавиш и мыши"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    #Перемистить корабль вправо
                    self.x = self.ship.rect.pop(0)
                    self.ship.rect.x += 1
                    self.ship.rect.append(0,x)

Когда я запускаю код пишет трейсбек:

Traceback (most recent call last):
  File "C:\Users\LENOVO\Desktop\Пайтон АртемЧ\My_work\Alien_Invasion\alien_invasion.py", line 59, in <module>
    ai.run_game()
  File "C:\Users\LENOVO\Desktop\Пайтон АртемЧ\My_work\Alien_Invasion\alien_invasion.py", line 53, in run_game
    self._cheсk_events()
  File "C:\Users\LENOVO\Desktop\Пайтон АртемЧ\My_work\Alien_Invasion\alien_invasion.py", line 36, in _cheсk_events
    self.ship.rect.x += 1
AttributeError: 'list' object has no attribute 'x'

Полный код:

import sys

import pygame

from settings import Settings

from ship import Ship

class AlienInvasion:
    """ Класс всей игры """

    def __init__(self):
        """Атрибуты """
        pygame.init()
        self.settings = Settings()

        self.screen = pygame.display.set_mode((self.settings.screen_width,
                                               self.settings.screen_height))
        pygame.display.set_caption('Alien Invasion')

        self.ship = Ship(self)

        # цвет фона
        self.rgb = (self.settings.rgb_color)

    def _cheсk_events(self):
        """Реагировать на нажимание клавиш и мыши"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    #Перемистить корабль вправо
                    self.x = self.ship.rect.pop(0)
                    self.ship.rect.x += 1
                    self.ship.rect.append(0,x)

    def _update_screen(self):
        """Обновить экран и нарисовать его"""
        self.screen.fill(self.rgb)
        self.ship.blitme()

        pygame.display.flip()

    def run_game(self):
        """ Начать игру """

        while True:
            self._cheсk_events()
            self._update_screen()

if __name__ == '__main__':
    ai = AlienInvasion()
    ai.run_game()

Если я правильно понимаю, чинить ваш код нужно примерно так (в экземпляре класса
AlienInvasion переменная
self.x совершенно не нужна, для вычислений достаточно временной локальной переменной
x):

x = self.ship.rect.pop(0)
x += 1
self.ship.rect.append(0,x)

Я только не понял, зачем всё так сложно сделано: вынуть элемент из списка, поменять, вставить обратно. Можно же поменять элемент прямо внутри списка:

self.ship.rect[0] += 1

Ещё лучше было бы, если бы
rect был не списком, а объектом с "говорящими" полями, вроде того же
.x, чтобы не обращаться к списку по непонятным индексам, а обращаться к этим понятным полям, но пока хотя бы так.


Разделение матрицы на подматрицы
Вводится N - размер матрицы, K - размер подматриц.
Далее вводится матрица
Допустим N = 3, K = 2
Наша матрица N*N

1 2 1
1 1 2
1 1 1

Все подматрицы размера K*K:

[1 2
 1 1]

[2 1
 1 2]

[1 1
 1 1]

[1 2
 1 1]

Как сделать такое же нахождение подматриц? От чего отталкиваться?
Единственное что сделал - создание трёхмерного массива матриц k*k заполненных нулями.

если в лоб, то так:

matrix = [[1, 2, 3, 'a'], [4, 5, 6, 'b'], [7, 8, 9, 'c'], [10, 11, 12, 'd']]
size = (3, 2)

for j in range(len(matrix) - size[1] + 1):
    for i in range(len(matrix[j]) - size[0] + 1):
        for y in range(size[1]):
            line = []
            for x in range(size[0]):
                line.append(matrix[j + y][i + x])
            print(line)
        print()

грубо говоря вам надо пройтись по матрице так чтобы 1 элемент подматрицы был в диапазоне:
matrix_width - submatrix_width,
matrix_height - submatrix_height
а дальше используя координаты первого элемента находите все остальные элементы подматрицы в матрице
или если это записать на уровне формулы, то:

submatrix[x][y] = matrix[i + x][j + y]

где (i, j) - координаты первого (левый верхний) элемента подматрицы в матрице
P.S.
код можно чуть-чуть упростить (для любителей разврата):

[[[print([matrix[j + y][i + x] for x in range(size[0])]) for y in range(size[1])] + [print()] for i in range(len(matrix[j]) - size[0] + 1)] for j in range(len(matrix) - size[1] + 1)]


Получить индексы Numpy массива
Всем привет.
У меня есть такой Numpy массив:

array([16, 17, 1, 3, 8, 10, 2, 19, 14, 18, 15, 6, 11, 13, 5, 4, 9, 0, 7, 12])

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

[19: 7, 18: 9, 17: 1, 16: 0, 15: 10 ...]

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

Если хотите оставаться именно в рамках
numpy и пользоваться его скоростью, то можно сделать так:

import numpy as np

arr = np.array([16, 17, 1, 3, 8, 10, 2, 19, 14, 18, 15, 6, 11, 13, 5, 4, 9, 0, 7, 12])
sorted_idx = arr.argsort()[::-1]
sorted_arr = arr[sorted_idx]
print(np.stack([sorted_arr, sorted_idx]))

Вывод:

[[19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0]
 [ 7  9  1  0 10  8 13 19 12  5 16  4 18 11 14 15  3  6  2 17]]

В
numpy есть сортировка индексов массива. Тут я получаю сначала такую сортировку, переворачиваю её, чтобы в начале был максимум, потом легко получить значения из массива по индексам. Ну и, если нужно - объединить индексы и значения в один массив. Сортировка индексов в
numpy должна быть довольно быстрой.


Поиск дружественных пар чисел с помощью циклов

Составьте программу для решения задачи. Два натуральных числа называются дружественными, если каждое из них равно сумме всех
делителей другого (само другое число в качестве делителя не
рассматривается). Например, 220 (1+2+4+5+10+11+20+22+44+55+110=284) и
284 (1+2+4+71+142=220) – дружественные числа. Пары необходим о
выводить по одной в строке, разделяя пробелами. Найти все пары
натуральных дружественных чисел, меньших 10 000.

Решения на эту задачу уже есть в интернете, но, насколько я понял, они с употреблением массивов, что мне не подходит. Я хотел бы сделать эту задачу только при использовании циклов, вроде у меня и получилось:
<code>
for i in range(1, 9999):
    for k in range(1, i // 2 + 1):
        if i % k == 0:
            sum1 += k
    for j in range(i + 1, 9999):
        if j == i:
            continue
        for k in range(1, j // 2 + 1):
            if j % k == 0:
                sum2 += k
        if sum1 == j and sum2 == i:
            print(i, j, sep=' ')
    sum1, sum2 = 0, 0
</code>
Но решение настолько долгое, что я не хочу ждать даже вторую пару чисел. Пожалуйста, помогите с оптимизацией.

Вы перебираете все пары чисел
1 <= i < j < 10000 и проверяете что
sum_of_proper_divisors(i) = sum_of_proper_divisors(j). Технически это правильный способ, но как долго это будет работать? Я взял вашу программу и сделал из неё считалку итераций:

c = 0
for i in range(1, 9999):
    for k in range(1, i // 2 + 1):
        c += 1
    for j in range(i + 1, 9999):
        c += j // 2
print(c)

$ python count-ops.py
166579182499

167 миллиардов операций. Мой компьютер делает около 10 миллионов итераций в секунду. 16700 секунд - ожидаемое время работы вашего кода.
Вместо двух циклов достаточно одного по
i. Второе число вычисляется как
j = sum_of_proper_divisors(i). Ещё одно вычисление нужно чтобы проверить второе соотношение -
i == sum_of_proper_divisors(j). На вскидку, так будет в 10000 раз меньше итераций. Проверяем:

def sum_of_proper_divisors(n):
    s = 0
    for k in range(1, n // 2 + 1):
        if n % k == 0:
            s += k
    return s

for i in range(1, 10000):
    j = sum_of_proper_divisors(i)
    if i < j <= n and i == sum_of_proper_divisors(j):
        print(i, j)

$ time python amicable-numbers.py
220 284
1184 1210
2620 2924
5020 5564
6232 6368

real  0m1.582s
user  0m1.576s
sys   0m0.004s

Ваша задача решена. Идем дальше.
NB:
range(?, 9999) исключает
9999 из цикла. Вам повезло, это не влияет на результат, но цикл должен быть длиннее на единицу.
Если к сумме которую мы считаем добавить
n, то получится сумма всех делителей числа
n (любое число делится само на себя, но мы этот делитель не учитываем). Для суммы всех делителей есть функция делителей. Статья про неё написана несколько сложно, но разобраться при желании можно. Сумму всех делителей числа можно выразить как произведение некоторых множителей, которые зависят от разложения этого числа на простые. Получается такая пара функций:

def sum_of_divisors(n):
    s = 1
    i = 2
    j = n
    j_sqrt = math.isqrt(j)
    while i <= j_sqrt:
        if j % i == 0:
            f = 1
            m = 1
            while j % i == 0:
                j //= i
                m *= i
                f += m
            j_sqrt = math.isqrt(j)
            s *= f
        i += 1
    if j > 1:
        s *= j + 1
    return s

def sum_of_proper_divisors(n):
    return sum_of_divisors(n) - n

Получается сложнее чем ваш вариант, зато быстрее. Кроме того это факультатив.

$ time python amicable-numbers.py
220 284
1184 1210
2620 2924
5020 5564
6232 6368

real  0m0.066s
user  0m0.064s
sys   0m0.004s

66 миллисекунд, из них 25 - загрузка программы в память.
16 секунд для миллиона:

$ time python amicable-numbers-1000000.py
220 284
1184 1210
2620 2924
...
802725 863835
879712 901424
898216 980984

real  0m15.282s
user  0m15.276s
sys   0m0.004s

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


Как остановить цикл kivy, если в файле так же имеется серверная часть(следующая после цикла)?
Я пишу программу для правильной работы которой, после взаимодействия с диалоговым окном kivy, оно должно закрываться, чтобы не перекрывать выполнение скрипта на окне cmd. Проблема заключается в том, что я нашёл только 2 варианта развития ситуации: либо диалоговое окно так и не закрывается; либо закрывается весь файл целиком, включая и серверную часть, так как kivy не умеет(насколько я знаю) завершать выполнение своего цикла, пока скрипты всё ещё работают на фоне. Есть ли какие нибудь компромиссы этой проблеме? Например:

Свертывание или скрытие kivy окна, что при этом не закрывает его
Выведение окна cmd поверх всех окон

Или что либо подобное.
Программа пишется для OC - Windows

Я не знаю будет ли полезен этот ответ, но конкретно в моём случае - это помогло.
Я добавил данные строки после основного класса kivy и теперь всё как надо:
<code>
win32console.FreeConsole()

win32console.AllocConsole()
</code>
Консоль выводится поверх диалогового окна, что вполне хорошо.
Интересно то, что, работает это только из за того, что первая функция работает некорректно - она пытается закрыть консоль, но по итогу диалоговое окно просто виснет(а не крашится весь файл, как должно быть). Конечно, если бы не этот баг, то окно cmd так и не смогло бы открыться.


Преобразование списка словарей
Имеется список словарей следующего вида:

a = [
{'animal': {'cats': {'шотландец': 1}}, 'id': 1},
{'animal': {'dogs': {'овчарка': 1}, 'fish': {'окунь': 1}, 'cats': {'сфинкс': 1}},'id': 2},
{'animal': {'birds': {'синица': 1}, 'fish': {'сельдь': 1}}, 'id': 3},
{'animal': {'dogs': {'овчарка': 1}, 'birds': {'воробей': 1}}, 'id': 4}
....]

Необходимо преобразовать его в следующий вид (учитывая, что брать нужно только ключи  'cats', 'dogs', 'birds':

[{"word": 'шотландец', 'count': 1, 'id': [1]},
{"word": 'овчарка', 'count': 2, 'id': [2, 4]},
{"word": 'сфинкс', 'count': 1, 'id': [2]},
{"word": 'синица', 'count': 1, 'id': [3]},
{"word": 'воробей', 'count': 1, 'id': [4]}]

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

attribute = ['cats', 'dogs', 'birds']
animals = []

for i in range(0, len(a)):
   for key in a[i]:
     if key == 'animals':
        for attr in attribute:
            an = a[i][key].get(attr, {})
            animals.append(an)
            resw = []
            for key, value in an.items():
                result["entity"] = key
                result["count"] = value
            resw.append(result)

results = [x for x in named_entities if x]

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

initial = [
{'animal': {'cats': {'шотландец': 1}}, 'id': 1},
{'animal': {'dogs': {'овчарка': 1}, 'fish': {'окунь': 1}, 'cats': {'сфинкс': 1}},'id': 2},
{'animal': {'birds': {'синица': 1}, 'fish': {'сельдь': 1}}, 'id': 3},
{'animal': {'dogs': {'овчарка': 1}, 'birds': {'воробей': 1}}, 'id': 4}
]

animals = dict()

for obj in initial:
    for animal in obj['animal']:
        if animal not in ('cats', 'dogs', 'birds'):
            continue

        name = list(obj['animal'][animal].keys())[0]
        count = obj['animal'][animal][name]

        if name not in animals:
            animals[name] = {'word': name, 'count': 0, 'id': []}

        animals[name]['count'] += count
        animals[name]['id'] += [obj['id']]

res = list(animals.values())

print(res)

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

animals = dict()

for obj in initial:
    for animal in obj['animal']:
        if animal not in ('cats', 'dogs', 'birds'):
            continue

        for name, count in obj['animal'][animal].items():

            if name not in animals:
                animals[name] = {'word': name, 'count': 0, 'id': []}

            animals[name]['count'] += count
            animals[name]['id'] += [obj['id']]

res = list(animals.values())