Простая задача Python [закрыт]

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

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

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

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

есть такая задача:

Напишите программу, которая будет принимать числа от пользователя и суммировать их, пока он не напишет слово «sum».
Когда пользователь напишет слово «sum», должна быть выведена сумма всех чисел и начат процесс заново.
Если пользователь напишет «exit» или «quit», программа должна быть завершена.

нашел решение через гугл. вроде не сложная задача но есть непонятные моменты для меня можете разъяснить в виде комментариев к строчкам кода(что понимаю сам от комментил). Правильно ли я выставил комментарии?
<code>
sum1 = 0                                                                # Задаем значение переменной sum1
while True:                                                             # Начало цикла
    value = input('Введите число: ')                                    # Создаем переменную value которая просит ввести число
    if value == "sum":                                                  # Если ввести слово sum то он
        print("Общая сумма: ", sum1)                                    # выведет  общую сумму введенных значений
        sum1 = 0
        continue                                                        # Переход в начало цикла
    elif value == "exit" or value == "quit":
        break
    sum1 += int(value)

</code>

Правильно ли я выставил комментарии?

Да, ваши комментарии сделаны вами верно.
Также я бы вам сделал некоторое дополнение:

Я бы не рекомендовал писать 'while True:', так как в более сложных кодах, где конструкция будет запутанней, лучше использовать 'флаг', то есть делать проверку на положении флага.
Например:

<code>
sum1 = 0                                                                # Задаем значение переменной sum1
flag = True
while flag:                                                             # Начало цикла
    value = input('Введите число: ')                                    # Создаем переменную value которая просит ввести число
    if value == "sum":                                                  # Если ввести слово sum то он
        print("Общая сумма: ", sum1)                                    # выведет  общую сумму введенных значений
        sum1 = 0
        continue                                                        # Переход в начало цикла
    elif value == "exit" or value == "quit":
        flag = False
    if flag:
        sum1 += int(value)
</code>
На данном примере может не очень видна разница, но, если у вас будут вложенные циклы, то с  'флагом' будет удобнее и понятней.


Проверка элементов двух массивов
У меня есть два условных массива.
Первый:

['Комедия', 'Драма', 'Хоррор']
Второй:

['Комедия', 'Сверхъестественное', 'Драма', 'Романтика', 'Школа']
Мне нужна проверка, есть ли во втором массиве один из элементов первого (в примере их два, но достаточно и одного)

Вам нужно проверить, что пересечение множеств не пусто:

janres1 = ['Комедия', 'Драма', 'Хоррор']
janres2 = ['Комедия', 'Сверхъестественное', 'Драма', 'Романтика', 'Школа']
print(set(janres1) & set(janres2))
print(bool(set(janres1) & set(janres2)))

Вывод:

{'Комедия', 'Драма'}
True


Проверка результатов функции (процент от числа) [закрыт]

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

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

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

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

<code>
>>>>
colors = {1 : {'Желтый': 3.1, 'Красный': 96.9, 'Синий': 38.7},
          2 : {'Желтый': 12.5, 'Черный': 87.5},
          3 : {'Синий': 50.0, 'Черный': 50.0}}

n = int(input("Какой номер цвета? :"))
print()
print('Номер цвета:', n, 'C,U')
new_color = {}

for key in colors[n]:
    print(key + ':', colors[n][key], '%')
print()
for s in colors.values():
   new_color.update(colors[n])

x = float(input("Количество грамм краски?:"))
def procent(**new_color):
    for key in new_color:
        print(key, "->", round(x * (new_color[key] / 100), 2)) # находим процент от
числа

procent(**new_color)
>>>>

>>>>
Какой номер цвета? :1

Номер цвета: 1 C,U
Желтый: 3.1 %
Красный: 58.2 %
Синий: 38.7 %

Количество грамм краски?:567.3
Желтый -> 17.59
Красный -> 330.17
Синий -> 219.55
>>>>

Сумма всех цветов 567,31 отличается от заданной. Подскажите как устранить проблему?
</code>

Вот один из вариантов решения:
<code>
colors = {1 : {'Желтый': 3.1, 'Красный': 96.9, 'Синий': 38.7},
          2 : {'Желтый': 12.5, 'Черный': 87.5},
          3 : {'Синий': 50.0, 'Черный': 50.0}}

n = int(input("Какой номер цвета? :"))
print()
print('Номер цвета:', n, 'C,U')
new_color = {}

for key in colors[n]:
    print(key + ':', colors[n][key], '%')
print()
for s in colors.values():
   new_color.update(colors[n])

x = float(input("Количество грамм краски?:"))
def procent(**new_color):
    res = 0 # результирующая переменная
    for key in new_color:
        res += x * (new_color[key] / 100) # находим процент от числа
    print(res)

procent(**new_color)
</code>


discord.py Распознать речь в голосовом канале
Как подключиться к голосовому каналу и распознать речь одного из участников (получить строку)?

На данный момент, к сожалению, нету возможности реализовать это каким-то адекватным методом.


python: bot telegram с аргументами
Мне нужна команда, где будет писаться аргумент, т.е. команда:
Отдать [id] [integer].
Допустим, пользователь вводит команду
Отдать 1234567890 50000.
В файле, где находятся всё
user_id зарегистрированных пользоватлей, идет поиск того самого ИД (1234567890).
Если его нет, то
send_message(такого пользователя нет).
Если есть, то
send_message(вы отдали игроку 50000!).
Я новичок и мне нужно направление, как это вообще воплотить и какая библиотека мне поможет. Я не прошу за меня писать код, просто нужно понять примерный алгоритм, заранее всем спасибо!

я не совсем понял вопроса, но не проще было бы написать сперва случайную команду с префиксом
'/' и к примеру полностью:
'/give' затем обрабатывать любой текст пользователя через текстовый обработчик, а как именно обрабатывать? Сперва проверять текст, что он начинается на
'/give' то есть:
if message.text.startswith('/give') затем следующая проверка, которая разобьёт весь отправленный текст пользователя на три части через пробел, а то есть команду, затем айди пользователя, которому должна будет выдаться определенная сумма, после сама уже сумма и это дело сделать, просто через
'split(' ')', если разбить текст через сплит не удастся произойдет ошибка, которую и можно обрабатывать в качестве, того решил ли пользователь побаловаться введя команду без аргументов или действительно выполнить какое-либо действие, если ошибки через сплит не будет наблюдаться затем можно написать проверку пользователя в базе которому должна будет даться какая-то сумма и вообще дальше ты можешь ограничься только фантазией.


Отсортировать один список по другому с доп. условиями
Есть 2 списка (одн-ый, мног-ый). Нужно отсортировать второй список по первому (объеденить эти элементы списка в один). Чтобы элементы первого, соответствовали значениям второго и наоборот второй=первому.
Но есть одно если во втором списке есть элемент, который содержит в конце символ подчеркивания (_), то нужно считать его правильным и он должен входить в список.

lst1 = ['DAY', 'MONTH', 'CLASS', 'ID']
lst2 = [['DAY', '01'], ['MONTH', '07'], ['DELETED', 'N'], ['ID_', '33']]

Должно получиться как то так

lst_end = [['DAY', '01'], ['MONTH', '07'], ['ID_', '33']]

Я нашел такой вариант

lst_end = sorted(filter(lambda x: x[0] in lst1, lst2),
                     key=lambda x: lst1.index(x[0]))

Но он исключает элемент
ID_ Есть ли какой то просто вариант не исключать такие элементы при фильтрации.

Если нужно по частичному совпадению, тогда:

lst1 = ['DAY', 'MONTH', 'CLASS', 'ID']
lst2 = [['DAY', '01'], ['MONTH', '07'], ['DELETED', 'N'], ['ID_', '33']]

lst_end = [
    [name, value] for name, value in lst2
    if any(name.startswith(x) for x in lst1)
]
print(lst_end)

Результат:

[['DAY', '01'], ['MONTH', '07'], ['ID_', '33']]


Как удалить последний пробел?
Допустим надо создать матрицу из чисел
Ввод:

2
23 34
24 45

Нужен такой вывод  (_) - прост для наглядности

23_34
24_45

Получается такой

23_34_
24_45_

нужно убрать вот эти последние пробелы

N = int(input())
A = [list(map(int, input().split())) for i in range(N)]
suma = 0
NM = []
for i in range(N):
  for j in range(N):
    NM.append(A[i][j])
    suma += A[i][j]
    LNM = len(NM)
    x = suma//LNM
for i in range(N):
  for j in range(N):
    if A[i][j] < x:
      A[i][j] = 0
    else:
      A[i][j] = 255
for i in range(len(A)):
  for j in range(len(A[i])):
    print(A[i][j], end = '')
  print()

Например, смотреть на индекс и добавлять пробел перед элементами после первого:

for i in range(len(A)):
  for j in range(len(A[i])):
    if j > 0:
      print(end=' ')
    print(A[i][j], end='')
  print()

Или сгенерировать строку нужного формата (со всеми элементами, разделяя их пробелами через метод
join):

for i in range(len(A)):
  print(' '.join(str(A[i][j]) for j in range(len(A[i]))))


AIOGRAM перелистал весь интернет, но не нашёл, как получить ответ от пользователя [закрыт]

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

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

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

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

Хочу сделать в боте опросы со своими вариантами ответа и записать их в текстовик.

Я вроде как щас разобрался и работать стоит с состоянием, т.к. везде где я видел их переменение это через команды /state Ку, а оказывается состояние можно ожидать в следующем сообщении пользователя, что подходит для меня и для моего вопроса.


Сохранение изменений, сделанных в QTextBrowser.TextCursor
Нужна функция
bold для выделенного текста с последующим сохранением изменений в файл.
merheCharFormat работает только для текущей сессии, попробовал ещё пару методов(в коде прокомментировал) - тоже не сработали.
Минимально воспроизводимый пример:

from PyQt5 import QtWidgets
import sys

from PyQt5.QtGui import QTextCharFormat, QFont

class Window(QtWidgets.QWidget):

    def __init__(self):
        super(Window, self).__init__()
        with open('text.txt', 'r', encoding='utf-8') as file:
            self.text = file.read()
        box = QtWidgets.QVBoxLayout()
        self.textbrowser = QtWidgets.QTextBrowser()
        self.textbrowser.setText(self.text)
        self.textbrowser.setFixedSize(300, 300)
        self.textbrowser.setReadOnly(False)

        self.make_bold_button = QtWidgets.QPushButton('set bold')
        self.make_bold_button.clicked.connect(self.set_bold_foo)

        self.save_button = QtWidgets.QPushButton('save')
        self.save_button.clicked.connect(self.save_text_foo)
        box.addWidget(self.textbrowser)
        box.addWidget(self.make_bold_button)
        box.addWidget(self.save_button)

        self.setLayout(box)

    def set_bold_foo(self):
        # этот отображается только в виджете, но не сохраняется
        cursor = self.textbrowser.textCursor()
        text_char_format = QTextCharFormat()
        text_char_format.setFontWeight(QFont.Bold)
        cursor.mergeCharFormat(text_char_format)

        # ещё один не сработавший способ
        cursor.insertHtml("<b>" + cursor.selectedText() + "</b>")

        # и ещё один
        cursor.selectedText().replace(cursor.selectedText(), f'<b>{cursor.selectedText()}</b>')

    def save_text_foo(self):
        with open('text.txt', 'w', encoding='utf-8') as file:
            file.write(self.textbrowser.toPlainText())

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Window()
    w.show()
    app.exec_()

Метод
toPlainText не сохраняет форматирование, только текст, вам нужен метод
toHtml:

    def save_text_foo(self):
        with open('text.txt', 'w', encoding='utf-8') as file:
            file.write(self.textbrowser.toHtml())


Сохранение файлов в определенную папку. Программа берет неправильный путь
Мне необходимо брать файлы из 'D:\Study\Progs\test\samples' и после обработки сохранять в 'D:\Study\Progs\test"вводимое значение"', но после строчки "name = os.path.abspath(file)" программа берет ложный путь "D:\Study\Progs\test\file.wav", а не "D:\Study\Progs\test\samples\file.wav", в чем может быть причина?
<code>
import librosa.display
import matplotlib.pyplot as plt
import os

pa = "./"
save = pa+input()
os.mkdir(save)
for file in os.listdir("./samples"):
    if file.endswith(".wav"):
        print(file)
        name = os.path.abspath(file)
        ss = os.path.splitext(name)[0]+".png"
        print(name)
        audio = name
        x, sr = librosa.load(audio, mono=True, duration=5)
        save_path = os.path.join(save, ss)
        X = librosa.stft(x)
        Xdb = librosa.amplitude_to_db(abs(X))
        plt.figure(figsize=(20, 10))
        librosa.display.specshow(Xdb, sr=sr)
        plt.savefig(save_path)
</code>

После всех вариантов, найденных в гугле, я пришел к следующей рабочей версии...
<code>
import librosa.display
import matplotlib.pyplot as plt
import os
from pathlib import Path

cwd = Path.cwd()
print("Vvedite directoriu dlya sohraneniya resultatov:")
sf = input()
save_folder = cwd / sf
print("Vvedite nazvanie directorii s primerami .wav failov:")
smpl = input()
sample_dir = cwd / smpl
os.mkdir(save_folder)

for file in sample_dir.glob("*.wav"):
    print(file)
    base = os.path.basename(file)
    outfile = os.path.splitext(base)[0] + ".png"
    print(f"->{outfile}")
    audio = file
    x, sr = librosa.load(audio, mono=True, duration=5)
    save_path = os.path.join(save_folder, outfile)
    X = librosa.stft(x)
    Xdb = librosa.amplitude_to_db(abs(X))
    plt.figure(figsize=(20, 10))
    librosa.display.specshow(Xdb, sr=sr)
    plt.savefig(save_path)
</code>


Как сохранить программу на рабочий стол через json.dump()?
Я полнейший новичок в программировании, поэтому пока что туплю. Хочу сделать так, чтобы эта программа сохранялась на рабочем столе, как это сделать?
Вот код:
<code>
import json
dictionary ={}; x = True
while x == True:
    motion = input("Какое действие желаете сделать - Добавить в словарь(1)/ Удалить из словаря (2)/"
                   " Просмотреть словарь (3)/ Найти в словаре (4)/ Сохранить словарь в текстовом редакторе (5)\n")
    if motion == "1":
        new_key = input("Введите ключ\n") ; new_address = input("Введите значение\n")
        dictionary[new_key] = new_address
        print(dictionary)
    elif motion == "2":
        delete = input("Введите ключ, который нужно удалить\n")
        if delete not in dictionary:
            print("Неверно задан ключ\n")
        else:
            del dictionary[delete]
            print(dictionary)
    elif motion == "3":
        print(dictionary)
    elif motion == "4":
        search = input("Введите ключ, который нужно найти\n")
        if search not in dictionary:
            print("Неверно задан ключ\n")
        else:
            print (dictionary[search])
    elif motion == "5":
        new_name = input("Введите имя создаваемого файла\n")
        with open("%s.txt"%(new_name),"w") as f:
            json.dump(dictionary,f,ensure_ascii=False)
    else:
        print("Неверно введено действие")
</code>

Папка рабочего стола относится к профилю юзера. Чтобы ее получить используем функцию
os.path.expanduser, а после добавим имя файла
Пример:

import os.path

new_name = '1'
file_name = os.path.expanduser("~/Desktop") + f'/{new_name}.json'
with open(file_name , "w") as f:
    json.dump(dictionary, f, ensure_ascii=False)


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

Тысячу лет [1 сноска] я бродил по лесу в поисках [2 сноска] наживы.

Мне нужно получить:

Тысячу лет я бродил по лесу в поисках наживы.

Как это можно максимально рационально сделать?

Попробуйте регулярные выражения.
<code>
import re
txt='Тысячу лет [1 сноска] я бродил по лесу в поисках [2 сноска] наживы.'
print(re.sub("\[.*?\]", "", txt))
</code>


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

Реализуйте программу, которая будет вычислять количество различных
объектов в списке. Два объекта a и b считаются различными, если a is b
равно False.
Вашей программе доступна переменная с названием objects, которая
ссылается на список, содержащий не более 100 объектов. Выведите
количество различных объектов в этом списке. Рассмотрим пример:

objects = [1, 2, 1, 2, 3] # будем считать, что одинаковые числа соответствуют одинаковым объектам, а различные – различным
Тогда все различные объекты являют собой множество {1, 2, 3} .
Таким образом, количество различных объектов равно трём.

Я написал программу, которая не работает:

n = len(objects)
count = 0
for i in range(n):
    for j in range(i+1, n):
        if id(objects[i]) == id(objects[j]):
            count += 1 # считаю кол-во повторяющихся(по id) элементов
print(n - count) #отнимаю это кол-во от общего числа

В самом степе есть решение:

n = len(objects)
ans = n
for i in range(n):
    for j in range(i):
        if id(objects[i]) == id(objects[j]):
            ans -= 1
            break

print(ans)

Я проверил свою на следующих примерах:
objects = [1, 2, 1, 2, 3]
objects = [1, 2, 1, 5, True, False, True, 'false', [], [1,2], [1,2]]
И она выдает те же рез-ты, что и правильная, но тест не проходит. Вот хотел узнать почему? Потому что, как мне кажется, моя делает то же самое(подсчет повторов в списке) только направления движения второго цикла разные. Если кто-то понял, почему моя программа не решает задачу, объясните пожалуйста почему или хотя бы предложите начальные данные, на которых она выдаст неправильный результат. Заранее спасибо.

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

Странно, что вы в явном виде используете
id, хотя в задании прямо сказано использовать "синтаксический сахар"
is (который проверяет именно равенство
id). Т.е. вместо:

id(objects[i]) == id(objects[j])

Должно быть:

objects[i] is objects[j]

А если уж использовать
id, то можно решить эту задачу гораздо проще и короче. Хотя, возможно, вы ещё не проходили
set и
map:

print(len(set(map(id, objects))))


Парсинг данных из INI файла (Python)
Коллеги, каким образом можно привести данные из текстового файла записанные следующим образом (вероятно формат *.INI file):
<code>
['2016-04-18',12],['2016-04-19',22],['2016-04-21',345],['2016-04-22',322],['2016-04-22',122] и т.д.
</code>
к нормальному *.CSV виду используя Python? Т.е. дата и величина в итоге, должны быть в разных столбцах.

Это не формат INI файла, это больше похоже на обычный питоновский список без начальных и конечных квадратных скобок. Соответственно, можно эти скобки добавить, и распрасить с помощью
ast.literal_eval как питоновский список:

text = "['2016-04-18',12],['2016-04-19',22],['2016-04-21',345],['2016-04-22',322],['2016-04-22',122]"

import ast
from pprint import pprint

data = ast.literal_eval("[" + text + "]")
pprint(data)

Результат:

[['2016-04-18', 12],
 ['2016-04-19', 22],
 ['2016-04-21', 345],
 ['2016-04-22', 322],
 ['2016-04-22', 122]]

Если нужно сохранить в csv:

import csv

with open("result.csv", "w", newline='') as file:
    writer = csv.writer(file, delimiter=';')
    writer.writerows(data)

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

df = pd.DataFrame(data, columns=["date", "number"])
# или
df = pd.DataFrame.from_records(data, columns=["date", "number"])


Django передача переменных в скрипт js
Много искал, не нашел ничего лучше, как передавать массив в скрипт js через

<script type="text/javascript">
    massages = {{ notification_messages|safe }};
</script>

Все прекрасно работало, в js была доступна переменная notification_messages, до тех пор, пока браузер не стал хешировать все что находится в этом теге
script. Пробовал рандомно менять id элемента, задавать
<script type="text/cacheable"  data-hash={{rand}}>, но браузер не хочет обновлять script. Я не понимаю почему он вообще хеширует html и не знаю что делать. Отключить хеш не вариант. Можно ли как-то по-другому передавать переменные js, или как заставить браузер не трогать этот
<script>?

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

<input type="hidden" id="myVar" name="variable" value="{{ variable }}">

Затем получаем значение в javascript таким образом:

var myVar = document.getElementById("myVar").value;


Область видимости дочерних классов Python
пишу простой TCP сервер, решил остановиться на такой архитектуре, напишу очень упрощенно чтобы была понятна суть ошибки.
<code>
class Server:
    connections = {}
    ...
    class Connection:
        ...
       def func(self):
           connections[self.key] = value
</code>
Внутри функции func доступа к connections нет, как и во всем внутреннем классе. В связи с этим два вопроса:

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

Есть класс оболочка (сервер)
Есть класс содержания (соединения)
У всех объектов содержания есть простой доступ к атрибутам объекта оболочки (self.parent.foo) очевидно, но громоздко
Оболочка легко взаимодействует с содержащимися объектами
Надеюсь на ваше понимание

Могу предположить, что вам нужно что-то вроде этого

class Connection:
    pass

class Server:
    def __init__(server, *server_args):
        server.connections = set()

        class Connection_(Connection):
            server_ = server

            def __init__(client, *client_args):
                server.connections.add(client)
                # Отсюда видим
                # Экземпляр сервера:  server
                # Аргументы сервера:  server_args
                # Экземпляр клиента:  client
                # Аргументы клиента:  client_args
                # Соединения сервера: server.connections

        server.connection = Connection_

server1 = Server('server1_arg1', 'server1_arg2')
client1 = server1.connection('client1_arg1', 'client1_arg2')

server2 = Server('server2_arg1', 'server2_arg2')
client2 = server2.connection('client2_arg1', 'client2_arg2')

print(server1.connections)
print(server2.connections)
print(isinstance(client1, Connection))
print(isinstance(client1, server1.connection))
print(not isinstance(client1, server2.connection))
print(server1.connection.server_ is server1)

{<__main__.Server.__init__.<locals>.Connection_ object at 0x7f017db2eeb0>}
{<__main__.Server.__init__.<locals>.Connection_ object at 0x7f017db2ed60>}
True
True
True
True

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


Разбить текст на абзацы python
Нужно разбить текст по абзацам в python.
Не получается разбить текст именно по абзацам, а не по предложениям или строкам. Понятно что  в абзаце может быть разное кол-во символов и предложений. Каждый абзац начинается с пропуска строки от предыдущего
Вот пример текста:
Пример абзаца
Пример абзаца
Пример абзаца

Если абзац - это два переноса строки, то элементарно.
<code>
s = 'Мой какой-то текст. ЭТо первый абзац.\n\nТут начинается второй абзац. И в нём два предложения.\n\n А это - третий, и он стосит из одного предложения.'
paragraphs = s.split('\n\n')

</code>
в paragraphs будет список абзацев.


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

class WindowChoose(Screen):  # начальное окно
def __init__(self, **kwargs):
    super().__init__(**kwargs)
    Clock.schedule_once(self._later_call)

def _later_call(self, dt):
    menu_items = [
        {
        'text': 'Избранное',
        'viewclass': 'OneLineListItem',
        'on_release': lambda x = 'Избранное': self.to_favorite_window(x),
    }
    ]
    self.menu_main = MDDropdownMenu(
        items = menu_items,
        width_mult = 4,
    )
# открытие выпадающего меню на начальном экране (menu)
def callback(self, btn):
    self.menu_main.caller = btn
    self.menu_main.open()

# перемещение на экран с избранным
def to_favorite_window(self, x):
    self.root.current = 'favorite_window'
    self.root.transition.direction = 'right'

Вот еще кусочек кода из самого класса-приложения, где то же самое работает

class ConvertApp(MDApp):
def build(self):
    return Builder.load_string(window_convert_1)

def back(self): # перемещение на начальный экран
    self.root.current = 'choose'  # перемещение на начальный экран
    self.root.transition.direction = 'right'  # перемещение в начальный экран, сдвигая окно вправо

def to_favorite_window(self, x):
    self.manager.current = 'favorite_window'
    self.manager.transition.direction = 'left'
    self.menu_main.dismiss()

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

def back(self):
    self.root.current = 'choose'  # перемещение на другой экран
    self.root.transition.direction = 'right'  # перемещение в начальный экран, сдвигая окно вправо

А здесь, обращаясь к root, ты обращаешься к менеджеру экранов


python: чтение строк и работа с каждой из строк
Всем привет! Мне необходима работа со строками из файла. У меня есть файл
bonus.py, в нем содержится:

1
2
3

И есть файл
test.py, в нем содержится:

import bonus
file = open('c://testper/bonus.py', 'r')
qwe = file.readlines()
print(qwe) # для считывания строк, что там вообще содержится
if qwe == '1':
    print('Sucs!(1)')
else:
    print('error')

Он выводит error, так как не обнаружил в файле
bonus.py цифру 1. В
print(qwe) выводится:

['1\n', '2\n', '3\n']

Как сделать так, чтобы он читал ВСЕ строки, и в строках искал то число, которое необходимо для вывода 'Sucs(1)'?

Так как в файле bonus.py находятся цифры: 1, 2, 3, где каждая с новой строки, следовательно в списке 'qwe' после каждой цифры стоит '\n', '\n' обозначает перенос на след. строчку.
В этой строчке
if qwe == '1': вы сравниваете список со строкой, а не строку со строкой.

Вот один из вариантов решения:

import bonus

file = open(r'c://testper/bonus.py', 'r')
qwe = file.readlines()
print(qwe) # для считывания строк, что там вообще содержится
if '1\n' in qwe:
    print('Sucs!(1)')
else:
    print('error')

Вот еще более удобный:

import bonus
file = open(r'C:\Users\mihai\.spyder-py3/bonus.py', 'r')
qwe = [x.strip() for x in file.readlines()] # убираем '\n'
print(qwe) # для считывания строк, что там вообще содержится
if '1' in qwe:
    print('Sucs!(1)')
else:
    print('error')


Регулярные выражения: поиск подстроки если после неё нет определённого выражения
У меня есть следующее регулярное выражение:

(?:\d+[-, \.]*)+\s*(?:нед|н)?[\. ]*, оно применяется к строке:
3-4 нед. Математический анализ 1 гр
При поиске подстроки находится 2 результата:
3-4 нед.  и
1  (часть от "1 гр"). Я бы хотел узнать, как мне искать подстроку таким образом, чтобы оно находило только ту часть, после которой не идёт выражение
(подгруппа|подгруп|подгр|п\/г|группа|гр)?
Я пробовал использовать Negative Lookahead:

(?:\d+[-, \.]*)+\s*(?:нед|н)?[\. ]*(?!.*(подгруппа|подгруп|подгр|п\/г|группа|гр))

но при данном выражении у меня при совпадении с 'гр' все другие совпадения тоже становятся ненайденными, а если в нём убрать поиск всех символов в начале (
.*), то оно вообще почему-то перестаёт работать.

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

\d+(?:[-,\s.]\d+)*\s*н(?:ед)?(?![.\s]*(?:подгруппа|подгруп|подгр|п\/г|группа|гр))[.\s]*

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

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

(?:[-,\s.]\d+)* - ноль и более последовательности
-,
, .` или пробельного символа, за которым следует одна или более цифр

\s* - ноль и более пробельных символов

н - буква
н

(?:ед)? - опциональная подстрока
ед

(?![.\s]*(?:подгруппа|подгруп|подгр|п/г|группа|гр)) - сразу справа не должно быть ноля и более точек и пробельных символов, после которых идёт
подгруппа,
подгруп,
подгр,
п/г,
группа и
гр

[.\s]* - ноль и более пробельных символов и точек.


Отправка случайной картинки в вк боте vk-api
Делаю бота в вк и хочу сделать функцию, отправляющую случайные картинки из директории
Небольшой кусок кода:
<code>
def add_ph():
    attachments.append('photo{}_{}'.format(upload_img['owner_id'], upload_img['id']))
def send_msg(sender, message, keyboard=None):
authorize.method('messages.send', {
    'user_id': sender,
    'message': message,
    'random_id': get_random_id(),
    'attachment': ','.join(attachments)
    })
img1=random.choice(os.listdir("C:/Users/10/Desktop/coding/vk_bot/img/"))
for event in longpoll.listen():

if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
    msg = event.text
    sender = event.user_id

    attachments=[]
    upload_img = upload.photo_messages(photos=img1)[0]

    elif msg=='1':
        add_ph()
        send_msg(sender, 'Фото')
</code>
В директории есть две картинки, при попытке написать боту "1" (выполнить функцию) выдает ошибку:

FileNotFoundError: [Errno 2] No such file or directory: 'frog.jpg'

Как можно исправить?

Функция
os.listdir возвращает список из имен папок и файлов. Ваш бот, скорее всего, запускается из папки
vk_bot/ (предположительно, это будет активная директория). В
img1 будет
'frog.jpg', тогда при отправке картинки поиск будет в активной директории скрипта, т.е. в
vk_bot/frog.jpg
Одним из решений будет указывать полный путь для имени картинки
Пример:

abs_path_images = "C:/Users/10/Desktop/coding/vk_bot/img/"
img1 = abs_path_images + random.choice(os.listdir(abs_path_images))


Как создать класс для хранения иерархичных данных
Есть список. Как эти данные хранить в классе?

input= [
    (None, 'a'),
    (None, 'b'),
    (None, 'c'),
    ('a', 'a1'),
    ('a', 'a2'),
    ('a2', 'a21'),
    ('a2', 'a22'),
    ('b', 'b1'),
    ('b1', 'b11'),
    ('b11', 'b111'),
    ('b', 'b2'),
    ('c', 'c1'),
]

Примерный вид класса такой. Непонятно как задать родительский элемент

class Node(object):
    def __init__(self):
        self.children = []

    def add_child(self, obj):
        self.children.append(obj)

Добавил в структуру название, родителя, завел специальный узел - корневой элемент
При заполнении элементов использовал словарь, чтобы упростить поиск элементов
Для проверки работы структуры сделал метод
Node.print для рекурсивного вывода элемента и всех его детей

class Node:
    def __init__(self, name: str, parent: 'Node' = None):
        self.name = name
        self.parent = parent
        self.children = []

    def add_child(self, obj: 'Node'):
        self.children.append(obj)

    @property
    def parent_name(self) -> str:
        return self.parent.name if self.parent else None

    def __repr__(self) -> str:
        return f'Node(name={self.name!r}, parent={self.parent_name!r}, children_len={len(self.children)})'

    def print(self):
        def _print(node: Node, level=0):
            print('    ' * level + f'{node.name} ({len(node.children)})')
            for child in node.children:
                _print(child, level + 1)

        _print(self)

source = [
    (None, 'a'),
    (None, 'b'),
    (None, 'c'),
    ('a', 'a1'),
    ('a', 'a2'),
    ('a2', 'a21'),
    ('a2', 'a22'),
    ('b', 'b1'),
    ('b1', 'b11'),
    ('b11', 'b111'),
    ('b', 'b2'),
    ('c', 'c1'),
]

name_by_node = dict()
name_by_node[None] = Node('ROOT', None)

for parent, child in source:
    parent_node = name_by_node[parent]
    if child not in name_by_node:
        name_by_node[child] = Node(child, parent_node)

    parent_node.add_child(name_by_node[child])

name_by_node[None].print()

Рекурсивный вывод:

ROOT (3)
    a (2)
        a1 (0)
        a2 (2)
            a21 (0)
            a22 (0)
    b (2)
        b1 (1)
            b11 (1)
                b111 (0)
        b2 (0)
    c (1)
        c1 (0)

UPD.
Для генерации словаря нужно добавить метод:

    def to_dict(self) -> dict:
        def _to_dict(node: Node):
            return {
                'name': node.name,
                'parent': node.parent_name,
                'children': [_to_dict(child) for child in node.children],
            }

        return _to_dict(self)

Вызываем (для удобства показываем в json):

data = name_by_node[None].to_dict()
print(json.dumps(data, indent=4, ensure_ascii=False))

Результат:

{
    "name": "ROOT",
    "parent": null,
    "children": [
        {
            "name": "a",
            "parent": "ROOT",
            "children": [
                {
                    "name": "a1",
                    "parent": "a",
                    "children": []
                },
                {
                    "name": "a2",
                    "parent": "a",
                    "children": [
                        {
                            "name": "a21",
                            "parent": "a2",
                            "children": []
                        },
                        {
                            "name": "a22",
                            "parent": "a2",
                            "children": []
                        }
                    ]
                }
            ]
        },
        {
            "name": "b",
            "parent": "ROOT",
            "children": [
                {
                    "name": "b1",
                    "parent": "b",
                    "children": [
                        {
                            "name": "b11",
                            "parent": "b1",
                            "children": [
                                {
                                    "name": "b111",
                                    "parent": "b11",
                                    "children": []
                                }
                            ]
                        }
                    ]
                },
                {
                    "name": "b2",
                    "parent": "b",
                    "children": []
                }
            ]
        },
        {
            "name": "c",
            "parent": "ROOT",
            "children": [
                {
                    "name": "c1",
                    "parent": "c",
                    "children": []
                }
            ]
        }
    ]
}


Как написать более быстрый код?
Описание задачи

Спортивная школа по синхронному плаванию «Золотая рыбка» приехала в
детский лагерь «Радость» для проведения летних сборов. Прежде всего
вожатым требуется расселить спортсменок по комнатам. Главный тренер
предложил для расселения следующее правило: в комнату заселяют всю
команду целиком и больше никого другого. Всего приехало n команд
спортсменок. Количество комнат заданной вместимости в лагере
ограничено. Определите, получится ли у вожатых расселить детей?

Формат ввода

В первой строке задано число  n  – число команд спортсменок. Во второй
строке записаны  n  чисел  a[i]  — количество количество спортсменок в
i
-й команде. Далее следует число  k  – количество типов комнат, и  k  пар вида вместимость комнаты, количество таких комнат. Все числа во
входных данных положительные целые и не превосходят 10000.

Формат вывода

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

Ввод

3
1 2 3
1
2 3

Вывод

No

Мой код:

n = int(input())
com_list = list(map(int, input().split()))
k = int(input())
k_list = []

for _ in range(k):
    res = list(map(int, input().split()))
    k_list.extend([res[0]]*res[1])

if len(k_list) < n:
    print('No')
else:
    s = 0
    for i in range(n):
        if sorted(com_list, reverse=True)[i] <= sorted(k_list, reverse=True)[i]:
            s+=1
        else:
            break
    print("No" if s<n else 'Yes')

Постоянная проблема со скоростью работы кода и потреблением памяти

Примечание: Наверное, у меня в общем-то по факту ваше же решение, просто записанное короче и понятнее. И ещё как правильно заметил EzikBro, у вас на каждом шаге цикла делалась сортировка, что и замедляло проверку.
Допустим, данные уже введены и помещены в соответствующие списки (которые я назвал более понятно). Тогда можно практически в одну строку и вполне понятно задачу решить:

teams = [1, 2, 3, 3]
rooms = [2, 3, 2, 1, 4]

print('Yes'
      if len(rooms)>=len(teams)
          and all(r >= t for r,t in zip(sorted(rooms, reverse=True), sorted(teams, reverse=True)))
      else 'No')

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

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

Причём, работать это должно довольно быстро, поскольку проверка закончится не дожидаясь конца перебора, если хоть одна из пар значений не пройдёт условие. Так что сложность = сложности сортировки двух введённых списков + не более
O(n) на проверку.
Добавил вариант без "распаковки" пар (размер комнаты, количество), чтобы можно было сэкономить память но тут уже в одну строку и без библиотек не получилось:

from itertools import zip_longest

teems = [1, 2, 3, 3]
rooms = [(3, 4)]

rooms_gen = (size for room,count in rooms for size in (room for _ in range(count)))
print('Yes'
      if all(r >= t for r,t in zip_longest(sorted(rooms_gen, reverse=True),sorted(teems, reverse=True), fillvalue=0))
      else 'No')


Дискорд бот не проверяет сообщения. Что не так?
<code>
import os
import discord
my_secret = os.environ['TOKEN']
client = discord.Client()

@client.event

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

async def on_message(message):

  if message.author == client.user:
    print('message checked, denied')
    return

  if message.content.startswith(';hello'):
    print('message checked')
    await message.channel.send('hello!')

client.run(os.getenv('TOKEN'))
</code>

Надо пустую строку между функцией и декоратором убрать (так лучше читается), а на вторую функцию декоратор добавить (а это уже обязательно).
<code>
@client.event
async def on_ready():
    # ...

@client.event
async def on_message(message):
    # ...
</code>
Кажется, все? Если верить минимальному примеру из документации, который точь точь, как ваш - то да, все.


Почему не происходит сортировка вложенного списка, методом list[0].sort()? Python
Не пойму почему не сортируется вложенный список.
<code>
square1 = [[2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3], [1, 2, 3, 4]]
a = square1[0].sort()
print(a)
</code>

Выражение бессмысленное, т.к.
sort не возвращает значение списка:

a = square1[0].sort()
print(a)

Чтобы убедиться в сортировке нужно вывести общий список или конкретно тот, что был подвергнут сортировке:

print(square1)
print(square1[0])

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

a = sorted(square1[0])
print(a)


python: Ошибка при вычислении и сложении
Написал команду "Машина улучшить 1" (улучшение машины), но обрабатывается команда неправильно, мой код:
<code>
    elif message.text == 'машина улучшить 1' or message.text == 'Машина улучшить 1': # команда Машина улучшить (ИД)
        if os.path.isfile(f"C://tgplay/{message.chat.id}_avto1.py"):
            file = open(f'C://tgplay/{message.chat.id}_avto1.py', 'r')
            schet = int(file.read())
            file.close
            if schet == int('70'):
                bot.send_message(message.chat.id, 'Ваша машина уже улучшена до максимум!')
                return
            file = open(f'c://tgplay/{message.chat.id}_money.py', 'r+')
            money = int(file.read())
            file.close
            if money < int(11000):
                bot.send_message(message.chat.id, 'У вас недостаточно средств для улучшения!')
                return
            else:
                file = open(f'c://tgplay/{message.chat.id}_avto1.py', 'r+')
                lsid = file.read()
                num = int(lsid)
                file.seek(0)
                file.write(str(num+1))
                file.seek(0)
                file.close
                file = open(f'C://tgplay/{message.chat.id}_money.py', 'r+')
                filemoney = int(file.read())
                file.seek(0)
                file.write(str(filemoney-11000))
                file.seek(0)
                file.close
            # подсчет всего
                file = open(f'c://tgplay/{message.chat.id}_money.py', 'r')
                itogmoney = int(file.read())
                file.close
                file = open(f'c://tgplay/{message.chat.id}_avto1.py', 'r')
                itogmon = int(file.read())
                file.close
                bot.send_message(message.chat.id, f'{message.from_user.first_name}, вы успешно улучшили свою машину!\n    Добавлено: +1 лошадиных сил.\n    Лошадиных сил теперь: ' + str(itogmon) + '!\n💰 Ваш баланс: ' + str(itogmoney))
        else:
            bot.send_message(message.chat.id, 'У вас нету машины!')
</code>
Когда я пишу команду в боте, он пишет неправильный баланс(изначально на балансе было 20000):

Ваш баланс: 90000

Я не знаю откуда он берёт такое число да ещё и прибавляет, когда нужно было наоброт вычитать, прошу помочь мне! В сфере программирования я новичок

Хехе, занимательный случай. В файл и пишется 9000, но поскольку зачем-то применяются
r+ и
seek(), то в файле ещё остаётся последний 0 от 20000, а '9000'+'0' как раз и получается '90000'.
Решение из комментария: после записи вызвать
file.truncate().
PS. Удалил свой предыдущий совет, потому что он в некоторых местах приведет к другим проблемам.
Вообще, работу с файлами тут надо оптимизировать. Не нужно открывать/закрывать файл на каждый чих. Достаточно каждый файл открыть один раз и закрыть когда он больше не нужен. И используйте для работы с файлами конструкцию with open(), тогда файл будет закрыт автоматически.


Удалить все повторяющиеся элементы из списка. Python
<code>
list6 = [1, 1, 2, 2, 2, 3, 4, 4, 5]

for i in list6:
   if i == i:
       list6.remove(i.__index__())
       print(list6)
</code>
Почему у меня в конце удаляет 5?
Я тут заметила что строка if i == i: ничего не меняет в коде. Так как мне решать это?

list(set([1, 1, 2, 2, 2, 3, 4, 4, 5]))

А у вашем случае надо написать как-то так: если в списке уже есть такой элемент, то идти к следующему и проверять снова.

duplicates = [1, 1, 2, 2, 2, 3, 4, 4, 5]
unique = duplicates[0:0]

for i in range(len(duplicates)):
    if duplicates[i] in unique:
        continue
    unique.append(duplicates[i])

print(unique)

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

duplicates = [1, 1, 2, 2, 2, 3, 4, 4, 5, 0]
unique = []

# Проходимся по каждому элементу нашего списка
for i in range(len(duplicates)):
    # Заводим флаг, который обозначает, что такой элемент уже был
    contains = False

    # Теперь самая важная часть
    # Проходимся по тех всех элементах изначального списка начиная от того, на которым мы сейчас в главном цикле
    for j in range(i + 1, len(duplicates)):
        # Если текущий элемент главного цикла тот же, что и нашего вложенного, то понятно, что это повторение значения
        # Ставим флаг, что мы нашли совпадение
        if duplicates[i] == duplicates[j]:
          contains = True

    # А тут проверяем, если совпадений не было, то это уникальный элемент и его можно добавить в выходной список
    if not contains:
      unique.append(duplicates[i])

print(unique)


Минусы использования JSON-файлов вместо базы данных
Я бы хотел точнее углубиться в эту тему и понять - плохо ли хранение всей информации напрямую в json-файлах на hdd.
Знаю, что многие используют sqlite3 - возможно, что она проще в реализации. Но какие еще есть подводные камни?

У каждого подхода есть свои плюсы и минусы. Опишу то, чего нет у другого подхода.
JSON: это текстовый файл, так что это просто.

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

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

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

Если вам надо просто записать сколько-то данных и хранить их как архив, то json может показать себя с лучшей стороны, но если вам вести какой-то учёт этих данных и активно работать с ними, то добро пожаловать в мир sqlite.


Сортировка по одному из значений в словаре Python
Подскажите плиз как можно почистить словарь от тех данных, у которых в значение число меньше, чем у того, которое с таким же именем в значении. Для примера приведу код:
<code>
old_dict = {
    1: (100, 'dima'),
    2: (200, 'vova'),
    3: (300, 'oleg'),
    4: (400, 'vova'),
    5: (500, 'sasha')
}
new_dict = {}
</code>
В new_dict должны оказаться все записи из old_dict кроме 2: (200, 'vova'), так как есть 4: (400, 'vova')

Собрал словарь с ключом-именем и значением индексом+значением

old_dict = {
    1: (100, 'dima'),
    2: (200, 'vova'),
    3: (300, 'oleg'),
    4: (400, 'vova'),
    5: (500, 'sasha'),
    6: (250, 'dima'),
    7: (150, 'dima'),
    8: (200, 'oleg'),
}
name_by_values = dict()
for i, (value, name) in old_dict.items():
    if name not in name_by_values:
        name_by_values[name] = i, value
    else:
        _, old_value = name_by_values[name]
        if value > old_value:
            name_by_values[name] = i, value

new_dict = {
    i: (value, name)
    for name, (i, value) in name_by_values.items()
}
print(new_dict)

# Тоже самое с сортировкой по номеру
new_sorted_dict = {
    i: (value, name)
    for name, (i, value) in sorted(name_by_values.items(), key=lambda x: x[1][0])
}
print(new_sorted_dict)

Результат:

{6: (250, 'dima'), 4: (400, 'vova'), 3: (300, 'oleg'), 5: (500, 'sasha')}
{3: (300, 'oleg'), 4: (400, 'vova'), 5: (500, 'sasha'), 6: (250, 'dima')}


Как удалить клавиатуру?(Python telegram bot, keyboard_remove)
Python3+, requests
Отправляю кнопку с запросом номера:

reply_markup = {'keyboard': [[{'text':'contact', 'request_contact':True}]]}
кнопка появляется и работает, но как ее потом убрать?

вариант:

reply_markup = {'keyboard': [[{'text':'contact', 'request_contact':True, 'one_time_keyboard':True}]]}

не помог.
Такой вариант:

reply_markup = {'keyboard':[[{'Keyboard_Remove':True}]]}

тоже ничего не меняет.

Когда получаете следующее сообщение, добавьте строку:

await message.answer("Клавиатура скрыта", reply_markup=types.ReplyKeyboardRemove())


Помогите создать функцию для подсчёта процентов от введенного числа

colors = {1 : {'Желтый': 3.1, 'Красный': 96.9},
       2 : {'Желтый': 12.5, 'Черный': 87.5},
       3 : {'Синий': 50.0, 'Черный': 50.0}}

n = int(input("Какой номер цвета? :"))
print()
print('Номер цвета:', n, 'C,U')
new_color = {}

for key in colors[n]:
    print(key + ':', colors[n][key], '%')
print()
for s in colors.values():
   new_color.update(colors[n])

x = float(input("Количество грамм краски?:"))
def procent(**new_color):
    for key in new_color:
        print(key, "->", new_color[key])
procent(**new_color)

Какой номер цвета? :3

Номер цвета: 3 C,U
Синий: 50.0 %
Черный: 50.0 %

Количество грамм краски?:345
Синий -> 50.0
Черный -> 50.0

Вместо
Синий -> 50.0 и
Черный -> 50.0 должно быть
Синий -> 172.5 и
Черный -> 172.5

Вот верный вариант:
<code>
colors = {1 : {'Желтый': 3.1, 'Красный': 96.9},
       2 : {'Желтый': 12.5, 'Черный': 87.5},
       3 : {'Синий': 50.0, 'Черный': 50.0}}

n = int(input("Какой номер цвета? :"))
print()
print('Номер цвета:', n, 'C,U')
new_color = {}

for key in colors[n]:
    print(key + ':', colors[n][key], '%')
print()
for s in colors.values():
   new_color.update(colors[n])

x = float(input("Количество грамм краски?:"))
def procent(**new_color):
    for key in new_color:
        print(key, "->", round(x * (new_color[key] / 100), 2)) # находим процент от числа
procent(**new_color)
</code>


Является ли строка панграммой?
Требуется проверить, является ли строка панграммой, т.е если в строке все буквы алфавита.
И я ее решил таким образом:

def is_pangram(s):
    return set('abcdefghijklmnopqrstuvwxyz') == set(s.lower().replace(' ', ''))

text = input()

print(is_pangram(text))

Но нашел схожее решение:

def is_pangram(s):
    return not set('abcdefghijklmnopqrstuvwxyz') - set(s.lower())

text = input()

print(is_pangram(text))

Не могу понять 2х вещей:

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

почему вычитая одно множество из другого куда-то девается знак пробела?

Когда мы вычитаем множество
B из
A в результирующем множестве остаются только те элементы из множества
A, которые не встречаются в множестве
B.
В множества
A символ пробела отсутствует, поэтому он не может быть в результате.

почему добавляя логический оператор not функция возвращает булево значение?

In [163]: not set()
Out[163]: True

интерпретируется как:

In [165]: not bool(set())
Out[165]: False

именно это и происходит при проверке результата
PS здесь можно подробнее прочитать о том как работает
not <expression> в
Python и как это реализовано в исходном коде
Python


Срез [1:] выводит разные результаты в разных местах, один результат внутри функции, другой результат вне функции, почему?
Почему в разных местах программы срез
[1:] выводит разные результаты? Противоречит здравому смыслу и тому, как работают срезы
Код

def pathfind(l):
    if len(l) == 1:
        return sum(l[0])
    if len(l[0]) == 1:
        s = 0
        for i in range(len(l)):
            s += l[i][0]
        return s
    l1 = l[1:] # выдаёт [[2]] (?!)
    l2 = l.copy()
    for i in range(len(l2)):
        l2[i].pop(0)
    print(l1)
    return l[0][0] + min(pathfind(l1), pathfind(l2))

n, m = map(int, input().split())
l = [list(map(int, input().split())) for i in range(n)]
print(l[1:]) # выдаёт [[1,2]]
print(pathfind(l))

При списке данных
[[1,3],[1,2]] вне функции выдаёт
[[1,2]], внутри функции -
[[2]]

Вы тут копируете только верхний уровень списков, т.е. получаете копии ссылок на более глубокие списки, которые остаются одними и теми же для
l,
l1,
l2:

l1 = l[1:]
l2 = l.copy()

А тут вы казалось бы удалили элементы только из вложенных списков списка
l2, но нет - на самом деле вы удалили элементы из вложенных списков, на которые указывают все три переменные, по причинам, описанным выше:

for i in range(len(l2)):
    print(l2, i, l2[i])
    l2[i].pop(0)

Хотите получить полные/глубокие копии списков, не зависящие друг от друга - используйте
deepcopy:

from copy import deepcopy
...
    l1 = deepcopy(l[1:])
    l2 = deepcopy(l)


Как использовать слэши в коммандах psycopg2?
Суть:
Нужно поработать скриптом над выводом Postgres после выполнения команды \dRs. Через psql команда выполняется, вывод нормальный. А вот когда хочу через psycopg2 то же самое повторить, то не получается:
Input:

cursor.execute('\dRs')

Output:

psycopg2.errors.SyntaxError: syntax error at or near "\"

P.S. r"\dRs", так же не работает...

Если вам нужно из скрипта выполнять интерактивную команду, нужно будет запустить программу для базы (
psql) и ввести в нее команду
\dRs, после считать результат
Пример взят из ответа с enSO:

import sys
import subprocess

import psycopg2

conn = psycopg2.connect(host='localhost', dbname='test', user='postgres')
conn.autocommit = True

cur = conn.cursor()
cur.execute('create table my_table(id int primary key, str text)')

res = subprocess.run('psql -c "\d+ my_table" test postgres', stdout=subprocess.PIPE)
print(res.stdout.decode(sys.stdout.encoding))

Результат:

 Column |  Type   | Collation | Nullable | Default | Storage  | Stats target | Description
--------+---------+-----------+----------+---------+----------+--------------+-------------
 id     | integer |           | not null |         | plain    |              |
 str    | text    |           |          |         | extended |              |
Indexes:
    "my_table_pkey" PRIMARY KEY, btree (id)


Переменная вне зоны видимости (вроде)
При вызове возвращает
UnboundLocalError: local variable 'path' referenced before assignment
Как это решить и из за чего питону так сложно найти переменную?
Пробовал определять переменную вне условия и блока try-except, но это не помогло.
P.s. Данный код это функция которая вызывается при нажатии на кнопку.

try:
    if ...:
        path = f'...'
    elif ...:
        path = f'...'

    with open(path,'r',encoding = 'utf-8') as f_1:
        ...

Если не выполняются ни иф, ни елиф, то переменная не определена. Это и происходит.


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

from pathlib import Path

from abc import ABC, abstractmethod   # , abstractproperty

class IZI_report(ABC):
"""Class for reports."""

def __init__(self,  path_to_files_folder: Path):
    self.path_to_files_folder = path_to_files_folder
    self.response = {             # dict_to_return
        "exit_is_ok": False,
        "exit_message": "",
         # ...
     }

@abstractmethod
def files_reading(self, path_to_files_folder):
    ...

@abstractmethod
def data_processing(self, **pd_files):
    ...

@abstractmethod
def excel_writer(self, path_to_files_folder, client_name, files):
    ...

@abstractmethod
def excel_file_formatting(self, file_to_attach):
    ...

Здесь предполагается, что предварительно файл(ы) уже лежат в папке
file_to_attach. Но это не так важно.
И все бы ничего, только вот форматирование эксель файлов в среде виндовс родной библиотекой бывает до 10 раз быстрее, чем "универсальной", не зависящей от операционной системы.  Поэтому каждая конкретная реализация метода
 excel_file_formatting(self, file_to_attach) выглядит у меня примерно так:

def excel_file_formatting(self, file_to_attach):

    def o_excel_file_formatting(file_to_attach):
        # используем медленный универсальный модуль
        ...

    def w_excel_file_formatting(file_to_attach):
        # используем быстрый windows-модуль
        ...

    return (w_excel_file_formatting if current_os_is_win else o_excel_file_formatting)(file_to_attach)

Но мне это не казалось красивым. Поскольку в каждом конкретном методе повторялись написанные вспомогательные функции, обеспечивающие форматирование. Например
o_header_wrap_and_size или
o_search_and_colorise. Думаю по названию понятно чем они занимаются.  Если их везде дублировать, то нарушается принцип DRY.
Можно было бы включить эти вспомогательные мелкие функции прямо в абстрактный класс, но это как то нарушает "соразмерность" методов  в абстрактном классе.
А делать вместо метода абстрактного класса целую фабрику классов как-то боязно и громоздко.
Вопрос - какие стандартные правила создания методов в таких случаях считаются правильными, "питонячими"?
Похоже здесь подойдет вложенный класс, нет?
Однако мнения о приемлемости вложенных (inner, nested)  классов разделились. Есть против, есть и за.
Есть ли какие то рекомендации на этот счет?

Есть ощущение, что тут может помочь композиция.
Ты делаешь базовый класс
ExcelFormatter, реализуешь на его основе
WindowsExcelFormatter и
GenericExcelFormatter. Они должны предоставлять одинаковый API, конечно же.
В таком случае ты выделяешь низкоуровневую логику форматирования из класса репортов, вызывая методы базового
ExcelFormatter, а инстанс и настройки
ExcelFormatter задаёшь при инициализации репортера, определив систему.


Как частично транспонировать DataFrame?
Имеется такой DataFrame:

df = pd.DataFrame(((1, 'Vasya', 13, 'Да', 'Было щекотно'),), columns=('user_id', 'user_name', 'poll_id', 'Тебе понравилось?', 'Дай комментарий'))

| user_id | user_name | poll_id | Тебе понравилось? | Дай комментарий |
| --- | --- | --- | --- | --- |
| 1 | Vasya | 13 | Да | Было щекотно |

А нужно его преобразовать в такой:

tdf = pd.DataFrame(((1, 'Vasya', 13, 'Тебе понравилось?', 'Да'), (1, 'Vasya', 13, 'Дай комментарий', 'Было щекотно')), columns=('user_id', 'user_name', 'poll_id', 'Вопрос', 'Ответ'))

user_id
user_name
poll_id
Вопрос
Ответ

0
1
Vasya
13
Тебе понравилось?
Да

1
1
Vasya
13
Дай комментарий
Было щекотно

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

Воспользуйтесь методом DataFrame.stack():

res = (df
       .set_index("user_id user_name  poll_id".split())
       .stack()
       .reset_index()
       .rename(columns={"level_3":"Вопрос", 0:"Ответ"}))

результат:

In [146]: res
Out[146]:
   user_id user_name  poll_id             Вопрос         Ответ
0        1     Vasya       13  Тебе понравилось?            Да
1        1     Vasya       13    Дай комментарий  Было щекотно


python: ошибка с оператором != (is not)
Я пишу код, и с целью интереса проверяю как работает оператор !=, мой код:

@bot.message_handler(commands=['text'])
def mess(message):
    if message.text == 'Гонка' or message.text == 'гонка':
        users = random.choice([123, 123, 123, 123]) # изменил айди на числа для конфиденциальности
        if users == f'{message.chat.id}':
            sys.exit()
        if users is not f'{message.chat.id}':
            bot.send_message(message.chat.id, 'continue')

Проблема в том, что sys.exit не помогает, я пробовал вместо этого писать return, он также не реагирует на это. И ещё проверил это всё без telebot, в чистом файле:

inp = input('q: ')
users = random.choice([1, 2, 3])

if inp == 'q':
    users = random.choice([1, 2, 3])
    if users == 1:
        sys.exit()
    elif users != 1:
        print('Продолжаем!')

Всё работает, но мне нужно не в чистом файле, а с telebot

Это выбор одного из целых чисел:

users = random.choice([123, 123, 123, 123]) # изменил айди на числа для конфиденциальности

А тут выбранное число сравнивается со строкой (f-строкой):

if users == f'{message.chat.id}':

Такое условие никогда не сработает. Числа нужно сравнивать с числами, строки со строками. Например, так:

if f'{users}' == f'{message.chat.id}':

А такая ваша проверка наоборот будет срабатывать всегда:

if users is not f'{message.chat.id}':

Потому что оператор
is проверяет, что слева и справа стоит один и тот же объект. А два экземпляра одинаковой строки - это разные объекты:

print('123' == f'{123}')
print('123' is not f'{123}')
# True
# True


Как отправлять сообщение по Id?(Vk_api)
Можно ли отправлять сообщение через бота определённому человеку, если у другого человека(с другого аккаунта) ввести команду?
Например: человек вводит /test и отправляет. Бот это видит и отправляет сообщение администратору. Администратор видит ссылку на человека, который отправил запрос и переходит
Делаю пока-что тестовую функцию. Обрывок кода:
<code>
import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType
import random
import time
token = ""
vk = vk_api.VkApi(token=token)

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

longpoll = VkLongPoll(vk)
for event in longpoll.listen():
    if event.type == VkEventType.MESSAGE_NEW:
        if event.to_me:
            msg = event.text
            if msg in hi_word:
                write_msg(event.user_id, random.choice(hi_otvet))
            elif msg == "Тест":
                write_msg(event.user_id, "отправленно")

                write_msg(event.user_id, "отправленно от...") #тут должно отправлять сообщение на id(не в чат, где это было введено)
            else:
                write_msg(event.user_id, "Ошибка. Я вас не понимаю")
</code>
p.s Вырезал лишнее

Как отправлять сообщение по id?

Вы и так отправляете сообщение по
id. Вам просто нужно передавать идентификатор администратора вместо идентификатора пользователя.
Пример:

ADMIN_USER_ID = ...

write_msg(ADMIN_USER_ID, "отправленно от...")


Не могу выполнить задачу на Python [закрыт]

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

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

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

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

Только начал изучать, поэтому не обессудьте.
Задача: Пользователь делает вклад в размере a рублей сроком на years лет под 10% годовых (каждый год размер его вклада увеличивается на 10%. Эти деньги прибавляются к сумме вклада, и на них в следующем году тоже будут проценты).
Написать функцию bank, принимающая аргументы a и years, и возвращающую сумму, которая будет на счету пользователя.
Мой код:

def bank(a,time):
    for each_year in time:
        a = (a * 0.1)
    return a

a=float(input("Сколько денег вкладываем? "))

time=float(input("На сколько лет? "))

print(bank(a))

Вот, что говорит терминал:

C:\Users\ASUS\Documents\Python> c: && cd c:\Users\ASUS\Documents\Python && cmd /C "C:\Users\ASUS\AppData\Local\Programs\Python\Python39\python.exe c:\Users\ASUS\.vscode\extensions\ms-python.python-2021.8.1105858891\pythonFiles\lib\python\debugpy\launcher 52546 -- c:\Users\ASUS\Documents\Python\Tasks\5.py "
Сколько денег вкладываем? 500
На сколько лет?5
Traceback (most recent call last):
  File "c:\Users\ASUS\Documents\Python\Tasks\5.py", line 15, in <module>
    print(bank(a))
TypeError: bank() missing 1 required positional argument: 'time'

Твоя проблема заключается в том, что функция bank принимает 2 аргумента, а ты ввёл только один.

print(bank(a))

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

print(bank(a,time))

Есть ещё одна проблема:

for each_year in time:
        a = (a * 0.1)

Таким образом твоя переменная каждый раз будет только уменьшаться. Так же ты неправильно написал цикл. Для увеличения на 10% в год нужно сделать так:

for each_year in range(time):
        a = (a * 1.1)


Ошибка: TypeError: '>' not supported between instances of 'NoneType' and 'int'
Есть код для работы с Excel:
<code>
wb = openpyxl.load_workbook('D:\lab_report.xlsx')
sht = wb.active
sht.unmerge_cells('C31:D31')
rep = sht['C31'].value
for i in range(45,500):
    if sht['AX'+ str(i)].value > 0:
        sht['AY' + str(i)] = rep
    else:
        break
wb.save('D:\lab_report.xlsx')
</code>
При выполнении выдает ошибку:

TypeError: '>' not supported between instances of 'NoneType' and 'int'

Столбец в условии содержит строго числа.
Не могу разобраться.

В ячейках Excel файла могут быть пустые значения, представленные как
None в OpenPyxl.
Как и сказано в ошибке,
None нельзя сравнивать с объектами титпа
int.  Воспроизведение ошибки:

if None > 0:
    print("oops!")
---------------------------------------------------------------------------
...
TypeError: '>' not supported between instances of 'NoneType' and 'int'

Поэтому сначала нужно сделать проверку не является ли объект
None:

if sht['AX{i}'+ str(i)].value is not None and sht['AX'+ str(i)].value > 0:

а еще лучше / понятнее сделать так (для Python 3.8+):

for i in range(45,500):
    if (val := sht[f'AX{i}'].value) is None or val <= 0:
        break
    sht[f'AX{i}'] = rep


Как удалить элемент из словаря если у него в значении массив с одним элементом? [закрыт]

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

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

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

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

У меня есть словарь:
<code>
{'Senior-Разработчик': ['Краков', 'Гордон'],
'монтажник': ['Познер', 'Шумский', 'Филатов'],
'Middle-Разработчик': ['Мурин'],
'web-программист': ['Козлов', 'Борцов', 'Фитисов'],
'Junior-Разработчик': ['Привалов'],
'кассир': ['Иванов', 'Шувалов']}
</code>
Как удалить элемент из словаря если у него в значении массив с одним элементом?

a = {'Senior-Разработчик': ['Краков', 'Гордон'],
'монтажник': ['Познер', 'Шумский', 'Филатов'],
'Middle-Разработчик': ['Мурин'],
'web-программист': ['Козлов', 'Борцов', 'Фитисов'],
'Junior-Разработчик': ['Привалов'],
'кассир': ['Иванов', 'Шувалов']}

for i in list(a.keys()):
  if isinstance(a[i], list) and len(a[i]) == 1:
    del a[i]

print(a)

результат:

{'Senior-Разработчик': ['Краков', 'Гордон'],
 'web-программист': ['Козлов', 'Борцов', 'Фитисов'],
 'кассир': ['Иванов', 'Шувалов'],
 'монтажник': ['Познер', 'Шумский', 'Филатов']}


Разбить элементы коллекции используя yield
Предстоит реализовать функцию intersperse(), которая должна принимать два аргумента, итерируемый источник значений и значение-разделитель, и возвращать такой итератор, который "между" соседними значениями из источника отдавал бы значение разделитель. Помните, что

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

Мое решение, но оно не проходит тест, по другому не понимаю как зайти, конвертировать все в строку, а потом разбивать join?

def intersperse(iterab, separator):
    for number, item in enumerate(iterab):
        if len(iterab) - 1 == number:
            yield item
        else:
            yield item
            yield separator

print(list(intersperse([], ",")))
print(list(intersperse([42], "foo")))
print("".join(intersperse(["Hello", "World"], " ")))
print(list(intersperse(range(4), 0)))

Сам тест

from itertools import islice

from solution import intersperse

def test_intersperse():
    assert list(intersperse([], ",")) == []
    assert list(intersperse([42], "foo")) == [42]
    assert "".join(intersperse(["Hello", "World"], " ")) == "Hello World"
    assert list(intersperse(range(4), 0)) == [0, 0, 1, 0, 2, 0, 3]

def test_intersperse_laziness():
    # Эта функция-генератор помнит, сколько было итераций когда либо
    def indicator():
        while True:
            indicator.count += 1
            yield "click"
    indicator.count = 0

    clicks = intersperse(indicator(), ",")
    assert indicator.count == 0, "No iterations should be performed yet!"

    first_ten = islice(clicks, 10)
    assert list(islice(first_ten, 3)) == ["click", ",", "click"]
    assert indicator.count == 2, "There are should be just two iterations!"

Ваш код падает на строке
assert list(islice(first_ten, 3)) == ["click", ",", "click"], т.к ему на вход приходит генератор, у которого в строке
if len(iterab) - 1 == number: пытаетесь брать длину, а её нет. Ошибку можно легко обойти: вы ставите разделитель после текущего элемента сравнивая его индекс с концом (которого  у нас в наличии нет), а нужно ставить перед текущим элементом сравнивая его индекс с первым:

def intersperse(iterab, separator):
    for number, item in enumerate(iterab):
        if number > 0:
            yield separator
        yield item


Веса для ключевых фраз в тексте
Есть статья, мне в ней нужно выделить ключевые фразы по паттерну и определить их веса.
Ключевые фразы я выделил.Привожу код
<code>
import spacy
from spacy.matcher import Matcher
nlp = spacy.load('ru_core_news_lg')

text = '''Тут текст статьи'''
doc = nlp(text)
matcher = Matcher(nlp.vocab)
pattern = [{"POS": "ADJ"}, {"POS": "NOUN"}]
matcher.add("AdjNoun", [pattern])
matches = matcher(doc)
for match_id, start, end in matches:
    span = doc[start:end]
    print(span)
</code>
Ключевые фразы получил. Как теперь определить их веса, подскажите пожалуйста

Используйте TfidfVectorizer. Пример из документации:
<code>
>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> corpus = [
...     'This is the first document.',
...     'This document is the second document.',
...     'And this is the third one.',
...     'Is this the first document?',
... ]
>>> vectorizer = TfidfVectorizer()
>>> X = vectorizer.fit_transform(corpus)
>>> print(vectorizer.get_feature_names())
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
>>> print(X.shape)
(4, 9)
</code>


Запрет на прокрутку Text Tkinter
Мне нужно каким либо способом убрать возможность прокручивать содержимое виджета Text колесом мыши по вертикали, параметр
state=DISABLED никак не влияет на скролл, как можно заблокировать прокрутку?

Под Windows сработал отлов события
<MouseWheel> и возврат
"break" обработчиком:

text.insert(END, some_text)
text.config(state=DISABLED)
text.bind("<MouseWheel>", lambda event: "break")

Под Linux (LinuxMint 20.2, Cinnamon 5.0.5) обработчик события
<MouseWheel> почему-то не срабатывает (если добавить
print в обработчик, то ничего не выведет).


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

    keyboard = types.InlineKeyboardMarkup()
    btn_1 = types.InlineKeyboardButton(text = 'Text', callback_data = 'item_1')
    btn_2 = types.InlineKeyboardButton(text = 'Text', callback_data = 'item_2')
    и есть проверка нажатия на одну из кнопок
    if call.data == 'item_1':
        print ("Text")

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

Короче, почитав апишку телеги на меня снизошло озарение, и для данной проверки нужно написать:
if call.data == 'название' and call.from.user.id == id который вам нужен


Почему в цикле добавляется только последний элемент списка?
Мне нужно перебрать таблицы, которые хранятся в списке
dictinary и года, которые хранятся в списке
dictinary_year. Проблема в том, что в результате в каждую таблицу добавляется последнее значение из списка.

dictinary = [data,data_2,data_3]
dictinary = ["2014_3","2014_4","2021_3"]
for i in range(len(dictinary)):
    for n in range(len(dictinary_year)):
        dictinary[i].loc[:,"year"] = dictinary_year[n]

Почему в цикле добавляется только последний элемент списка?

Потому, что вы делаете присваивание одного элемента всему столбцу. Т.е. одно и то же значение будет присвоено всем элементам столбца. Соответственно в столбце
"year" в каждом фрейме окажется последнее значение из
dictinary_year.
Кроме этого Numpy и Pandas придумали для того, чтобы облегчить у ускорить работу с матрицами и табличными данными. Сделано это за счет введения быстрых векторизированных функций, которые позволяют оперировать сразу векторами и матрицами, вместо медленной поэлементной обработки в циклах.
Воспользуйтесь этой мощью:

for i in range(len(dictinary)):
    dictinary[i]["year"] = dictinary_year[i]

PS вы не объяснили что вы хотите сделать/получить, поэтому нам приходится гадать по вашему нерабочему коду. Это очень неэффективно. Прочтите пожалуйста как наиболее эффективно задать вопрос, связанный с обработкой и/или анализом данных (например: по Pandas / Numpy / SciPy / SciKit Learn / SQL) и следуйте в будущих вопросах рекомендациям из этого FAQ.


Отправление фотографий ВКонтакте
Моя задача: у меня есть url фотографий. Мне нужно отправить их в личные сообщения человеку через сообщество.
Почитав, я пришел к выводу, что нельзя напрямую отправлять фотографии и напрямую загружать на сервер. Но как мне загрузить фотографию в ВК с компьютера? Могу ли я напрямую её загружать в сообщения или мне нужно грузить её в альбом паблика, а затем получать её id и с ним отправлять?
P.S. Я использую
import vk_api

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

import vk_api
import requests

# Задаём переменные
group_id = 'ID' # ID группы, без "-"
access_token = 'TOKEN' # access_token, который мы получили в группе
api_version = '' # Ваша версия API
filename = 'путь до картинки'

# Авторизуемся в VK
vk_session = vk_api.VkApi(token=access_token, api_version=api_version)
api = vk_session.get_api()

# Получаем адрес сервера для загрузки картинки
upload_url = api.photos.getMessagesUploadServer(group_id=group_id, v='5.131')['upload_url']

# Формируем данные параметров для сохранения картинки на сервере
request = requests.post(upload_url, files={'photo': open(filename, "rb")})
params = {
    'server': request.json()['server'],
    'photo': request.json()['photo'],
    'hash': request.json()['hash'],
    'group_id': group_id,
    'v': api_version
}

# Сохраняем картинку на сервере и получаем её идентификатор
photo_id = api.photos.saveMessagesPhoto(**params)[0]['id']

# Формируем параметры для отправки картинки в ЛС и отправляем её
params = {
    'user_id': ID, # ID пользователя, которому мы должны отправить картинку
    'random_id': 0,
    'message': 'Привет, вот твоя картинка!',
    'attachment': f'photo-{group_id}_{photo_id}',
    'v': api_version
}
api.messages.send(**params)

UPD: Используемую версию API (api_version) необязательно передавать. Также данный код скорее всего будет использоваться для бота, который имеет клавиатуру, поэтому стоит добавить в
params
'keyboard': key, где key - это ваша клавиатура, которую вы передаете пользователю.


Как получить адрес ячейки, если известно значение этой ячейки в Excel, через Openpyxl
Мне нужно узнать адрес ячейки, при условии, что я знаю его значение. Допустим, значение ячейки 123 и записано где-то в таблице. Мне нужно вытащить адрес ячейки, зная значение этой ячейки.
Если нужна дополнительная информация по вопросу, задавайте, я дам все что необходимо.

Я нашел как можно вывести координаты ячейки.
<code>
A1_column = sheet1['A1'].column
A1_row = sheet1['A1'].row
</code>


Фейковый визит сайта python
Имеется сокращенная ссылка на bit.ly
Код делает запрос на сокращенную ссылку, и по идее клик должен засчитываться в статистике, но этого не происходит. Подскажите, что я делаю не так?
<code>

header = {'authority': 'bit.ly',
          'method': 'GET',
          'path': '/MyLinkCode',
          'scheme': 'https',
          'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
          'accept-encoding': 'gzip, deflate, br',
          'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6,zh;q=0.5',
          'cookie': '_bit=l5ae7x-0b7f7cbf27f1ac7d41-00q',
          'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
          'sec-ch-ua-mobile': '?0',
          'sec-fetch-dest': 'document',
          'sec-fetch-mode': 'navigate',
          'sec-fetch-site': 'none',
          'sec-fetch-user': '?1',
          'upgrade-insecure-requests': '1',
          'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36}'}
sitetext = requests.get('ссылка на бит.лу', headers=header)
print(sitetext.headers)
</code>

Потому что по умолчанию requests.get не ходит по редиректам. А если по редиректу не пойти, то и на Ваш сайт никто не попадет, и никакие счетчики на нем не отработают. А bit.ly и многие подобные сервисы их (редиректы) используют по полной. Но можно подсказать
<code>
sitetext = requests.get('ссылка на бит.лу', headers=header, allow_redirects=True)
</code>


Почему np.array() неверно просчитывает значение полинома?

x = np.array(6208)
y = x**5 + 2*x**4 + 7*x**3 + 14*x**2 + 3*x + 10
print(y)
# y = -9223185457808594742

x = 6208
y = x**5 + 2*x**4 + 7*x**3 + 14*x**2 + 3*x + 10
print(y)
# y = 9223558615900956874

Очевидно, что NumPy посчитал значение неверно, т.к значение данного полинома не может быть отрицательным. Предполагаю, что это из-за того, что
np.dtype("int64") и не хватает памяти для просчета.
Но почему тогда минус? И как сделать так, чтобы
y был просчитан правильно через
np.array?

Происходит переполнение для переменной типа
np.int64. Допустимый диапазон значений можно проверить так:

In [46]: np.iinfo(x.dtype)
Out[46]: iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)

Можно явно указать тип данных - беззнаковое целое 64-бит:

In [47]: x = np.array(6208, dtype="uint64")

In [48]: y = x**5 + 2*x**4 + 7*x**3 + 14*x**2 + 3*x + 10

In [49]: print(f"{y:19.0f}")
9223558615900956672

Но и это не панацея для слишком больших значений:

In [50]: np.iinfo(x.dtype)
Out[50]: iinfo(min=0, max=18446744073709551615, dtype=uint64)


Как открывать базу данных sqlite3 с помощью with Python?
Знаю, что можно базу данных открывать так:

db = sqlite3.connect('orders.db')
sql = db.cursor()
...
db.close()

Но вроде как лучше будет с помощью
with. Попробовал сделать так:

db = sqlite3.connect('orders.db')
with db.cursor() as cursor:
    ...

Но возвращается ошибка:

Traceback (most recent call last):
  File "C:\Users\aesok\Desktop\test.py", line 7, in <module>
    with db.cursor() as cursor:
AttributeError: __enter__

Судя по документации контекстный менеджер реализован только для объекта типа
sqlite3.Connection, но не для
sqlite3.Cursor.
Поэтому можно сделать так:

with sqlite3.connect('orders.db') as con:
    cur = con.cursor()
    cur.execute(...)
    ...

При выходе из блока
with ... будет автоматически сделан
commit.


Как реализовать класс (вызов объекта класса как класс)
Помогите с проблемкой нужно реализовать класс, конструктор которого принимает аргумент- длину строки. Объект этого класса при вызове получает на вход один аргумент- строку произвольной длины и возвращает срез на длину строки.
Я написал вот это:

class MyClass():
    def __init__(self, length, *args):
        self.length = length
        self.string = args

    def __str__(self):
        return ''.join(self.string)[:self.length]

Но работает оно только если передавать 2 аргумента сразу:

a = MyClass(5, "abracadabra")
print(a) # вадает abrac

А должно работать так:

a = MyClass(5)
res = a("abracadabra")
print(res) # должно выдать abrac

Чтобы объект класса можно было вызывать нужным вам образом, добавьте такой метод в класс:

def __call__(self, *args):
    self.string = args
    return self

Но учтите, что при этом меняется внутреннее состояние объекта
a, лучше так всё-таки не делать, а создавать новые экземпляры класса с нужным состоянием обычным образом. Хотя случаи, конечно, разные бывают.


Какой есть быстрый способ чтения файла и записи в файл?
У меня есть файл data.txt с данными:

111,Pablo1,Alar1,mail1,0,0
222,Pablo2,Alar2,mail2,0,0
333,Pablo3,Alar3,mail3,0,0
444,Pablo4,Alar4,mail4,0,0
555,Pablo5,Alar5,mail5,0,0

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

list_of_lists = [
['111','Pablo1','Alar1','mail1','0','0']
['222','Pablo2','Alar2','mail2','0','0']
['333','Pablo3','Alar3','mail3','0','0']
['444','Pablo4','Alar4','mail4','0','0']
['555','Pablo5','Alar5','mail5','0','0']
]

Потом я изменяю какой-нибудь элемент:

new_list = list_of_lists
new_list[0][1] = '100000'

# new_list = [
# ['111','100000','Alar1','mail1','0','0']
# ['222','Pablo2','Alar2','mail2','0','0']
# ['333','Pablo3','Alar3','mail3','0','0']
# ['444','Pablo4','Alar4','mail4','0','0']
# ['555','Pablo5','Alar5','mail5','0','0']
# ]

После чего я листы в new_list преобразую в строки с пробелами и все перезаписываю в data.txt. Это очень много времени занимает с большими объемами данных.
Как можно это ускорить?
Знаю, что есть csv, но разве он сильно быстрее?

Откройте для себя модуль Pandas!

import pandas as pd  #  pip install pandas

df = pd.read_csv("/path/to/file.csv", sep=",", dtype=str)
df.iloc[0, 1] = "100000"
df.to_csv("/path/to/result.csv", index=False)

Аргумент
dtype=str - используется исключительно для ускорения парсинга CSV - этот параметр укажет
pd.read_csv() не пытаться определить правильный тип данных для каждого столбца, а воспринимать все столбцы как строки.
PS советую сравнить скорость обработки данных вашим текущим способом и вариантом из этого ответа ;)

Если у вас нет жесткой привязки к формату хранения данных, то имеет смысл хранить данные либо в бинарных файлах (например Parquet, HDF5, Pickle, etc.) или же в реляционной БД (MariaDB, PostgreSQL, SQLite, etc.) - это может еще сильнее ускорить работу с данными. Кроме того при работе с БД - вы бонусом получаете вариант когда вы можете параллельно писать в таблицу разными потоками / процессами. Параллельное чтение данных поддерживают все известные мне реляционные БД.
NOTE: параллельная запись не поддерживается в
SQLite, т.к. пишущий процесс эксклюзивно блокирует файл БД.
Здесь можно посмотреть слегка устаревший результат сравнения чтения / записи табличных данных для различных форматов файлов.


Как можно сократить и усовершенствовать код Python?
Не могу понять, как можно избавиться от дублирования кода.
continue не дает вынести в метод.

def main():
    accounts = file_to_string_array('data.txt')
    accounts = string_array_to_array(accounts)
    updated_data = accounts
    for i, account in enumerate(accounts):

        if account[8] == 'Yes':
            continue

        imap = imaplib.IMAP4_SSL('imap.mail.ru')
        imap.login(account[1], account[4])
        link = find_link(imap, 'INBOX')
        if link == '':
            link = find_link(imap, '&BCEEPwQwBDw-')
            if link == '':
                continue

        open_link(link, sleep_duration=5)

        imap.close()
        imap.logout()

        imap = imaplib.IMAP4_SSL('imap.mail.ru')
        imap.login(account[1], account[4])
        link = find_link(imap, 'INBOX')
        if link == '':
            link = find_link(imap, '&BCEEPwQwBDw-')
            if link == '':
                continue

        open_link(link, sleep_duration=1)

        imap.close()
        imap.logout()

        updated_data[i][7] = 'Yes'
        updated_data[i][8] = 'Yes'

    update_data(updated_data)

Код с поиском ссылки

link = find_link(imap, 'INBOX')
if link == '':
    link = find_link(imap, '&BCEEPwQwBDw-')
    if link == '':
        continue

Я бы лучше заменил на функцию:

def get_link(imap: imaplib.IMAP4_SSL, search_in1: str, search_in2: str) -> str:
    link = find_link(imap, search_in1)
    if not link:
        link = find_link(imap, search_in2)
    return link

Аналогично через оператор
or:

def get_link(imap: imaplib.IMAP4_SSL, search_in1: str, search_in2: str) -> str:
    return find_link(imap, search_in1) or find_link(imap, search_in2)

Не хорошо два раза создавать подключение к почте и закрывать, мне кажется лучше один раз сделать, а после закрыть через
try/
finally. Даже если будет вызван
continue, код в
finally выполнится, поэтому мы будем уверены, что соединение с почтовым сервером будет правильно закрыто

UPD. уточнение пункта 2, можно через контекстный менеджер открывать, тогда и try/finally с закрытием сессии не понадобится

Итого:

import imaplib

def get_link(imap: imaplib.IMAP4_SSL, search_in1: str, search_in2: str) -> str:
    link = find_link(imap, search_in1)
    if not link:
        link = find_link(imap, search_in2)
    return link

def main():
    accounts = file_to_string_array('data.txt')
    accounts = string_array_to_array(accounts)
    updated_data = accounts
    for i, account in enumerate(accounts):
        if account[8] == 'Yes':
            continue

        with imaplib.IMAP4_SSL('imap.mail.ru') as imap:
            imap.login(account[1], account[4])

            link = get_link(imap, 'INBOX', '&BCEEPwQwBDw-')
            if not link:
                continue
            open_link(link, sleep_duration=5)

            link = get_link(imap, 'INBOX', '&BCEEPwQwBDw-')
            if not link:
                continue
            open_link(link, sleep_duration=1)

        updated_data[i][7] = 'Yes'
        updated_data[i][8] = 'Yes'

    update_data(updated_data)


Проверка на пустые элементы в XML
Есть xml файл:

<row>
<row_id>11</row_id>
<col_account_id>2783</col_account_id>
<col_login>unknown</col_login>
<col_full_name>unknown</col_full_name>
<col_actual_payment_date>Tue Jul 13 14:08:35 MSK 2021</col_actual_payment_date>
<col_date_of_payment>Tue Jul 13 14:09:01 MSK 2021</col_date_of_payment>
<col_volume>9.500</col_volume>
<col_currency>BYN</col_currency>
<col_comment>Ошибочно начисленная абон. плата</col_comment>
<col_payment_method>Перерасчет (103)</col_payment_method>
<col_recieved_by>evandrushenko (-44)</col_recieved_by>
</row>
<row>
<row_id>12</row_id>
<col_account_id></col_account_id>
<col_login>ubil1_20</col_login>
<col_full_name>(РОУТ)Демидова Наталья Васильевна</col_full_name>
<col_actual_payment_date>Tue Jul 13 10:00:03 MSK 2021</col_actual_payment_date>
<col_date_of_payment>Tue Jul 13 10:00:31 MSK 2021</col_date_of_payment>
<col_volume>15.900</col_volume>
<col_currency>BYN</col_currency>
<col_comment>No comment</col_comment>
<col_payment_method>Оплата наличными (абон плата при подкл) (108)</col_payment_method>
<col_recieved_by>evandrushenko (-44)</col_recieved_by>
</row>
<row>
<row_id>13</row_id>
<col_account_id>2784</col_account_id>
<col_login>chong8_25-2</col_login>
<col_full_name>(РОУТ )Новиков Александр Владимирович</col_full_name>
<col_actual_payment_date>Fri Jul 09 12:00:26 MSK 2021</col_actual_payment_date>
<col_date_of_payment>Fri Jul 09 12:00:43 MSK 2021</col_date_of_payment>
<col_volume>12.900</col_volume>
<col_currency>BYN</col_currency>
<col_comment></col_comment>
<col_payment_method>Оплата наличными (абон плата при подкл) (108)</col_payment_method>
<col_recieved_by>evandrushenko (-44)</col_recieved_by>
</row>

Есть парсер для XML файла:

import xml.dom.minidom as minidom

try:
        with minidom.parse(xml) as doc:
            books = doc.getElementsByTagName("row")

            xml_tuple = ("col_date_of_payment", "col_actual_payment_date", "col_account_id",\
                         "col_full_name", "col_volume", "col_comment", "col_payment_method")
            titles = []
            [[titles.append(book.getElementsByTagName(i)[0]) for i in xml_tuple] \
                                                             for book in books]
            """Поля не должны быть пустыми"""
            y = []
            [[y.append(node.data) for node in title.childNodes \
                                                               if node.nodeType == node.TEXT_NODE]\
                                  for title in titles]
    except (Exception, TypeError, AttributeError):
        log.error("Exception occurred", exc_info=True)
        time.sleep(20)
    else:
        log.info("Считаем количество платежей")
        y = zip(*[iter(y)] * 7)
        yield tuple(y)

Как здесь можно реализовать проверку на пустые поля?
Скажем, если col_actual_payment_date пустой, то заполнить это поле звездочками(***).
Результат должен быть следующий:

[['Tue Jul 13 14:09:01 MSK 2021', 'Tue Jul 13 14:08:35 MSK 2021', '2783', 'unknown', '9.500', 'Ошибочно начисленная абон. плата', 'Перерасчет (103)'],
['16.07.2021', '16.07.2021', '***', '(РОУТ)Демидова Наталья Васильевна', '14,97', 'Перенос с СКТ на СПД Справка №56 от 13.07.2021', 'Оплата наличными (абон плата при подкл) (108)'],
['Fri Jul 09 12:00:43 MSK 2021', 'Fri Jul 09 12:00:26 MSK 2021', '2784', '(РОУТ )Новиков Александр Владимирович', '12.900', '***', 'Оплата наличными (абон плата при подкл) (108)']]

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

import xml.dom.minidom as minidom

def get_all_text(node) -> str:
    if node.nodeType == node.TEXT_NODE:
        return node.data
    else:
        return ''.join(get_all_text(child_node) for child_node in node.childNodes)

xml = '1.xml'

with minidom.parse(xml) as doc:
    xml_tuple = (
        "col_date_of_payment", "col_actual_payment_date", "col_account_id",
        "col_full_name", "col_volume", "col_comment", "col_payment_method"
    )

    items = []
    for row_el in doc.getElementsByTagName("row"):
        row = []
        for tag_name in xml_tuple:
            child_el = row_el.getElementsByTagName(tag_name)[0]
            child_text = get_all_text(child_el) or '***'
            row.append(child_text)

        items.append(row)

    print(items)

Результат:

[
['Tue Jul 13 14:09:01 MSK 2021', 'Tue Jul 13 14:08:35 MSK 2021', '2783', 'unknown', '9.500', 'Ошибочно начисленная абон. плата', 'Перерасчет (103)'],
['Tue Jul 13 10:00:31 MSK 2021', 'Tue Jul 13 10:00:03 MSK 2021', '***', '(РОУТ)Демидова Наталья Васильевна', '15.900', 'No comment', 'Оплата наличными (абон плата при подкл) (108)'],
['Fri Jul 09 12:00:43 MSK 2021', 'Fri Jul 09 12:00:26 MSK 2021', '2784', '(РОУТ )Новиков Александр Владимирович', '12.900', '***', 'Оплата наличными (абон плата при подкл) (108)']
]

UPD.
Думаю, указывать
*** в функции в качестве значения по умолчанию нехорошая идея, лучше вынести проверку из функции:

def get_all_text(node) -> str:
    if node.nodeType == node.TEXT_NODE:
        return node.data
    else:
        return ''.join(get_all_text(child_node) for child_node in node.childNodes)

with minidom.parse(xml) as doc:
    ...
    for row_el in doc.getElementsByTagName("row"):
         ...
            child_text = get_all_text(child_el) or '***'


Как перевести время в GMT +3 либо просто добавить +3 часа
Бот показывает время отправки отправки смс, но к сожалению в GMT 0. Как сделать правильно отображение?
<code>
def on_message(data: amino.objects.Event):
    global ban
    global tim
    global nom
    global y
    chatId: str = data.message.chatId
    nickname: str = data.message.author.nickname
    content: str = data.message.content
    messageId: str = data.message.messageId
    message_time: int = int(data.message.createdTime[17:19])
    userId: str = data.message.author.userId
    chat_name: str = sub_client.get_chat_thread(chatId).title
    user_id = data.message.author.userId
    times: int = data.message.createdTime[11:19]

print(times)
</code>
08:16:56

Например если у тебя есть строка:

"2020-09-29T18:39:39Z "
Чтобы поменять часовой пояс надо будет:

from dateutil import tz
import dateutil.parser

date_time_iso = "2020-09-29T18:39:39Z"
date_time_obj = dateutil.parser.isoparse(date_time_iso)
to_time_zone = tz.gettz('Europe/Moscow')
date_time_obj = date_time_obj.astimezone(to_time_zone)

А чтобы просто прибавить некоторое количесчтво часов (например 3 как вы и просили):

from datetime import timedelta
import dateutil.parser

date_time_iso = "2020-09-29T18:39:39Z"
date_time_obj = dateutil.parser.isoparse(date_time_iso)
date_time_obj = date_time_obj + timedelta(hours=3)


Как встроить переменную напрямую в код? [дубликат]

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

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

                                (2 ответа)

Закрыт 5 месяцев назад.

Мне необходимо вставить переменную напрямую в код. Чтобы вставить переменную в строку, надо перед "" написать f, а что нужно сделать для того что бы вставлять переменные в код?

counter = 1
def regNewUser(password, email, username):
    newUser = user{counter} = [f"{password}", f"{email}", f"{username}"]
    return newUser

В этом коде в 3 строке вместо
{counter} в код вставлялась переменная
counter.
Подскажите, возможно ли это сделать, и если да, то как?

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

users = []

def regNewUser(password, email, username):
    newUser = [f"{password}", f"{email}", f"{username}"]
    users.append(newUser)
    return newUser

Кстати, если
password,
email,
useraname - строки, то дополнительно оборачивать их в f-строки не нужно:

newUser = [password, email, username]


TypeError: 'method' object is not subscriptable в python3
Всем привет! Я пытаюсь написать команду для бота Телеграм, кусочек:
<code>
import random
users = random.choice[111, 1, 11, 111] # выбор одного из предложенных рандомно

@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == 'Гонка' or message.text == 'гонка':
            if os.path.isfile(f"C://tgplay/{users}_avto1.py"):
                bot.send_message(message.chat.id, f' {message.from_user.first_name}, 123', parse_mode='html') # "проверка на авто" (проверка на файлы)
            elif os.path.isfile(f"C://tgplay/{users}_avto2.py"):
                bot.send_message(message.chat.id, f' {message.from_user.first_name}, 123', parse_mode='html')# "проверка на авто" (проверка на файлы)
            elif os.path.isfile(f"C://tgplay/{users}_avto3.py"):
                bot.send_message(message.chat.id, f' {message.from_user.first_name}, 123', parse_mode='html')# "проверка на авто" (проверка на файлы)
            elif os.path.isfile(f"C://tgplay/{users}_avto4.py"):
                bot.send_message(message.chat.id, f' {message.from_user.first_name}, 123', parse_mode='html')# "проверка на авто" (проверка на файлы)
            elif os.path.isfile(f"C://tgplay/{users}_avto5.py"):
                bot.send_message(message.chat.id, f' {message.from_user.first_name}, 12', parse_mode='html')# "проверка на авто" (проверка на файлы)
            elif os.path.isfile(f"C://tgplay/{users}_avto6.py"):
                bot.send_message(message.chat.id, f' {message.from_user.first_name}, 12', parse_mode='html')# "проверка на авто" (проверка на файлы)
            elif os.path.isfile(f"C://tgplay/{users}_avto7.py"):
                bot.send_message(message.chat.id, f' {message.from_user.first_name}, 21', parse_mode='html')# "проверка на авто" (проверка на файлы)
            elif os.path.isfile(f"C://tgplay/{users}_avto8.py"):
                bot.send_message(message.chat.id, f' {message.from_user.first_name}, 12', parse_mode='html')# "проверка на авто" (проверка на файлы)
            else: #если файла не найдено
                bot.send_message(message.chat.id, f' {message.from_user.first_name},  нет', parse_mode='html')
</code>
Но получаю в ответ ошибку:

Traceback (most recent call last):   File "c://tgplay/bot.py", line
30, in
users = random.choice[111, 1, 11, 111] TypeError: 'method' object is not subscriptable

Помогите мне пожалуйста, я новичок! Очень буду благодарен. И да, я гуглил эту ошибку, но у меня ничего исправить не получалось(

random.choice - это метод, который принимает в себя аргумент в виде списка.
Измените эту строку
users = random.choice[111, 1, 11, 111]
на
users = random.choice([111, 1, 11, 111])


Как сделать многострочное поле ввода в терминале?
Мне надо сделать многострочное поле ввода
input(), но также чтобы я мог перемещаться между строками используя стрелочки на клавиатуре, используя Python.

Встроенных средств для многострочного ввода с редактированием и перемещением стрелками внутри вводимого текста в Python нет.
Можно использовать сторонние модули, например модуль
prompt_toolkit (установка
pip instal prompt_toolkit).
Пример многострочного ввода (завершение ввода Alt+Enter или Meta+Enter,
или Esc, потом Enter):

from prompt_toolkit import prompt

answer = prompt('Give me some input: ', multiline=True)
print('You said:', answer)

Документация по
prompt (кроме многострочного ввода можно реализовать автодополнение, подсказки вариантов, подсветку синтаксиса, валидацию ввода, хранение истории ввода и т.д.): Asking for input (prompts)


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

str = "High_Level 1.18512 lowlevel 1.16504"

Как должно быть:

High_Level =  1.18512
lowlevel   =  1.16504

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

import re

str_ = "High_Level 1.18512 lowlevel 1.16504"

d = dict(re.findall('(\w+)\s*(\d+\.\d+)', str_))
# {'High_Level': '1.18512', 'lowlevel': '1.16504'}

Также советую не называть переменные в виде зарезервированных слов, таких как
str


Вычислите количество четных, нечетных и простых чисел в заданном диапазоне. Python
<code>
lower = int(input())
upper = int(input())
odd = 0
even = 0
prima = 0
for i in range(lower, upper+1):
    if i % 2 == 0:
        even += 1
    else:
        odd += 1

    if i > 1:
        for j in range(2, i):
            if (i % j) == 0:
                break
            else:
                prima += 1

print(prima, even, odd)
</code>
Я написала вот такой код. Что касается нечётных и чётных чисел - всё работает. А вот с простыми числами выдаёт неправильный ответ. Подскажите в чём проблема. Спасибо.

Вам нужно изменить условие для проверки на простоту числа. Раньше вы считали число правильным сразу, если оно не делилось на 2.
По сути надо написать блок
else для цикла, то есть удалить по знаку табуляции на 2 строках. Так будет работать:

upper = int(input())
odd = 0
even = 0
prima = 0
for i in range(lower, upper+1):
    if i % 2 == 0:
        even += 1
    else:
        odd += 1

    if i > 1:
        for j in range(2, i):
            if (i % j) == 0:
                break
        else:
            prima += 1

print(prima, even, odd)

P.S. Для проверки числа на простоту достаточно перебирать только от 2 до квадратного корня этого числа


Наложение текста на фотографию [закрыт]

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

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

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

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

Подскажите, как наложить текст на изображение  с помощью bootstrap, пишу на html.

Думаю все просто. Вы задаете родительскому блоку
backgroung-image и внутри блока создаете блоки с текстом

<footer id="footer">
    <div class="footer__section">
        <p>some text</p>
        <p>some text</p>
    </div>
</footer>

В данном примере вам нужно задать изображение как фон для
footer или
footer__section