Помогите решить задачу по сортировке матрицы на python
Характеристикой столбца целочисленной матрицы назовем сумму
модулей его отрицательных нечетных элементов. Переставляя столбцы заданной
матрицы, расположить их в соответствий с ростом характеристик.
Найти сумму элементов в тех столбцах, которые содержат хотя бы один
отрицательный элемент.
Вот мой код:
<code>
import random as r

print("Введите количество столбцов:")
n = int(input())
print("Введите количество строк:")
m = int(input())
summ = 0
max_sum = 0

a = [[r.randint(-10, 3) for j in range(n)] for jj in range(m)]
for g in range(len(a)):
    for h in range(len(a[g])):
        print(a[g][h], end=" ")
    print()

def sum_otr(list, m, numb_col):
    s = 0
    for i in range(m):
        if list[i][numb_col] < 0:
            s += list[i][numb_col]
    return s

def counter(list, kol_col, numb_col):
    summ = 0
    for i in range(kol_col):
        if list[i][numb_col] < 0 and list[i][numb_col] % 3 == 0:
            summ += abs(list[i][numb_col])

    return summ

res_arr = []

for nk in range(n):
    res_arr.append(counter(a, m, nk))
    re = counter(a, m, nk)
    print("\n", "Сумма отрицательных элементов по столбцам:", sum_otr(a, m, nk))
    if re > max_sum:
        max_sum = re
print("\n", res_arr)

for j in range(n):
    mmin = j
    i = j + 1
    for i in range(n):
        if res_arr[i] < res_arr[mmin]:
            mmin = i
            buf_sum = res_arr[j]
            res_arr[j] = res_arr[mmin]
            res_arr[mmin] = buf_sum
            for ii in range(m):
                buf_a = a[ii][j]
                a[ii][j] = a[i][mmin]
                a[i][mmin] = buf_a

for g in range(len(a)):
    for h in range(len(a[g])):
        print(a[g][h], end=" ")
    print()
</code>
Почему матрица не изменяется?

Такой код должен решить эту задачу:
<code>
import random as r

def main():
    n = 3#int(input("Введите количество столбцов:"))
    m = 3#int(input("Введите количество строк:"))
    a = [[r.randint(-10, 3) for j in range(n)] for jj in range(m)]

    print('Начальная матрица: ')
    output_matrix(a)

    par = [[col, characteristic(a, col)] for col in range(n)] # [[idx столбца, характеристика], ...]
    q = [x[0] for x in sorted(par, key=lambda x: x[1])] # порядок расстановки

    new_matrix = [[0]*n for i in range(m)]
    new_col = 0
    for col in q:
        for row in range(m):
            new_matrix[row][new_col] = a[row][col]
        new_col += 1
    print('Преобразованная матрица: ')
    output_matrix(new_matrix)

    print('Характеристики столбцов:')
    for x in par:
        print(x[1], end=' ')
    print()

    print('Суммы отрицательных элементов по столбцам:')
    for col in range(n):
        print(sum_neg(new_matrix, col), end=' ')
    print()

def output_matrix(matrix):
    for row in matrix:
        for el in row:
            print(el, end=' ')
        print()
    print()

def characteristic(matrix, col):
    s = 0
    for i in range(len(matrix)):
        n = matrix[i][col]
        if (n < 0) and (n % 2): # число <0 и нечетное
            s += abs(n)
    return s

def sum_neg(matrix, col):
    s = 0
    for i in range(len(matrix)):
        n = matrix[i][col]
        if n < 0:
            s += n
    return s

main()
</code>


Нужна помощь в решении задачи на python!
Дана задача:

В магазине проходит новогодняя распродажа – цены всех товаров снижены
на 25%. Оказалось, что первоначально все цены делились на 4, поэтому
после снижения цен все цены также выражаются целым числом. Товаровед
вечером перед распродажей снял ценники со всех товаров и напечатал для
каждого товара ещё один ценник со сниженной ценой. Он оставил все
ценники на столе, рассчитывая утром их развесить. Но, придя утром в
магазин, он обнаружил, что уборщица смешала все ценники вместе, и
теперь ему нужно отделить старые ценники от новых.

Код на python:

n = int(input())
prices = [int(input()) for i in range(n)]
count = dict()
for price in prices:
    if price in count:
        count[price] += 1
    else:
        count[price] = 1
for price in prices:
    if count[price] > 0:
        print(price)
        count[price] -= 1
        count[price // 3 * 4] -= 1

Входные данные: 6 30 40 42 45 56 60
На выходе: 30 42 45

Но к сожалению он выдает ошибку "KeyError: 4". Помогите понять, почему?

Ошибка KeyError возникает, когда  ключ набора (словаря) не найден в наборе существующих ключей.
Ошибка возникает в этой строке

count[price // 3 * 4] -= 1


Ошибка TypeError: startswith() takes at most 3 arguments (11 given) в боте на discord.py (python)
сегодня решил добавить сообщение о неправильно написанной команде -help.
Но мне мешает одна ошибка:

Traceback (most recent call last):
  File "E:\Python\Python39\lib\site-packages\discord\client.py", line 333, in _run_event
    await coro(*args, **kwargs)
  File "E:\bot\bot.py", line 250, in on_message
    if message.content.startswith('-рудз', '-hlrp', '-hrlp', '-herlp', '-helo', '-helrp', '-рдкз', '-ркдз', '-рукдз', '-рудщ', '-рудкз'):
TypeError: startswith() takes at most 3 arguments (11 given)

Код:

@bot.event
async def on_message(message):
    if message.content.startswith('-рудз', '-hlrp', '-hrlp', '-herlp', '-helo', '-helrp', '-рдкз', '-ркдз', '-рукдз', '-рудщ', '-рудкз'):
        def on_message(ctx):
            author = ctx.message.author
            embed=discord.Embed(description=f'{author.mention}, Неизвестная команда. Возможно вы имели ввиду `-help`.', color=0x2f3136)
            ctx.send(embed=embed, delete_after = 3)
            sleep(1)
            ctx.message.delete()

Метод startswith принимает различные варианты префиксов в первом параметре как кортеж.
Попробуйте так:

if message.content.startswith(('-рудз', '-hlrp', '-hrlp', '-herlp', '-helo', '-helrp', '-рдкз', '-ркдз', '-рукдз', '-рудщ', '-рудкз')):

Из документации:

str.startswith(prefix[, start[, end]])

Return True if string starts with the prefix, otherwise return False.
prefix can also be a tuple of prefixes to look for. With optional
start, test string beginning at that position. With optional end, stop
comparing string at that position.


Что делает данный код на языке Python?
Как я понял, есть некий массив в переменной
A.
Я закинул в компилятор и оно просто переворачивает данный массив.
Но каким путем и зачем?
Каким образом происходит транспонирование?
И что делает каждая строка?

A = [
        [11, 12, 13, 14],
        [21, 22, 23, 24],
        [31, 32, 33, 34]
    ]

for row in zip(*A):
     print(*row)

Функция zip() берёт на вход несколько списков и создаёт из них zip-объект (списки, если Python2) кортежей...
Первый элемент полученного списка содержит кортеж из первых элементов всех списков-аргументов, второй элемент - кортеж из вторых элементов и т.д.
Сначала вы инициализируете список списков (А), потом просите для каждого элемента "прозипованного А" сделать print.


Как удалить последние 4 строки в матрице?
Вод есть код мне нужно в module_3 сделать функцию которая удаляет в матрице(которая находится в файле) 4 последних строки, помогите пожалуйста

import csv
from matplotlib.pyplot import matshow, show
from module_1 import task_1
from module_2 import task_2
from module_3 import task_3
def read(csvfile):
    with open(csvfile, 'r') as file:
        r = list(csv.reader(file))
    for x in range(len(r)):
        for y in range(len(r[x])):
            r[x][y] = int(r[x][y])
    return r
def write(matrix, name = "result.csv"):
    with open(name, 'w') as file:
        for x in range(len(matrix)):
            for y in range(len(matrix[x])):
                if y == len(matrix[x]) - 1:
                    file.write(str(matrix[x][y]) + "\n")
                else:
                    file.write(str(matrix[x][y]) + ",")
t1 = task_3(read("tekst.csv"))
for x in range(len(t1)):
    print(t1[x], end=' ')
print('\n')
t2 = task_2(read("tekst.csv"))
for x in range(len(t2)):
    for y in range(len(t2[x])):
        print(t2[x][y], end=' ')
    print()
t3 = task_1(read("tekst.csv"))
for x in range(len(t3)):
    print(t3)
write(t2)
matshow(t2)

Вот module_3(данный код не работает, не понимаю как удалить строки)

def task_3(m):
    m[-int(4) + m]
    return m

def task_3(m):
    m.pop(7)
    m.pop(6)
    m.pop(5)
    m.pop(4)
    return m


Нахождение подстроки регулярным выражением
Есть длинная строка в 20000 знаков. В ней надо найти подстроку которая начинается на определенные 3 буквы и заканчивается на другие три буквы. Пробовал такое используя модуль re

re.findall(r'ATG\w+TAA') , выводит всю строку.

import re

t = "dagehrgteshrtjTERHtnregATGfwaehrytewasehrT#D#AWTAAesrdj5hy$H$EWFEGRdwafsegdrhthrgefwATGwesrhtjrht34AWT#rtj6h5y4t34y5y4t3T$YRHGTR"

print(re.findall(r'ATG.*?AWT', t))

Вывод:

>> ['ATGfwaehrytewasehrT#D#AWT', 'ATGwesrhtjrht34AWT']


Как решить эту задачу программным путем(Python)?
Из пункта A в пункт B одновременно стартовали два лыжника. Скорость первого x метров в секунду, скорость второго y метров в секунду. Известно, что x>y. Одновременно с ними, из пункта B им навстречу стартовал третий лыжник, который движется со скоростью z метров в секунду. В какой-то момент третий лыжник встретил первого, а ровно через t секунд после этого встретил второго.
Требуется выяснить, через сколько секунд после встречи со вторым лыжником третий прибудет в пункт A.
Input format
В одной строке через пробел записано четыре числа x, y, z, и t.
x строго больше y, все числа целые из отрезка от 1 до 1000.
Output format
Вывести одно вещественное число - ответ на задачу с точностью не меньше трёх знаков после десятичной точки.
Примеры:
Input
5 4 10 100
Output
600
Input
342 221 2 747
Output
234669.12397

задача на уровне 6-7 классов :)
пусть расстояние между пунктами
L, тогда

надо найти через сколько встретятся
x и
z

узнать какое расстояние будет между
x и
y к этому времени

зная это расстояние, узнать через какое время встретятся
z и
y

поскольку это время известно, то через него и 1) - 3) выразить
L

а зная расстояние уже несложно вычислить и искомое время как

 Tитог = Tz - Tвстр - t

где
Tz - время за которое
z проёдёт все расстояние,
Tвстр - время встречи с
x, а
t - время встречи с
y после этого
Итоговый код:

t_res = ? * ? * (? + ?) / (? * (? - ?))
print(t_res)


Как можно печатать цифры числа по индексу, например как со строками string[0]
Хочу запустить такой код но знаю что так нельзя, есть какие то другие способы пройтись над каждым числом с индексом?
<code>
integer = 123
print(integer[0])
</code>

Делайте из чисел строки:
<code>
print(str(integer)[0])
</code>


Reverse number (Python)
Обьясните код пожалуйста, нашел в таком месте где нет детального обьяснение.
Код переворачивает число.
<code>
oNumber = 125
revNum = 0

while(oNumber > 0):
    remainder = oNumber % 10
    revNum = (revNum * 10) + remainder
    oNumber = oNumber // 10

print("Reversed number is: {}".format(revNum))
</code>

revNum = 0

while oNumber > 0:
    remainder = oNumber % 10  # Получение последнего числа (остаток от деления на 10)
    revNum = (revNum * 10) + remainder  # Сдвигает предыдущее число (умножение на 10) и прибавляет последнее число
    oNumber = oNumber // 10  # Убирает последнее число (целая часть от деления на 10)

print("Reversed number is: {}".format(revNum))


Как вытащить время создания файла и по своему отформатировать?
Есть список файлов с названиями вида "fileName.txt".
И есть задание: переименовать файлы в формате "old_fileName_2020-09-23T15:25.txt"
Как вытащить время создания файла, да еще и нужным образом отформатировать его?
К слову, в каждом файле есть дата создания этого файла в текстовом виде, если что. Но находится оно там не в ISO формате.
Нагуглил следующую инфу:
Вот этот код:

from os.path import getctime
from time import ctime

print(ctime(getctime('fileName.txt')))

Выводит информацию о файле в виде
Tue Dec  8 20:35:22 2020
И судя по всему, эту тупиковый путь.
Можно, конечно, попытаться срезами повырезать из текста отдельные участки и по-вставлять их куда нужно, но это слишком сложное решение для такого простого назначения.
Есть ли какая-то альтернатива?
Спасибо.

Думаю это то, что вам нужно:
<code>
from os.path import getctime
import datetime

print(datetime.datetime.fromtimestamp(getctime('fileName.txt')).strftime('%H:%M:%S'))
</code>
Подробнее про форматирование можно почитать здесь


NameError: name 'Label' is not defined
При попытке запуска приложения вылезает ошибка:

Traceback (most recent call last):
File "wd.py", line 4, in <module>
lbl = Label(root, text="Hello")
NameError: name 'Label' is not defined

Вот код:

import tkinter as tk
root = tk.Tk()

lbl = Label(root, text="Hello")
lbl.grid(column=0, row=0)

btn = Button(root)
btn.grid(column=1, row=0)

root.mainloop()

Label и
Button находятся в
tk поэтому надо писать
tk.Label и
tk.Button:

import tkinter as tk
root = tk.Tk()

lbl = tk.Label(root, text="Hello")
lbl.grid(column=0, row=0)

btn = tk.Button(root)
btn.grid(column=1, row=0)

root.mainloop()

либо импортировать все и место
tk.Tk писать
Tk:

from tkinter import *
root = Tk()

lbl = Label(root, text="Hello")
lbl.grid(column=0, row=0)

btn = Button(root)
btn.grid(column=1, row=0)

root.mainloop()


Не запускается скрипт Python в командной строке [дубликат]

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

Запуск python в командной строке

                                (1 ответ)

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

когда я запускаю любой код через IDLE то всё работает без проблем, но если я пытаюсь запустить код двойным кликом по файлу то cmd появляется буквально на мгновение и сразу исчезает. С pach у меня всё в порядке я проверял. я ещё новичок поэтому объясните по проще как это починить.

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

import os

# Ваш код

os.system("pause") # Для Windows

Тогда будет предложение нажать любую кнопку.


Удалить слово из списка python
Опять стыдный вопрос, есть у меня список слов и нужно удалить их из списка по условию (не создавая новый список)
<code>
words="вот есть какая-то строка и мне нужно удалить слова где больше 4 уник символов"
words_sp=words.split()
x=0
for word in words_sp:
    for i in range(1, len(words_sp)+1):
        if len(set(word))>4:
            words_sp.pop(i)
</code>

если надо удалить один элемент:

arr = ['test', 'pest', 'vest', 'pest']

if 'pest' in arr:
    del arr[arr.index('pest')]

print(arr)

если все элементы:

arr = ['test', 'pest', 'vest', 'pest']

for i in range(len(arr) - 1, -1, -1):
    if arr[i] == 'pest':
        del arr[i]

print(arr)

ну условие "len(set(word))" – A4eVsmisle 2 минуты назад

for i in range(len(arr) - 1, -1, -1):
    if len(set(arr[i])) > 4:
        del arr[i]


А как сделать что бы команда написанная пользователем после выполнения удалялась? [дубликат]

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

[discord.py]Удаление сообщение после выполнениыя команды

                                (2 ответа)

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

<code>
async def say(ctx, *arg):
await ctx.send(' '.join(arg))
</code>

Если ты имеешь в виду терминал, то используй библиотеку os. Она позволяет выполнять команды в терминале из Python скрипта.
<code>
    import os
    os.system("cls") # Для Windows
    ####
    os.system("clear") # Для unix систем
</code>


Обработка полученных данных в FastAPI
Я хочу сделать небольшую серверную часть на Python (3.9), которая будет принимать POST запросы в формате JSON, записывать полученные данные в файл, и задействовать функцию которая запустит дальнейшую обработку файла.
Я выбрал FastAPI т.к в этом не шарю от слова совсем, читал читал, перечитался... Ответа на свой вопрос я не нашел, начал эксперементировать, по документации сделал "Hello, world" и начал копать, нашел декоратор @app.post(), с ним также поэксперементировал и ничего не понял.
Очень прошу показать осуществление моей задачи на примере, с комментариями. Если вы подскажете решение на любой другой библиотеке буду не против.

Если вы используете FastAPI вместе с Pydantic то получается что-то в этом роде.
<code>
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel

def my_sum():
    s = 0
    with open('text.txt', 'r') as f:
        nums = f.read().splitlines()
        for el in nums:
            s+=int(el)
    return(s)

app = FastAPI()

class Item(BaseModel):
    Index:int

@app.get("/")
async def read_root():
    return {"Hello": "word"}

@app.post("/post")
async def sum_index(item: Item):
    with  open('text.txt', 'w') as f:
        for i in range(item.Index):
            f.write(str(i) + '\n')
    result = my_sum()
    return result
</code>


Почему fetchone() возвращает None?
Столкнулся с проблемой получения данных из БД.

def addKid():
    PARENT = input("NAME of father or mother: ")
    KGARTEN = input("NAME of KinderGarten: ")

    cur.execute(f"INSERT INTO Parents(NAME) VALUES(?);", PARENT )
    con.commit()

    cur.execute(f"SELECT max(ID_PARENTS) FROM Parents WHERE NAME = ?", [PARENT])
    PARENT_ID = cur.fetchone()
    con.commit()
    print("PARENT ", PARENT_ID)

    cur.execute(f"SELECT ID_KDG FROM kinderGarten WHERE NAME = ?", [KGARTEN])
    KGARTEN_ID = cur.fetchone()
    con.commit()
    print("KGARTEN_ID ", KGARTEN_ID)

Проблема заключается в том, что при вызове
fetchone(), возвращается
None.
Пытался найти в чем причина, нашел ответ насчет
con.commit(),  но это тоже не помогает. Есть какие-то идеи?
Иногда функция отрабатываать правильно и возвращает 2 значения
PARENT_ID,
KGARTEN_ID, а иногда частично и возвращает
PARENT_ID,
KGARTEN_ID = None.

я бы делал это так:
<code>
import sqlite3

con = sqlite3.connect(r"/tmp/test.sqlite")
cur = con.cursor()

cur.execute("create table parents(id integer primary key autoincrement, name text)")

def add_kid(con, parent):
    cur = con.cursor()
    cur.execute(f"INSERT INTO Parents(NAME) VALUES(?)", [parent])
    con.commit()
    # return last generated AUTOINCREMENT ID
    return cur.lastrowid

def get_kgarten_id(kgarten):
    cur.execute(f"SELECT ID_KDG FROM kinderGarten WHERE NAME = ?", [kgarten])
    kgarten_id = cur.fetchone()
    return kgarten_id[0] if kgarten_id else None

PARENT = input("NAME of father or mother: ")
KGARTEN = input("NAME of KinderGarten: ")

parent_id = add_kid(con, PARENT)
kgarten_id = get_kgarten_id(KGARTEN)
</code>


Сравнение файлов построчно
Есть код для сравнения файлов и поиска совпадений строк

fin = open("c:/SPISOK.txt", "r")
buf = fin.readlines()

for line in buf:
    line2 = line.rstrip('\n')
    with open('c:/FILE.txt', 'r') as file1:
     with open(line2, 'r') as file2:
      same = set(file1).intersection(file2)
      same.discard('\n')
      print line2
     for line in same:
      print line

FILE.txt - основной файл для сравнения
SPISOK.txt -список файлов для сравнения
Как брать только 1000 строк для сравнения, из каждого файла списка файлов SPISOK.txt.
SPISOK.txt:

c:/1.txt
c:/2.txt
c:/3.txt

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

itertools.islice(it, n) обрезает любой итератор до длины
n:

from itertools import islice

n = 1000

fin = open("c:/SPISOK.txt", "r")
buf = fin.readlines()

for line in buf:
    line2 = line.rstrip('\n')
    with open('c:/FILE.txt', 'r') as file1:
     with open(line2, 'r') as file2:
      same = set(file1).intersection(islice(file2, n))
      same.discard('\n')
      print line2
     for line in same:
      print line

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

from itertools import islice

n = 1000

with open('c:/FILE.txt') as file1:
    file1_set = set(file1)
    file1_set.discard('\n')

for fname2 in open('c:/SPISOK.txt'):
    fname2 = fname2.rstrip('\n')
    with open(fname2) as file2:
        print fname2
        for line in file1_set.intersection(islice(file2, n)):
            print line


Сравнение полей у объектов
Есть список обьектов, нужно перебирать его, и, если у двух любых обьектов, в этом списке, есть одинаковые поля - выполнять какие-то действия. Пробовал что-то вот такое:
<code>
for i in range(len(boxes) - 1):
    if boxes[i].x == boxes[i + 1].x and boxes[i].y == boxes[i + 1].y and direction == "right":
        boxes[i + 1].move(-self.player.speed, 0)
        player.move("left")
    elif boxes[i].x == boxes[i + 1].x and boxes[i].y == boxes[i + 1].y and direction == "left":
        boxes[i + 1].move(+self.player.speed, 0)
        player.move("right")
</code>
Код срабатывает, но не на все элементы, как сделать чтоб срабатывало на все элементы списка?

А если в лоб попробовать:
<code>
boxes = [
    {
        'key1': 12,
        'key2': 20,
    },
    {
        'key2': 30,
        'key3': 'test',
    },
    {
        'key3': 'test'
    }
]

# функция проверки на совпадение значений
def check(boxes):
    # проверить все элементы списка
    for i in range(len(boxes)):
        # проверить текущий элемент со всеми последующими элементами списка
        for j in range(i + 1, len(boxes)):
            # получить список одинаковых ключей
            keys_common = boxes[i].keys() & boxes[j].keys()

            # проверить значения одинаковых ключей
            for key in keys_common:
                if boxes[i][key] == boxes[j][key]:
                    return True

    return False

print("YES" if check(boxes) else "NO")
</code>
данная функция простых типов - числа, строки, булевы типы и т.п.
для сложных типов (итерируемые и т.п.) надо функцию сделать рекурсивной
т.е. если выбранные значения - это итерируемый объект - пройти по всем его элементам и вызвать саму себя,
если выбранные значения - словари, то пройти по всем ключам словаря и вызывать саму себя


Python keyboard.add_hotkey(): как правильно сохранить значения горячих клавиш?
В одном из приложений на библиотеке
keyboard, пытаюсь реализовать установку и последующее сохранение горячей(-их) клавиш(-и), для того чтобы после перезапуска приложения, кнопки подгружались, устанавливались и их не надо было заново биндить.
Документация: ссылка на документацию по библиотеке keyboard
Храню кнопки в БД, использую
SQLite
Алгоритм такой:

Если в базе пусто, создаем значение
button и вызываем функцию для прослушивания клавиш.
С помощью вызванной функции биндим  клавишу или сочетание клавиш
Алгоритм определяет одна ли это клавиша, или несколько и добавляет в
keyboard.add_hotkey(), после чего сохраняет.
Если при входе в базе не пусто - достает значение и также устанавливает
keyboard.add_hotkey().

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

Если сохранять кнопки через
keyboard.hook(), то из переданного события можно получить как название кнопки - "K"/"Л", так и ее код - 37. И если биндить уже код, тогда проблемы не возникает, ведь код кнопки общий для обеих раскладок. Но мне нужна возможность биндить 2 клавиши, а
keyboard.hook() сразу отправляет
event при нажатии одной.
Я пробовал получать коды кнопок через
keyboard.key_to_scan_codes(), но в таком случае их нельзя забиндить через метод
keyboard.add_hotkey(), так как он принимает значение
key либо в виде строки:
'ALT+F', либо в виде числа. И если я захочу записать комбинацию клавиш в виде
int - я получу сумму этих чисел, то есть совсем другую ОДНУ клавишу.

Примеры:

keyboard.add_hotkey('ctrl+shift', callback) ⬅⬅⬅⬅⬅ True
keyboard.add_hotkey(29, callback) ⬅⬅⬅⬅⬅ True (29 - код кнопки CTRL)
keyboard.add_hotkey(16+17, callback) ⬅⬅⬅⬅⬅ True (16 - Q, 17 - W, но в результате получаем 33 - кнопка F)
keyboard.add_hotkey('16+17', callback) ⬅⬅⬅⬅⬅ False (16 - Q, 17 - W, но keyboard говорит что это неизвестные клавиши)

Код: (не уверен, что он нужен)

import keyboard, sqlite3

def callback():
    print('Функция вызвана')

def bind_keys():
    print('Нажмите клавишу / Сочетание двух клавиш')

    key = keyboard.read_hotkey(suppress=False)
    key = str(key).split('+')

    if len(key) == 2:
        print(f'Нажато две кнопки: {key[0].upper()}, {key[1].upper()}')
        key = f'{key[0]}+{key[1]}'
    elif len(key) == 1:
        print(f'Нажата одна кнопка: {key[0].upper()}')
        key = key[0]

    keyboard.add_hotkey(key, callback, suppress = False)

    sql.execute(f"SELECT button FROM test WHERE button = '{key}'")
    if sql.fetchone() is None:
        sql.execute(f"INSERT INTO test VALUES('{key}')")
        db.commit()
        print('Клавиши сохранены')
    keyboard.wait()

db = sqlite3.connect('db.db')
sql = db.cursor()
sql.execute("CREATE TABLE IF NOT EXISTS test(button TEXT)")
db.commit()

sql.execute("SELECT * FROM test")
key = sql.fetchone()
if key != None:
    keyboard.add_hotkey(key[0], callback, suppress = False)
    keyboard.wait()
else:
    bind_keys()

Самое логичное - сохранить названия клавиш в словарь типа

keys = {
   'w' : 'ц',
   'a' : 'ф',
   's' : 'ы',
   'd' : 'в'
}

И затем, проверяя текущую раскладку, например так

import ctypes

def get_layout():
    u = ctypes.windll.LoadLibrary("user32.dll")
    pf = getattr(u, "GetKeyboardLayout")
    if hex(pf(0)) == '0x4190419':
        return 'ru'
    if hex(pf(0)) == '0x4090409':
        return 'en'

Устанавливать сочетания клавиш уже по значениям словаря:

keyboard.add_hotkey(f"{keys['ctrl']}+{keys['shift']}", callback)


Как вывести в файл float с запятой?
Подскажите, как вывести в
csv файл строку, в которой содержатся числа
float, но не с точкой а с запятой? Видел что можно прописать

import locale
locale.setlocale(locale.LC_NUMERIC, 'rus')

Но не помогло

Мне нужно вывести данные вида

1,99; 2,33

Я получаю

"1,99"; "2,33" или 1.99; 2.33

import locale
locale.setlocale(locale.LC_NUMERIC,"ru_RU")

value = 3.1415

print(locale.str(value))


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

a[-1] + a[1:-2] + a[0]

Сам основной код:

b = input("Введіть Ваш текст: ")
print(b)
removed = b.replace(".", "")
a = list(removed.split())
new = [x[:-1] for x in a]
del new[-1]
#недостаящая часть
print

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

removed = b[:-1]

после того как вы разбили
removed на список слов и знаете последнее - сформируйте новый список без последнего слова и одинаковых с ним:

new = [word for word in a if word != a[-1]]

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

word[1:-1]

т.е. весь ваш код будет:

words = input("Введіть Ваш текст: ")[:-1].split()

text = ' '.join(word[1:-1] for word in words if word != words[-1]) + '.'

print(text)

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


Заполнить рандомно n множеств из одного множества
Здрасте. Делал лабораторную и тут просто дич а не задача(не репорьте). крч есть множество n-это ассоримент продуктов (ну я его задал). И есть m магазинов где есть какие-то продукты из множества n. Нужно сделать множества продуктов которые: А) есть во всех магазинах; B) множество продуктов которые есть хотя бы в одном и C) которых нету нигде.
Но вот проблема с тем что-бы m магазинам раздать рандомное x продуктов из множества n

Делал лабораторную и тут просто дич а не задача(не репорьте)

если разложить задачу на небольшие подзадачи, то это уже не будет ДИЧЬЮ, а будет легко решаема

Но вот проблема с тем что-бы m магазинам раздать рандомное x продуктов из множества n

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

for i in range(n):
    # перемешать товары
    random.shuffle(storage)

    # получить кол-во товаров для магазина i
    count = random.randomint(1, len(storage))

    # получить товары
    shops.attach(storage[:count])

если надо уменьшать - то надо всего лишь добавить 1 строку - уменьшение списка доступных товаров:

for i in range(n):
    # перемешать товары
    random.shuffle(storage)

    # получить кол-во товаров для магазина i
    count = random.randomint(1, len(storage))

    # получить товары
    shops.attach(storage[:count])

    # уменьшить список товаров
    storage = storage[count:]

А) есть во всех магазинах; B) множество продуктов которые есть хотя бы в одном и C) которых нету нигде.

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

common = goods1 & goods2
unique = goods1 ^ goods2

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

# перемешать товары
random.shuffle(storage)

# выбрать товары
for i in range(n):

    # получить кол-во товаров для магазина i, но так чтобы для остальных магазинов осталось хотя бы по 1 товару
    count = random.randomint(1, len(storage) - i)

    # получить товары
    shops.attach(storage[:count])

    # уменьшить список товаров
    storage = storage[count:]


Как проверить на вхождение вектора в матрицу?
Пусть есть матрица и вектор:

X = np.array(
    [
     [1, 20, 0.3],
     [10, 11, 12],
     [32, 5, -6],
     [7, 8, 9],
    ]
)

y = np.array([7, 8, 9])

Каким образом я могу проверить, является ли вектор
y строкой матрицы
X? Именно строкой.
Примеры:

y = np.array([7, 8, 9]) # True
y = np.array([7, 9, 8]) # False
y = np.array([7, 8, 10]) # False
y = np.array([20, 11, 5, 8]) # False
y = np.array([10, 11, 12]) # True

Рассчитывал на
in, но он ведёт себя не так, как я хочу.

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

res = np.isclose(X - y, np.zeros(y.shape)).all(axis=1).any()

результат:

In [52]: res
Out[52]: True


selenium select получить значение выбранного пункта

<select name="WPLANG" id="WPLANG"><option value="" data-installed="1" lang="en">English (United States)</option>
<option value="pt_PT" selected="selected" data-installed="1" lang="pt">Português</option></select>

не очень понимаю, как при помощи selenium получить содержимое
selected="selected", т.е.
Português
пытаюсь так

    element = driver.find_element_by_xpath("//option[@selected='selected']")

но, что то не работает

Нужно было в xpath указывать тег родителя:
<code>
element = driver.find_element_by_xpath("//select[@id='WPLANG']/option[@selected='selected']")
</code>


python regular expression содержимое квадратных скобок
Имеется строка

text = '''
out: out out out kkk: aaa_aaa_aaa
ttt ttt: [ttt: ttt = "" ttt ttt ttt ttt ttt; ttt ttt: ttt ttt ttt-45645645 ttt ttt - 23.10.2020. ttt ttt ttt ttt ttt!
(ttt-ttt-00151) (ttt ttt: 99)"" ttt: ]
out kkk: out out out
out kkk: out out out out out out out.out out.out out
'''

Нужно получить с помощью регулярного выражения

ttt ttt: [ttt: ttt = "" ttt ttt ttt ttt ttt; ttt ttt: ttt ttt ttt-45645645 ttt ttt - 23.10.2020. ttt ttt ttt ttt ttt!
    (ttt-ttt-00151) (ttt ttt: 99)"" ttt: ]

Пытался использовать
re.findall(r'ttt ttt:\s*\[.*\]', text), но безуспешно. Как можно решить такую задачу?

re.findall(r'ttt ttt:\s*\[.*\]', text, flags=re.DOTALL)


Как в конце вместо запятой сделать точку?

s = 'неделя, человек, путь, женщина, книга, путь, глаз, сторона, дом, путь.'
s = s.replace('а', '')
s = s.replace('у', '')
s = s.replace('о', '')
s = s.replace('ы', '')
s = s.replace('и', '')
s = s.replace('э', '')
s = s.replace('я', '')
s = s.replace('ю', '')
s = s.replace('ё', '')
s = s.replace('е', '')
s = s[:-1]
x = s.split()[-1]
s = s.replace(x, '').replace(', ,', ',')
print(s)

Мне выводит:

ндл, члвк, жнщн, кнг, глз, стрн, дм,

Я хочу чтобы вывело:

ндл, члвк, жнщн, кнг, глз, стрн, дм.

Укажите пожалуйста на мою ошибку и что я делаю не так?

Ну раз вы не извлекаете никакого опыта из предыдущих ответов...
Вот конкретно как делается ваш текущий

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

words = ''.join(letter for letter in s if letter not in 'аеёиоуыэюя')[:-1].split(", ")

s = ', '.join(word for word in words if word != words[-1]) + '.'

print(s)

из строки получить список букв без гласных

 arr = [letter for letter in s if letter not in 'аеёиоуыэюя']

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

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

 string = ''.join(arr)

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

 string = string[:-1]

т.е. сделать срез строки от 0 символа до предпоследнего (
-1 от конца)

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

 words = string.split(', ')

удалить из списка все элементы равные последнему элементу (последнему слову)

последний элемент -
words[-1]
удаление элементов через сбор нового списка в который такие элементы не входят

    new_words = [word for word in words if word != words[-1]]

или через фильтрацию с помощью функции filter

    new_words = filter(lambda word: word != words[-1], words)

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

 string = ', '.join(new_words)

добавить точку

 string = string + '.'

P.S.
касательно шага 5) - через фильтрацию:

s = ', '.join(filter(lambda word: word != words[-1], words)) + '.'


Как использовать в PyEnchant словари, не загружая их в саму библиотеку, а загрузив их в пользовательские файлы?
Использую библиотеку PyEnchant для проверки орфографии на страницах сайта. Всё хорошо, кроме того, что словари hunspell(backend PyEnchant) необходимо загружать в саму библиотеку. Так и не смог найти способ, как заставить его загружать словари из нужной мне папки. В документации только указано определение кастомных словарей. Подскажите, пожалуйста, есть ли способ?

Решил вроде вашу проблему. В папке со словарями создаете папку
hunspell и копируете/перемещаете туда ваши словари. Создаете локальную переменную
ENCHANT_CONFIG_DIR и присваиваете ей значение
путь\к\папке\со\словарями без указания вложенной папки
hunspell.
Windows:

[System.Environment]::SetEnvironmentVariable('ENCHANT_CONFIG_DIR','путь\к\папке\со\словарями',[System.EnvironmentVariableTarget]::Machine)

Linux:

export ENCHANT_CONFIG_DIR='/папка/со/словарями'

После этого все должно заработать (у меня, по крайней мере, заработало). Удачи!
UPDATE
А если используете виртуальное окружение, то внесите переменную в файл
.env


Ошибка module 'rsa' has no attribute 'newkeys' (most likely due to a circular import)
Код:

import rsa

#Боб формирует публичный и секретный ключ

(bob_pub, bob_priv) = rsa.newkeys(512)

#Алиса формирует сообщение Бобу и кодирует его в UTF8,
#поскольку RSA работает только с байтами
message = 'hello Bob!'.encode('utf8')

#Алиса шифрует сообщение публичным ключом Боба
crypto = rsa.encrypt(message, bob_pub)

#Боб расшифровывает сообщение своим секретным ключом
message = rsa.decrypt(crypto, bob_priv)
print(message.decode('utf8'))

Устанавливал модуль как сказано в документации:
pip install rsa
Использую Python 3.9.
В чем может быть проблема?

Потому, что ваш файл очевидно называется
rsa.py, значит, ищется ваша функция
newkeys(), а в вашем файле такой нет.
Переименуйте ваш файл.


Как выделить текст между маркерами?

import re

def between_markers(text: str, begin: str, end: str) -> str:
    """
       returns substring between two given markers
    """
    if begin in text or end in text:
        x=re.compile((begin if begin in text else r'')+r'(?P<word>.+)'+(end if end in text else r''))
        y=x.search(text)
    else:
        return text
    return y.group('word')

if __name__ == '__main__':
    print('Example:')
    print(between_markers('What is >apple<', '>', '<'))
    print(between_markers("<head><title>My new site</title></head>",
                       "<title>", "</title>"))
    print(between_markers('No[/b] hi', '[b]', '[/b]'))
    print(between_markers('No [b]hi', '[b]', '[/b]'))

Я хочу сделать с помощью 're', но на последних двух строках кода он считает и маркеры.
Можно ли это исправить?
Результат должен быть такой:

assert between_markers('What is >apple<', '>', '<') == "apple", "One sym"
assert between_markers("<head><title>My new site</title></head>",
                       "<title>", "</title>") == "My new site", "HTML"
assert between_markers('No[/b] hi', '[b]', '[/b]') == 'No', 'No opened'
assert between_markers('No [b]hi', '[b]', '[/b]') == 'hi', 'No close'

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

def between_markers(text: str, begin: str, end: str) -> str:
    """
    returns substring between two given markers
    """
    begin = re.escape(begin) if begin in text else ""
    end = re.escape(end) if end in text else ""
    pat = re.compile(fr".*?{begin}(.+){end}.*")
    return pat.sub(r"\1", text)

тесты:

In [27]: between_markers('What is >apple<', '>', '<')
Out[27]: 'apple'

In [28]: between_markers("<head><title>My new site</title></head>", "<title>", "</title>")
Out[28]: 'My new site'

In [29]: between_markers('No[/b] hi', '[b]', '[/b]')
Out[29]: 'No'

In [30]: between_markers('No [b]hi', '[b]', '[/b]')
Out[30]: 'hi'

Описание
f-string
Описание
r-string


Применение стороннего скрипта к изображению и сохранение его в базу
Пишу небольшой проект на django, требуется получить изображение от пользователя через форму, применить функцию из скрипта к изображению, сохранить изображение и результат в одну строку базы данных
views.py

from pic_script import res_pic #функция, которую нужно применить
from django.http import HttpResponseRedirect
from django.shortcuts import render

from .forms import DB_Form
from .models import DB_Image

def index(request):
    db_image = DB_Image.objects.all()
    form = DB_Form(request.POST, request.FILES)
    return render(request, "index.html", context = {'form' : form, 'db_image' : db_image,})

def create(request):
    if request.method == "POST":
        form = DB_Form(request.POST, request.FILES,)
#где-то здесь должен быть вызов функции
        form.save()
    return HttpResponseRedirect("/")

models.py

from django.db import models

class DB_Image(models.Model):
    image = models.ImageField(upload_to="images") #поле для сохранения изображения
    text = models.TextField() #поле для сохранения результата

forms.py

from django import forms
from .models import DB_Image

class DB_Form(forms.ModelForm):
    class Meta:
        model = DB_Image
        fields = ("image",)

можно вызвать в методе save твоей формы

class DB_Form(forms.ModelForm):
    class Meta:
        model = DB_Image
        fields = ("image",)

    def save(self, *args, **kwargs):
       if self.instance.pk is None: # если тебе нужно что бы функция вызывалась не только при создании, а при любом сохранении, то убери это условие
           self.instance.text = твоя_функция(self.instance.image)
       return super().save(*args, **kwargs)

если хочешь сделать во view, тогда форму можно не трогать, а подправить твой
create метод

def create(request):
    if request.method == "POST":
        form = DB_Form(request.POST, request.FILES,)
        if form.is_valid():
            db_image = form.save(commit=False)
            db_image.text = твоя_функция(db_image.image)
            db_image.save()
    return HttpResponseRedirect("/")


Убрать гласные буквы в строке и слова которые одинаковые с последним словом
У меня код уже удаляет гласные и теперь нужно только удалить слова путь.
<code>
s = 'неделя, человек, путь, женщина, книга, путь, глаз, сторона, дом, путь.'
s = s.replace('а', '')
s = s.replace('у', '')
s = s.replace('о', '')
s = s.replace('ы', '')
s = s.replace('и', '')
s = s.replace('э', '')
s = s.replace('я', '')
s = s.replace('ю', '')
s = s.replace('ё', '')
s = s.replace('е', '')
x = s.split()[-1]
s = s.replace(x, "")
print(s)
</code>
У меня код уже удаляет гласные и теперь нужно только удалить слова путь. Щас х = "путь." и я не могу удалить другие повторяющиеся слова, потому что они "путь,". Как мне удалить все повторяющиеся слова?

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

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

s = ''.join(letter for letter in s if letter not in 'аеёиоуыэюя')[:-1]

print(s)

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

words = s.split(", ")

s = ', '.join(word for word in words if word != words[-1])


CSV и матрица. Python
Есть 3 файла с кодами, главный файл производит команды, которые меняет матрицу(заменяет все значения матрицы на 0) внутри файла csv и записывает её в новый csv файл. Но мне нужно поменять, чтобы второй файл менял первую и последнюю строчку матрицы местами, а не заменял их на 0. Я никак не могу додуматься как это сделать, помогите пожалуйста
Главный файл:

import matrixfile as mf
import matrixziro as mz
from matplotlib.pyplot import matshow, show

mzr = mz.GetZiroMatrix(mf.GetMatrix('tekst.csv'))
mf.SaveMatrix(mzr, 'resultat_2.csv')

matshow(mzr)
show()

Второй файл название matrixziro.py, в нём  не получается сделать замену

def GetZiroMatrix(mt):
    return [len(m) - 1], m[0] = m[0],len(m) - 1]* len(row) for row in mt] #не работающая функция,оператор должен остаться обязательно

третий файл matrixfile.py

import csv

def GetMatrix(filename):
    return [[int(token) for token in line.split()] for line in open(filename)]

def SaveMatrix(mt, filename):
    with open(filename, 'w') as f:
        for row in mt:
            print(' '.join(map(repr, row)), file=f)

def GetMatrix(filename, skip_last_n_rows=4):
    return [[int(token) for token in line.split()] for line in open(filename)][:-skip_last_n_rows]


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

def check_coupon(entered_code, correct_code, current_date, expiration_date):

value = False

entered_code = str (entered_code)
correct_code = str (correct_code)

print (   current_date.replace (",", "").split ())
print (expiration_date.replace (",", "").split ())

months = {
    1  : "January"  ,
    2  : "February" ,
    3  : "March"    ,
    4  : "April"    ,
    5  : "May"      ,
    6  : "June"     ,
    7  : "July"     ,
    8  : "August"   ,
    9  : "September",
    10 : "October"  ,
    11 : "November" ,
    12 : "December"
    }

if  entered_code == correct_code:

    splitted_current_date    =    current_date.replace (",", "").split ()
    splitted_expiration_date = expiration_date.replace (",", "").split ()

    i = 1

    while i <= 12:
        if months [i] == splitted_current_date    [0]:    current_month = i

        if months [i] == splitted_expiration_date [0]: expiration_month = i

        i += 1

    print (current_month   )
    print (expiration_month)

    current_day     = int (splitted_current_date    [1])
    expiration_day  = int (splitted_expiration_date [1])

    current_year    = int (splitted_current_date    [2])
    expiration_year = int (splitted_expiration_date [2])

    print (current_day)
    print (expiration_day)
    print (current_year)
    print (expiration_year)

    if current_year <= expiration_year:
        if current_month <= expiration_month:
            if current_day <= expiration_day:
                value = True

    else:
        value = False

else:
    value = False

return value

Вот так тестил работоспособность кода:

print (check_coupon ('123','123','September 5, 2014','October 1, 2014'), True)
print (check_coupon ('123a','123','September 5, 2014','October 1, 2014'), False)

print (check_coupon ("123", "123", "July 9, 2015", "July 9, 2015"), "==", True)
print (check_coupon ("123", "123", "July 9, 2015", "July 2, 2015"), "==", False)

Проблема в этом куске кода:

if current_year <= expiration_year:
        if current_month <= expiration_month:
            if current_day <= expiration_day:
                value = True

Пробовал еще вот так:

if current_year <= expiration_year and current_month <= expiration_month and current_day <= expiration_day:
    value = True

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

from datetime import datetime

def check_coupon(entered_code, correct_code, current_date, expiration_date):

    current = datetime.strptime(current_date, '%B %d, %Y')
    expiration = datetime.strptime(expiration_date, '%B %d, %Y')

    return entered_code == correct_code and current <= expiration

print(check_coupon(123, 123, 'September 5, 2014','October 1, 2014'))
print(check_coupon(123, 123, "July 9, 2015","July 2, 2015"))

Вывод:

True
False

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

from datetime import datetime

date_str1 = 'Monday, December 7, 2020'
date_str2 = '7/12/20'
date_str3 = '7-12-2018'

date_dt1 = datetime.strptime(date_str1, '%A, %B %d, %Y')
date_dt2 = datetime.strptime(date_str2, '%d/%m/%y')
date_dt3 = datetime.strptime(date_str3, '%d-%m-%Y')

print(date_dt1)
print(date_dt2)
print(date_dt3)

Вывод:

2020-12-07 00:00:00
2020-12-07 00:00:00
2018-12-07 00:00:00


Превратить список списков в плоский список однострочником (без использования дополнительных модулей)?
У меня есть список списков:

arr = [[1, 2], [3, 4], [1, 4]]

Необходимо получить все элементы (числа) из данной конструкции.
Реализовал в лоб:

res = []
for obj in arr:
    res += [elem for elem in obj]

Но хочется однострочного решения.
Подскажите, можно ли его стандартными средствами (без дополнительных библиотек) реализовать?
Перебрал несколько вариантов, пока ничего не нашел.

PS: нашел такой "изврат", но это все таки богомерзкий "изврат", а не красивое решение:

res = list(map(int, ' '.join(f"{obj[0]} {obj[1]}" for obj in arr).split()))

Воспользуйтесь параметром sum(..., start=[]):

res = sum(arr, [])

результат:

In [4]: res
Out[4]: [1, 2, 3, 4, 1, 4]

Но наиболее идиоматичным решением в данном случае будет использование itertools.chain. Об этом даже есть упоминание в
docstring по встроенной функции
sum():

To concatenate a series of iterables, consider using
itertools.chain().

from itertools import chain

res = list(chain.from_iterable(arr))

UPDATE: сравнение скорости выполнения разных решений:

In [9]: %timeit sum([list(range(1000))]*1000, [])
2.25 s ± 69.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [10]: %timeit [x for xs in [list(range(1000))]*1000 for x in xs]
27.9 ms ± 428 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [11]: %timeit list(chain.from_iterable([list(range(1000))]*1000))
11.8 ms ± 266 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


Сумма чисел из стандартного ввода
Необходимо написать программу, которая считывает со стандартного ввода целые числа по одному числу и после первого введённого нуля - выводит сумму полученных на вход чисел.
Не понимаю - где ошибка?
<code>
text = int(input("Вводите значение: "))  # вводим элементы массива

while text != (int(0)):  # цикл - до тех пор, пока -text != 0, добавляет значения в массив -a
    a.append(text)  # добавляем значение в массив

    if text == (int(0)):  # если -text == 0, выводим сумму всех элементов массива
        print(sum(a))  # суммируем между собой все элементы массива
</code>

У вас не объявлен список
a.
Бесконечный цикл работает не так, как нужно. На каждой итерации цикла после добавления нужно запрашивать новое значение.

text = int(input("Вводите значение: "))  # вводим элементы массива
a = []

while text != 0:  # цикл - до тех пор, пока -text != 0, добавляет значения в массив -a
    a.append(text)  # добавляем значение в массив
    text = int(input("Вводите значение: "))

print(sum(a))  # суммируем между собой все элементы массива


'float' object is not callable. Помогите исправить ошибку

import random
import time
import math

#среднее значение
def average_value(numbers):
    return float(sum(numbers) / len(numbers))

class node:
    def __init__(self, value = None):
        self.value = value
        self.left_child= None
        self.right_child= None
        self.parent= None # указатель на род. узел в дереве

class binary_search_tree:
    def __init__(self):
        self.root = None

    def insert(self, value):
        if self.root == None:
            self.root = node(value)
        else:
            self._insert(value, self.root)

    def _insert(self, value, cur_node):
        if value < cur_node.value:
            if cur_node.left_child == None:
                cur_node.left_child = node(value)
                cur_node.left_child.parent = cur_node # установаливаем род
            else:
                self._insert(value, cur_node.left_child)
        elif value > cur_node.value:
            if cur_node.right_child == None:
                cur_node.right_child = node(value)
                cur_node.right_child.parent = cur_node # установаливаем род
            else:
                self._insert(value,cur_node.right_child)
                # если уже есть данный эл, то не добавляем

    def search(self, value):
        if self.root != None:
            return self._search(value, self.root)
        else:
            return False

    def _search(self, value, cur_node):
        if value == cur_node.value:
            return True
        elif value < cur_node.value and cur_node.left_child != None:
            return self._search(value, cur_node.left_child)
        elif value > cur_node.value and cur_node.right_child != None:
            return self._search(value, cur_node.right_child)
        return False

tree = binary_search_tree()

succ = []
fail = []

i = 0

#заполнение дерева
for i in range(10000):
    tree.insert(int(random.random() * 10 ** 4))
    i += 1
    print(i)

#поиск в дереве
for i in range(10 ** 3):
    rand = int(random.random() * 10 ** 4)
    start_time = time.time()
    result = tree.search(rand)
    finish_time = time.time() - start_time
    if result == True:
        succ.append(finish_time)
    else:
        fail.append(finish_time)

if (len(succ) == 0):
    print("Нет успешных результатов поиска!")
else:
    min_time = min(succ)
    max_time = max(succ)
    average_time = average_value(succ)

    sum = 0

    for i in range(len(succ)):
        sum += (succ[i] - average_time) ** 2

    deviation_time = math.sqrt((1 / len(succ) + 1) * sum) # стандартное отклонение

    print("")
    print("")

    print("min time: " + str(min_time))
    print("max time: " + str(max_time))
    print("average time: " + str(average_time))
    print("deviation time: " + str(deviation_time))

print("")
print("")

if (len(fail) == 0):
    print("Нет неудачных результатов поиска!")
else:
    average_time = average_value(fail)

    sum = 0

    for i in range(len(fail)):
        sum += (fail[i] - average_time) ** 2

    deviation_time =  math.sqrt((1 / len(fail)) * sum) # стандартное отклонение

    print("average time: " + str(average_time))
    print("deviation time: " + str(deviation_time))

Возникло исключение:

TypeError
'float' object is not callable
  File ".....", line 8, in average_value
    return float(sum(numbers) / len(numbers))
  File ".....", line 109, in <module>
    average_time = average_value(fail)

У вас есть переменная
sum которая является числом а не функцией

sum = 0

измените название и все заработает


Как остановить asyncio.sleep в дискорд боте
У меня есть дискорд бот, который должен каждый определённый промежуток времени отправлять сообщение в чат и он прекрасно с этим справляется, но теперь я не могу его остановить. Как мне это сделать?
Код:

@bot.command()
async def task(ctx, arg):
    t = False
    i = 0
    if arg == 'on':
        t = True
    elif arg == 'off':
        t = False
    else:
        await ctx.send('Error!')
    while t == True:
        i += 1
        await ctx.send(i)
        await asyncio.sleep(10)

Пытался создать
bot.loop.create_task(task(ctx, arg)) как это показано в одном из примеров, но моя функция требует
ctx и
arg которые есть только внутри команды.

async def task_periodic(ctx, arg):
    i = 0
    while True:
        i += 1
        await ctx.send(i)
        await asyncio.sleep(10)

@bot.command()
async def task(ctx, arg):
    if arg == 'on':
        ctx.periodic = bot.loop.create_task(task_periodic(ctx, arg))
    elif arg == 'off':
        if hasattr(ctx,'periodic'):
            ctx.periodic.cancel()
        else:
            ctx.send('first send on')
    else:
        await ctx.send('Error!')

пробуй что-то в этом ключе.
При вызове .cancel() в операции с await произойдет исключение CancelledError, и цикл грохнется.
Желательно ещё сделать обработку исключений после отмены:

try:
    await ctx.periodic
except ...:
    ....

но и без этого исключение не рушит основной цикл.


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

N = 10
a = []
for i in range(1, N-1):
    a.append(20)
    print(a[i])

Ошибка:

    print(a[i])
IndexError: list index out of range

вот поэтому

for i in range(1, N-1):

а надо так:

for i in range(N):

индексы списков от 0 считаются


Возможно ли объединить несколько строк в одну?
<code>
s = s.replace("а", "")
s = s.replace("у", "")
s = s.replace("о", "")
s = s.replace("ы", "")
s = s.replace("и", "")
s = s.replace("э", "")
s = s.replace("я", "")
s = s.replace("ю", "")
s = s.replace("ё", "")
s = s.replace("е", "")
</code>
Как объединить в одну строку?

Вариант решения с использованием регулярных выражений:
<code>
import re

res = re.sub(r"[ауоыиэяюёе]", "", s)
</code>


Разделить строку на списки с одинаковыми символами
Есть строка, которая состоит из несколько разных и в разный момент повторяющихся символов
Пример:
'<<<VVV>>>VVV'
Надо получить:
['<<<', 'VVV', '>>>', 'VVV'] или
[['<', '<', '<'], ['V', 'V', 'V'], ['>', '>', '>'], ['V', 'V', 'V']]
То есть надо разделять строку как только следующий символ становиться другим.
Подряд может идти также только один символ, в этом случае его надо отделять так же, как все остальные.
Можно использовать любые библиотеки
Как это сделать в одну строку кода? Если никак, то прошу показать самый короткий по коду вариант.
Вот как сделал я:

result = []
last_elem = string[0]
temp = []
for elem in string:
    if elem == last_elem:
        temp.append(elem)
    else:
        result.append(temp)
        temp = [elem]
        last_elem = elem
result.append(temp)

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

import re

a = "<<<VVV>>>VVV"

res = [x[0] for x in re.findall(r"((.)\2*)", a)]

res:

['<<<', 'VVV', '>>>', 'VVV']


Возникло исключение: TypeError 'int' object is not iterable. Помогите исправить ошибку
<code>
import random
import time
import math

#среднее значение
def average_value(numbers):
    return float(sum(numbers) / max(len(numbers)))

class node:
    def __init__(self, value = None):
        self.value = value
        self.left_child= None
        self.right_child= None
        self.parent= None # указатель на род. узел в дереве

class binary_search_tree:
    def __init__(self):
        self.root = None

    def insert(self, value):
        if self.root == None:
            self.root = node(value)
        else:
            self._insert(value, self.root)

    def _insert(self, value, cur_node):
        if value < cur_node.value:
            if cur_node.left_child == None:
                cur_node.left_child = node(value)
                cur_node.left_child.parent = cur_node # установаливаем род
            else:
                self._insert(value, cur_node.left_child)
        elif value > cur_node.value:
            if cur_node.right_child == None:
                cur_node.right_child = node(value)
                cur_node.right_child.parent = cur_node # установаливаем род
            else:
                self._insert(value,cur_node.right_child)
                # если уже есть данный эл, то не добавляем

    def search(self, value):
        if self.root != None:
            return self._search(value, self.root)
        else:
            return True

    def _search(self, value, cur_node):
        if value == cur_node.value:
            return True
        elif value < cur_node.value and cur_node.left_child != None:
            return self._search(value, cur_node.left_child)
        elif value > cur_node.value and cur_node.right_child != None:
            return self._search(value, cur_node.right_child)
        return False

tree = binary_search_tree()

succ = []
fail = []

i = 0

#заполнение дерева
for i in range(10000):
    tree.insert(int(random.random() * 10 ** 4))
    i += 1
    print(i)

#поиск в дереве
for i in range(10 ** 3):
    rand = int(random.random() * 10 ** 4)
    start_time = time.time()
    result = tree.search(rand)
    finish_time = time.time() - start_time
    if result == True:
        succ.append(finish_time)
    else:
        fail.append(finish_time)

if (len(succ) == 0):
    print("Нет успешных результатов поиска!")
else:
    min_time = min(succ)
    max_time = max(succ)
    average_time = average_value(succ)

    sum = 0

    for i in range(len(succ)):
        sum += (succ[i] - average_time) ** 2

    deviation_time = math.sqrt((1 / i) * sum) # стандартное отклонение

    print("")
    print("")

    print("min time: " + str(min_time))
    print("max time: " + str(max_time))
    print("average time: " + str(average_time))
    print("deviation time: " + str(deviation_time))

print("")
print("")

if (len(fail) == 0):
    print("Нет неудачных результатов поиска!")
else:
    average_time = average_value(fail)

    sum = 0

    for i in range(len(fail)):
        sum += (fail[i] - average_time) ** 2

    deviation_time =  math.sqrt((1 / i) * sum) # стандартное отклонение

    print("average time: " + str(average_time))
    print("deviation time: " + str(deviation_time))
</code>

def _insert(self, value, cur_node):
    if value  cur_node.value:

Что за хитрый
if?

def _search(self, value, cur_node):
    if value == cur_node.value:
        return True
    elif value  cur_node.value and cur_node.right_child != None:

Аналогично
Ну и конкретно по вашему вопросу:

def average_value(numbers):
    return float(sum(numbers) / max(len(numbers)))

вы передаёте в функцию вот такой список

[0.0, 0.0, 0.0, 0.0, 0.0]

угадайте что происходит :)
надо сделать так:

def average_value(numbers):
    return float(sum(numbers) / len(numbers))

Тогда у вас ошибка уже вот тут:

deviation_time = math.sqrt((1 / i) * sum)  # стандартное отклонение

Деление на
0
Так что надо проверять еще и
i, например так:

deviation_time = 0 if i == 0 else math.sqrt((1 / i) * sum)  # стандартное отклонение

тогда код уже не выдает ошибок и доходит до конца


Модули и функции в Python
У меня есть код который преобразовывает матрицу из csv-файла  в матрицу состоящую из нулей и сохраняет её в новый csv-файл , мне нужно чтобы код, производящий преобразования матрицы  был выделен в отдельные функции, принимающие исходную матрицу в качестве аргумента и возвращающий преобразованную матрицу через ключевое слово return. Каждая функция должна так же находиться в собственном модуле. Не понимаю,  что именно и куда надо добавить, помогите пожалуйста
<code>
import csv
m = [[int(token) for token in line.split()] for line in open('tekst.csv')]

mz = [[0] * len(row) for row in m]

with open('resultat_1.csv', 'w') as f:
    for row in mz:
        print(' '.join(map(repr, row)), file=f)
from matplotlib.pyplot import matshow, show

matshow(mz)
show()
</code>

Итого вам видимо нужно сделать три файла.
1й файл называете matrixfile.py
Вот его содержимое:

import csv

def GetMatrix(filename):
    return [[int(token) for token in line.split()] for line in open(filename)]

def SaveMatrix(mt, filename):
    with open(filename, 'w') as f:
        for row in mt:
            print(' '.join(map(repr, row)), file=f)

2й файл называете matrixziro.py
Вот его содержимое:

def GetZiroMatrix(mt):
    return [[0] * len(row) for row in mt]

Ну и 3й файл называете как угодно, но главное что бы расширение было .py
Вот его содержимое:

import matrixfile as mf
import matrixziro as mz
from matplotlib.pyplot import matshow, show

mzr = mz.GetZiroMatrix(mf.GetMatrix('tekst.csv'))
mf.SaveMatrix(mzr, 'resultat_1.csv')

matshow(mzr)
show()

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


Ошибка при обработки событий kivy
AttributeError: 'FloatLayout' object has no attribute 'test' появляется при обработки события нажатия на кнопку.
Код:
<code>
from kivy.app import App
from kivy.lang import Builder
from kivy.core.window import Window

Activity = '''
FloatLayout:

    Button:
        text: "Check product!"
        pos: 300, 250
        size_hint: .2, .2
        background_normal: ''
        background_color: 228/255.0, 202/255.0, 31/255.0, 1
        on_press: root.test()

'''

class Program(App):
    def build(self):
        Window.clearcolor = (184/255.0, 228/255.0, 107/255.0, 255/255.0)
        return Builder.load_string(Activity)
    def test(self):
        return("test is work!")

if __name__ in ('__main__', '__android__'):
    Program().run()
</code>
Пробовал переустановить kivy к сожалению не помогло.

НАШЁЁЁЁЁЁЛ!!!!!!!!
<code>
from kivy.app import App
from kivy.lang import Builder
from kivy.core.window import Window

Activity = f'''
FloatLayout:
    Button:
        text: "Check product!"
        pos: 300, 250
        size_hint: .2, .2
        background_normal: ''
        background_color: 228/255.0, 202/255.0, 31/255.0, 1
        on_press: app.test()

'''

class Program(App):
    def build(self):
        Window.clearcolor = (184/255.0, 228/255.0, 107/255.0, 255/255.0)
        return Builder.load_string(Activity)

    def test(self):
        print("test is work!")

Program().run()
</code>
Вот таким образом всё должно работать) Вы должны обращаться за методом к самому приложению, ведь он прописан именно в его классе.


discord.py и youtube_dl воспроизведение аудио без скачки
как можно воспроизвести аудио в боте при помощи библиотеки youtube_dl, но без установки самого аудио в директорию бота (из-за этой установки невозможно запустить стримы с музыкой по типу lo-fi) и если ни как нельзя, то какую библиотеку можно для этого использовать (существуют же боты по типу MEE6, Rythm, Groove, которые играют стримы спокойно и моментально, а с учётом что запуск аудио моментальный, да и боты очень популярны, то явно это происходит без скачки видео)

Делается это так:

from youtube_dl import YoutubeDL
from asyncio import sleep

YDL_OPTIONS = {'format': 'bestaudio', 'noplaylist':'False'}
FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}

@bot.command()
async def play(ctx, arg):
    global vc

    try:
        voice_channel = ctx.message.author.voice.channel
        vc = await voice_channel.connect()
    except:
        print('Уже подключен или не удалось подключиться')

    if vc.is_playing():
        await ctx.send(f'{ctx.message.author.mention}, музыка уже проигрывается.')

    else:
        with YoutubeDL(YDL_OPTIONS) as ydl:
            info = ydl.extract_info(arg, download=False)

        URL = info['formats'][0]['url']

        vc.play(discord.FFmpegPCMAudio(executable="ffmpeg\\ffmpeg.exe", source = URL, **FFMPEG_OPTIONS))

        while vc.is_playing():
            await sleep(1)
        if not vc.is_paused():
            await vc.disconnect()

Для реализации такой команды нужен FFMPEG - .exe файл, необходимый для запуска звука. Этот экзешник запускается через Discord API.
Скачать его можно здесь. Также можете скачать архив (Загрузка начнется сразу)
В папке должно быть 3 файла:
ffmpeg.exe,
ffplay.exe,
ffprobe.exe.
Запускам с явным указанием исполняемого файла
ffmpeg.exe:

voice.play(discord.FFmpegPCMAudio(executable="путь\\к\\файлу\\ffmpeg.exe", source = URL, **FFMPEG_OPTIONS))


Как разбить .txt файл на обучающую и тестовую выборки (80/20)?
Подскажите, как разделить файл .txt согласно желаемой пропорции?
Если:
<code>
Xtrain, Xtest = train_test_split(Text, test_size=0.2)
</code>
, то он делает так:

...'к', ' ', '5', ' ', 'н', 'н', 'и', ' ', 'ы', 'а', 'ш', 'д', 'м', 'а', 'о', 'л', 'з', 'п', 'х'...

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

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


Почему когда я вывожу данные с БД они выводятся не корректно Django Mysql
У меня проблема в том, что когда мне нужно вывести данные из БД, но там есть html коды тоже. То в шаблоне они отражаются как строка а не вид ну типо
<h1> заголовок - Вот так, но вместо заголовка там
<h1>Текст</h1>
Мой код в views.py:

    from django.shortcuts import render
from text.models import Doc

def index(request, idt):
    posts = {'posts': Doc.objects.raw('SELECT * FROM users WHERE id = ' + str(idt)), 'link': Doc.objects.raw('SELECT * FROM text_sidenav WHERE post_id = ' + str(idt))}
    return render(request, 'main/mainT/doc.html', posts)

код в urls.py

from django.urls import path

from . import views
from main.models import AccountsQ

urlpatterns = [
    path('<int:idt>', views.index, name='index'),
]

сам шаблон:

<div class="container mt-5">
    <div class="row">
      {% for post in posts %}
      <div class="col-lg-10 col-md-12">
  <div class="card">
    <div class="card-header">
      <h3 class="text-center">{{post.title}}</h3>
    </div>
    <div class="card-body">
  {{post.text}}
    </div>
  </div>
</div>
{% endfor %}

Возможно в БД у вас вместо "<" и ">" хранится "& l t ;" и "& g t ;"
А строка из вашего кода:

{{post.title}}

наверняка правильно отображается.


как изменить мою нейронную сеть так, чтобы она могла распознавать любую картинку, а не только ту, название которой записано? [дубликат]

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

Как подать картинки на вход обученной модели?

                                (1 ответ)

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

from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input, decode_predictions
from PIL import Image
import requests
from io import BytesIO
import numpy as np

model = VGG16(weights="imagenet")

img = image.load_img('3SSScAbpJXQ.jpg', target_size=(224, 224))

x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

preds = model.predict(x)

name='gg.png'
img1 = decode_predictions(preds,top=1)[0]
print(img1)

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

img = image.load_img('3SSScAbpJXQ.jpg', target_size=(224, 224))

как этого избежать и автоматизировать процесс, дабы программа сама понимала имя картинки? Сразу распишу, что программа уже распознаёт объекты, проблема не в этом, она просто не может обработать объект, если не знает его имени, например, gg.jpg и так далее, я же хочу, чтобы имя каждого загружаемого объекта определялось и забивалось автоматически, без моего вмешательства в код

<code>
import os

def get_files_folder(folder):
    res = []
    if os.path.exists(folder) and os.path.isdir(folder):
        files = os.listdir(folder)
        for fl in files:
            filenam = os.path.join(folder, fl)
            if not os.path.isdir(filenam):
                res.append(filenam)
    return res

# получаем список файлов папки:
infolder = "D:/Test" # здесь папка откуда вы берете файлы для предсказания
outfolder = "D:/Out" # здесь файлы куда вы складываете файлы (если это нужно) с измененными названиями полученными в предикте.
file_list = get_files_folder(infolder)

for file in file_list:
    img = image.load_img(file, target_size=(224, 224))
    # ну и здесь далее делаем всё то, что нужно делать с этим файлом
    # получаем предикт, если предикт выдаёт класс - собственно используем его, если кодированый клас,
    # то сперва декодируем его например в переменную resname, то сохраняем так:
    # image.save(os.path.join(outfolder, resname + '.png'), "PNG")
</code>
В общем с файлами тут работа простая. Выше всё объяснено. Что не понятно - пишите.


Как работает метод rfind()
Мне нужно найти второе вхождение буквы f. Но вместо 1 программа выводит 15. Почему?
<code>
s = ffffffffffffffff
f = s.rfind('f')
print(f)
</code>

потому что

str.find - Возвращает наименьший индекс, по которому обнаруживается начало указанной подстроки в исходной.

str.rfind - Возвращает наибольший индекс, по которому обнаруживается начало указанной подстроки в исходной.
т.е. возвращается индекс от начала строки

s = 'ffffffffffffffff'
f = s.rfind('f')

соответственно ищет наибольший индекс (позицию) в которой встречается строка
f, а это и есть
15
т.е. данный метод НЕ СЧИТАЕТ индекс (позицию) ОТ КОНЦА строки, он СЧИТАЕТ ОТ НАЧАЛА
P.S.
Если же вам надо найти второе вхождение буквы
f, то надо сделать последовательный поиск от начала

s = 'ffffffffffffffff'

# находим позицию первого символа 'f'
pos = s.find('f')

# находим позицию первого символа `f` после позиции первого символа
pos = s.find('f', pos + 1)

print(pos)


Заполнение и замена данных в датафреймах [закрыт]

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

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

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

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

Как заполнить фреймы типом данных NaN?

Воспользуйтесь одним из следующих методов:

DataFrame.replace

DataFrame.where

DataFrame.loc[...]

Из вашего вопроса непонятно хотите ли вы заполнить весь фрейм
NaN’s или какую-то его часть (по условиям или нет) и поэтому на вопрос такого качества невозможно дать конкретный ответ.
Для того чтобы получить более развёрнутый  ответ с примером кода приведите в вопросе небольшой, но воспроизводимый пример данных и результат, который вы хотите получить.


Python. Как вызвать функцию внутри условного оператора if? [закрыт]

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

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

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

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

Мне нужно вызвать функцию пароля в коде внутри if (пишу калькулятор). При попытке вызова появляется ошибка NameError. Можно ли вообще вызвать её?

def admpswd(validpass):
    validpass = 123
    return validpass

Код с вызовом:

elif (changeint == 3):
        print("Введите пароль:\n")
        mainpass = admpswd(validpass)
        Pswdinput = int(input())
        if (Pswdinput == mainpass):
            print("Отлично! Добро пожаловать!")
        else:
            print("Неверный пароль")
            break
    else: break

Код ошибки:

Traceback (most recent call last):
  File "W:\****\CALC\main.py", line 34, in <module>
    mainpass = admpswd(validpass)
NameError: name 'validpass' is not defined

Правильнее было бы функцию поменять на:

def admpswd(validpass):
    return validpass == 123

Тогда код упростится:

elif (changeint == 3):
        print("Введите пароль:\n")
        Pswdinput = int(input())
        if admpswd(Pswdinput):
            print("Отлично! Добро пожаловать!")
        else:
            print("Неверный пароль")
            break
else: break


Создание list для каждого чата
У меня проблема: есть чат бот в вк, и в нём надо создать list для каждой беседы. Пробовал так:
<code>
globals()[str(chat_id)] = []
</code>
Но так ничего не работает.

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

chats = {}
chats[chat_id] = []

Что-бы производить какие либо действия над объектом писать надо так

chats[chat_id].append("что нибудь")


Как сократить данную функцию?
Делаю мини-игру. В данную функцию передается уровень и капитал корпорации в которой состоит игрок, и его ранг. Функция считает прирост к зарплате игрока в зависимости от капитала и ранга. Можно ли как-то сократить эту функцию и по другому написать код?
<code>
def count_salary(level: int, capital: int, rang: int):
    bonus = 0
    extra_money = 0
    if level == 1:
        if rang == 1:
            bonus += float(0.00010)
        elif rang == 2:
            bonus += float(0.00015)
        elif rang == 3:
            bonus += float(0.00020)
        elif rang == 4:
            bonus += float(0.00030)
        elif rang == 5:
            bonus += float(0.00050)
            extra_money += int(float(capital) * float(bonus))
    elif level == 2:
        if rang == 1:
            bonus += float(0.00040)
        elif rang == 2:
            bonus += float(0.00045)
        elif rang == 3:
            bonus += float(0.00050)
        elif rang == 4:
            bonus += float(0.00060)
        elif rang == 5:
            bonus += float(0.00080)
            extra_money += int(float(capital) * float(bonus))
    elif level == 3:
        if rang == 1:
            bonus += float(0.00085)
        elif rang == 2:
            bonus += float(0.0012)
        elif rang == 3:
            bonus += float(0.0021)
        elif rang == 4:
            bonus += float(0.0035)
        elif rang == 5:
            bonus += float(0.0050)
            extra_money += int(float(capital) * float(bonus))
    return extra_money
</code>

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

data = {
    1: {
        1: 0.00010,
        2: 0.00015,
        3: 0.00020,
        4: 0.00030,
        5: 0.00050,
    },
    2: {
        1: 0.00040,
        2: 0.00045,
        3: 0.00050,
        4: 0.00060,
        5: 0.00080,
    }
}

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

extra_money += int(capital * bonus)

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

data = [
    [0.00010, 0.00015, 0.00020, 0.00030, 0.00050,]
    [0.00040, 0.00045, 0.00050, 0.00060, 0.00080,]
]

правда тут надо учесть, что индексы начинаются с 0 (сделать поправку)
Касательно же вашего кода

излишне переводить типы в данном случае - вы и так используете число с плавающей запятой

bonus += float(0.00085)

можно просто так:

bonus += 0.00085

аналогично с вычислениями
вместо

extra_money += int(float(capital) * float(bonus))

используйте просто

extra_money += int(capital * bonus)


Как достать ид из пересланного сообщения [закрыт]

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

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

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

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

Всем привет! Пишу бота и столкнулся с такой проблемой. Мне надо из сообщения на который ответили (переслали) узнать ID человека.
Можно пожалуйста ответ кодом (я новичок в vk api)

Для сообщения-ответа в объекте сообщения есть свойство
reply_message - это объект сообщения, на которое ответили.
Для сообщения с пересланными сообщениями в объекте сообщения есть свойство 'fwd_messages' - это массив объектов пересланных сообщений.
ID автора доступен через свойство
from_id нужного объекта сообщения.
P.S: event.obj.message['reply_message']['from_id']


PyQT5. Как передать сигнал из динамически созданного QGraphicsPixmapItem в QTableWidget?
Суть проблемы:

имеется модуль 'interface.py' основной, он запускается и в нем построен дизайн окна.
так же есть модуль 'classes.py' в нем прописаны классы объектов и в них переопределённые функции.

Есть
class MyOBJ(QGraphicsPixmapItem) объекты из этого класса создаются динамически во время выполнения программы и каждый новый объект реагирует на события мыши. Естественно находятся внутри
QGraphicsScene и
QgraphicsView.
Сокращенный код из classes.py:

class MyOBJ(QGraphicsPixmapItem):
    def __init__(self):
        super().__init__()
        self.setPixmap(QPixmap('dot.png'))
    def mousePressEvent(self, event):
        pass  # тут всякие разные конструкции
    super().mousePressEvent(event)

Есть класс
class MyTableFrames(QTableWidget) созданный из него объект находится внутри
QDockWidget, который в свою очередь является виджетом главного окна
QMainWindow в модуле 'interface.py'
Сокращенный код из classes.py:

class MyTableFrames(QTableWidget):
    def __init__(self):
        super().__init__()
        self.setColumnCount(7500)
        self.horizontalHeader().setDefaultSectionSize(20)
        self.horizontalHeader().setMinimumSectionSize(20)
        self.setRowCount(1)
        self.setSelectionMode(QAbstractItemView.SingleSelection)
        self.setRowHeight(0, 36)
        self.setEditTriggers(QTableWidget.NoEditTriggers)

    def mousePressEvent(self, event):
        print('Ok')
        super().mousePressEvent(event)

    def mouseReleaseEvent(self, event):
        if event.button() == 1:
            self.setItem(self.currentRow(), self.currentColumn(), QTableWidgetItem("•"))
        super().mouseReleaseEvent(event)

Проблема в том, что я не понимаю каким способом передать событие мыши из
MyOBJ в
MyTableFrames, что бы при клике мышкой по
MyOBJ в таблице
MyTableFrames заданной ячейке (пусть будет 1) печаталась точка
"•" или просто какой-то символ.

Проблема в том, что я не понимаю каким способом передать событие мыши
из MyOBJ в MyTableFrames, что бы при клике мышкой по MyOBJ в таблице
MyTableFrames заданной ячейке

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

class MyOBJ(QGraphicsObject, QGraphicsPixmapItem):
    clicked = pyqtSignal()
    def __init__(self):
        QGraphicsObject.__init__(self) # self передаем только сюда!
        QGraphicsPixmapItem.__init__(None) # а здесь просто конструируем

    def mousePressEvent(self, event):
        # Испускаем сигнал
        self.clicked.emit()

Далее, как обычно:

myObj = MyOBJ()
myObj.clicked.connect( ... )


как заблокировать комбинацию клавиш alt + F4
я пытался найти в интернете как заблокировать комбинацию клавиш alt + F4 но ничего не нашел кроме одной статьи в которой говорилось вписать
<code>
root.bind(<"alt + f4">, somefunction)
</code>
но ето не сработало
мне надо чтоб мое окно tkitner не закрывали

Нашел другой способ, если у кого возник такой же вопрос, вот код:

pip3 install keyboard

и
import keyboard

keyboard.add_hotkey("alt + f4", lambda: None, suppress =True)


Как найти в файле повторы
Не могу никак реализовать программу, что ищет в файле txt повторы слов и убирает их. Пытаюсь реализовать на языке Python. Алгоритм работы:

Пользователь вводит путь до файла.
Программа ищет копии слов.
Сохраняет перезаписанный файл.

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

Пример не совершенен, так как полностью решить задачу нелегко. Надо удалять слова, а что делать с пробелами между ними? Или знаками препинания? Или переводами строк?
Переводы строк сохраняются, так как мы читаем и пишем файлы построчно. Пробелами внутри строк придётся пожертвовать. Между любыми двумя словами пробел будет, а пробелы вначале и в конце строк пропадут. Также длинные последовательности пробелов заменятся на одиночные. Знаки препинания приклеиваем к словам.
Обработка по строка позволит не занимать память под лишние тексты. Уже известные слова храняться в
set: быстрый поиск и обновление.
Программа:

in_file = input('Входной файл: ')
out_file = input('Выходной файл: ')

words = set()

with open(in_file) as in_f:
    with open(out_file, 'w') as out_f:
        for line in in_f:
            out_words = []
            for word in line.split():
                if word not in words:
                    words.add(word)
                    out_words.append(word)
            print(' '.join(out_words), file=out_f)

Запускаем её на самой себе:

$ python remove_duplicates.py
Входной файл: remove_duplicates.py
Выходной файл: output.txt

Результат:

in_file = input('Входной файл: ')
out_file input('Выходной

words set()

with open(in_file) as in_f:
open(out_file, 'w') out_f:
for line in
out_words []
word line.split():
if not words:
words.add(word)
out_words.append(word)
print(' '.join(out_words), file=out_f)


Сравнение строк-дат
У меня задача, сделать функцию, которая будет работать следующим образом: пользователь вводит желаемый город, свой город, и дату в формате 12-12-2020, с целью уехать. Города доступны те, которые есть в списке. Я в функции сравнивал первые 3 буквы, на случай неправильного окончания при вводе. Далее у каждого рейса должно быть расписание, к примеру москва-анапа 2 раза в месяц 15 и 30 числа, ростов-анапа 4 раза в месяц и т.д. И задачей функции является выдать ближайшие 5 рейсов к дате(после нее), которую ввел пользователь. Вот в этом моменте не пойму, как лучше реализовать. Полагаю, нужно сделать списки на 2-3 месяца к каждому городу, наполнить датами и сравнивать. Но не пойму как реализовать сравнение.

target_cities = ("москва","ростов","тверь","казань", "самара")
current_cities = ("анапа", "грозный", "екатеринбург", "оренбург", "коломна")
target_1 = 'мос'
target_2 = 'ана'
date = '12-12-2020'
def dispatch(city1,city2):
    for town1 in target_cities:
        if city1[0:2] == town1[0:2]:
            print(town1)
    for town2 in current_cities:
        if city2[0:2] == town2[0:2]:
            print(town2)
    mos_ana = ['15-12-2020','30-12-2020','15-01-2020','30-01-2020','15-02-2020','30-02-2020','15-03-2020','30-03-2020']
dispatch(town1=target_1,town2=target_2)

UPD
Подскажите, почему таким образом не работает сравнение?

date1 = '02-16-2021'
mos_ana = ['12-11-2020','12-30-2020','01-15-2021','01-30-2021','02-15-2021','02-30-2021','03-15-2021','03-30-2021']
for date in mos_ana:
    first = datetime.datetime.strptime(date, '%m-%d-%Y')
    second = datetime.datetime.strptime(date1, '%m-%d-%Y')
    if first > second:
        print(second)

    datetime_date(year, 1, 1).toordinal() + 1
ValueError: day is out of range for month

Происходит такая ошибка. пробовал год вперед поставить, но тоже не сработало

Можно создать объект диспетчер, который хранит рейсы и их даты в словаре вида:

{('москва', 'анапа'): [datetime.datetime(2020, 1, 15, 0, 0),
                       datetime.datetime(2020, 1, 30, 0, 0),
                       datetime.datetime(2020, 2, 15, 0, 0),
                       datetime.datetime(2020, 2, 29, 0, 0),
                       datetime.datetime(2020, 3, 15, 0, 0),
                       datetime.datetime(2020, 3, 30, 0, 0),
                       datetime.datetime(2020, 12, 15, 0, 0),
                       datetime.datetime(2020, 12, 30, 0, 0)]}

ключ - кортеж с пунктами отправки/прибытия.
значение - отсортированный список с датами отправления для данного рейса.
По запросу диспетчер будет выдавать ближайшие даты.

class Dispatcher:
    def __init__(self):
        self.departures = {}

    def set_journey_departure_dates(self, journey, dates):
        self.departures[journey] = sorted(map(self.date_to_datetime, dates))

    def search_nearest_departures(self, journey, target_date, number_of_departures):
        target_date = self.date_to_datetime(target_date)

        idx = 0
        for idx, departure_date in enumerate(self.departures[journey]):
            if departure_date > target_date:
                break

        return self.departures[journey][idx:idx + number_of_departures]

    @staticmethod
    def date_to_datetime(date):
        return datetime.strptime(date, "%d-%m-%Y")

Тестирование

from pprint import pprint

dispatcher = Dispatcher()

target_journey = ('москва', 'анапа')
target_journey_departure_dates = [
                                    '15-12-2020',
                                    '30-12-2020',
                                    '15-01-2020',
                                    '30-01-2020',
                                    '15-02-2020',
                                    '29-02-2020',
                                    '15-03-2020',
                                    '30-03-2020'
                                  ]

dispatcher.set_journey_departure_dates(target_journey, target_journey_departure_dates)

target_date = "12-12-2020"
number_of_departures = 4
pprint(dispatcher.search_nearest_departures(target_journey, target_date, number_of_departures), width=20)

print()

target_date = "12-01-2020"
number_of_departures = 4
pprint(dispatcher.search_nearest_departures(target_journey, target_date, number_of_departures), width=20)

Результат

[datetime.datetime(2020, 12, 15, 0, 0),
 datetime.datetime(2020, 12, 30, 0, 0)]

[datetime.datetime(2020, 1, 15, 0, 0),
 datetime.datetime(2020, 1, 30, 0, 0),
 datetime.datetime(2020, 2, 15, 0, 0),
 datetime.datetime(2020, 2, 29, 0, 0)]


Подсчитать количество чисел в заданном диапазоне куб которых оканчивается на 4 или 9
Количество чисел
На вход программе подаются два целых числа a и b (a≤b). Напишите программу, которая подсчитывает количество чисел в диапазоне от a до b включительно, куб которых оканчивается на 4 или 9.
Формат входных данных
На вход программе подаются два целых числа a и b (a≤b).
Формат выходных данных
Программа должна вывести одно целое число в соответствии с условием программы.
Примечание. Куб числа aa – это его третья степень a^3a.
Sample Input 1:
<code>
1
10

counter = 0
for i in range(int(input()), int(input())):
    if i % 10 == 4:
        counter = counter + 1
print(counter)
    else:
        i % 10 == 9
        counter = counter + 1
        print(counter)
</code>

Если обратить внимание на кубы чисел, которые заканчиваются на 4 и 9, то можно увидеть закономерность - если число заканчивается на 4 или на 9, то и куб этого числа будет заканчиваться на ту же цифру:

In [81]: [(i, i**3) for i in range(70) if (i**3) % 10 in (4,9)]
Out[81]:
[(4, 64),
 (9, 729),
 (14, 2744),
 (19, 6859),
 (24, 13824),
 (29, 24389),
 (34, 39304),
 (39, 59319),
 (44, 85184),
 (49, 117649),
 (54, 157464),
 (59, 205379),
 (64, 262144),
 (69, 328509)]

поэтому ответ можно получить аналитически:

def f(a, b, digit):
    a = a // 10 * 10 + digit
    b = b // 10 * 10 - (10 - digit)
    return (b - a + 10) // 10

def calc(a, b):
    return f(a, b, 4) + f(a, b, 9)

a, b = 123, 321

res = calc(a, b)

результат:

In [185]: res
Out[185]: 40

проверка:

In [186]: len([(i, i**3) for i in range(a, b+1) if (i**3) % 10 in (4,9)])
Out[186]: 40


как вывести два числа из таблицы? python, SQLite
есть код:
<code>
cursor.execute("SELECT cash, bitcoin FROM users WHERE name = ? and id = ?", [first_name, ids])
                result = cursor.fetchone()
                if not result:
                    send('Пользователь не найден!')
                else:
                    send(str(result)[0] + 'монет💰\n' + str(result)[1] + 'биткоинов💲')

</code>
он должен выводить 300 монет и 2 биткойна (результат из таблицы)
но когда я пытаюсь получить два числа (они записаны как (300, 2))
то он не берёт их как элемент из списка, а как элемент строки:
(монет💰
3биткоинов💲
(300, 2)
как взять элемент, возвращаемый fetchone?
PS.я не могу брать 2 fetchone

А зачем вы делаете
str(result), превращая весь
result в строку? Сначала берите элементы
tuple
result, а потом, если нужно, превращайте их в строки:

send(str(result[0]) + 'монет💰\n' + str(result[1]) + 'биткоинов💲')


неверный расчет значений в результате
Написал программу которая вычисляет ответ по x
Но когда проходит вычисление, она выдает неверное значение.
<code>
def start():
    x()

def resh():
    global a
    global b
    otv=11.3 * a - 9,4 * b
    print(otv)
    start()

def x():
    global a
    global b
    a = float(input('введите a:' ))
    b = float(input('введите b:' ))
    resh()
x()

</code>
Подскажите пожалуйста, что делать?

проблема здесь:

otv=11.3 * a - 9,4 * b
#               ^

место точки стоит запятая поэтому это вычисляется как два примера

11.3 * a - 9
4 * b

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

while True:
    a = float(input('введите a:' ))
    b = float(input('введите b:' ))
    print(11.3 * a - 9.4 * b)


Обновление переменной telebot
Пишу ТГ бота, сразу говорю я новичок в программировании, и вот тут у меня заминка:
<code>
    elif message.text == 'Пожелания':
        try:
            file = open('predlojenie.txt')
        except FileNotFoundError:
            file = open('predlojenie.txt', 'x')
            file.close()
        bot.send_message(message.chat.id,'Напишите ваше пожелание:')
        message = message.text
        print(message)
        file = open('predlojenie.txt','a')
        file.write(message)
        file.close()
</code>
На выходе в файл записывается только сообщение, которое и должно было вызывать Функцию. То есть в файл записывается: Пожелания
Как рефрешнуть сообщение, чтобы при вводе в файл шло 2 сообщение а не 1?

Готовый код:
<code>
@bot.message_handler(content_types=['text'])
def send(message):
    if message.text == 'Пожелания':
        msg = bot.send_message(message.chat.id, 'Напишите ваше пожелание:')
        bot.register_next_step_handler(msg, save)

def save(message):
    try:
        with open('predlojenie.txt', 'r') as file:
            pass
    except FileNotFoundError:
        with open('predlojenie.txt', 'x') as file:
            pass
    print(message.text)
    with open('predlojenie.txt', mode='a', encoding='utf-8') as file:
        file.write(message.text)
    bot.send_message(message.chat.id, 'Пожелание записано!')

bot.enable_save_next_step_handlers(delay = 2)
</code>
Шаблон взял из: Обновления сообщения Telegram API Python


Решите, представляет ли строка число
Как вывести функцию
is_number, которая будет принимать строку в качестве параметра и возвращать
True, если эта строка является допустимой нотацией действительного числа, или же, в противном случае
false.
Выглядеть должно так:

def is_number(string: str) -> bool:

>>> is_number('3')

True

>>> is_number('3.3')

True

>>> is_number('6e-34')

True

>>> is_number('0.0.0')

False

>>> is_number('five')

False

raise NotImplementedError()

Как вариант:
<code>
def is_number(value: str) -> bool:
    try:
        float(value)
        return True
    except ValueError:
        return False

print(is_number('3'))  # True
print(is_number('3.3'))  # True
print(is_number('6e-34'))  # True
print(is_number('0.0.0'))  # False
print(is_number('five'))  # False
</code>


Pygame menu вопрос про выбор сложность
Подскажите пожалуйста, что мне нужно прописать в функцию
set_difficulty, чтобы при выборе сложности (например, Hard) значение некоторой переменной
difficult принимало значение 1, а при других уровнях сложности — другие значения. Не смог найти примеров и пояснений в интернете

def set_difficulty(value, difficulty):
    # Do the job here !
    pass

def start_the_game():
    # Do the job here !
    pass

menu = pygame_menu.Menu(300, 400, 'Welcome',
                       theme=pygame_menu.themes.THEME_BLUE)

menu.add_text_input('Name :', default='John Doe')
menu.add_selector('Difficulty :', [('Hard', 1), ('Easy', 2)], onchange=set_difficulty)
menu.add_button('Play', start_the_game)
menu.add_button('Quit', pygame_menu.events.EXIT)

Самый простой способ — это записать выбранное значение в глобальную переменную:

difficult = 1

def set_difficulty(value, difficulty):
    global difficult
    difficult = difficulty

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

Update:
По поводу того, как управлять присваиваемым значением.
Когда вы задаёте selector, вы передаёте в него список пар (название, значение). Так что изменив значение в соответствующей паре можно управлять тем, что будет передано в функцию
onchange:

menu.add_selector('Difficulty :', [
        ('Hard', 1),
        ('Easy', 2)
#                ^ эти значения и передаются в функцию.
    ], onchange=set_difficulty)


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

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

<code>
urstr = input("Введите ваш текст: ")
urstr = urstr[:0] + urstr[2:] + input("Добавьте 2 новых символа: ")
print(urstr)
</code>

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

urstr = input("Введите ваш текст: ")

urstr = urstr[2:] + input("Добавьте 2 новых символа: ")

#print(urstr)

#  печатать прямо в файл 'filename.txt'
with open('filename.txt', 'w') as f:
    print(urstr, file=f)

Update

#urstr = input("Введите ваш текст: ")
#  читаем входные данныеиз файла 'filename_in.txt'
with open('filename_in.txt', 'r') as f:
    urstr = f.read()
    print(urstr)

urstr = urstr[2:] + input("Добавьте 2 новых символа: ")

#print(urstr)

#  печатать прямо в файл 'filename_out.txt'
with open('filename_out.txt', 'w') as f:
    print(urstr, file=f)

filename_in.txt

123456789


Как можно сохранить картинку? Python
Решил ради интереса написать простенький генератор QR кодов, и тут возникает вопрос, при запуске кода, картинка сохраняется в той папке, из которой произведён запуск, а как я могу сделать так, что бы она сохранялась в нужную мне папку?
<code>
import pyqrcode
import time

save = 0
QRString = input('Введите значения QR: ')
save = input('Введите название файла: ')
url = pyqrcode.create(QRString)

url.png( save+".PNG", scale = 8)
time.sleep(2)
</code>
Попробовал поискать в интернете, но ничего толком то и не понял. Может кто поможет?

Просто перед названием файла введи путь
<code>
url.png(r'D:\example\1' + save + ".png", scale=8)
</code>


Цикл по вложенным словарям и спискам
пытаюсь сделать текстовый квест примерно из вот такого кода:
<code>
{"Location_1": ["Enemy10", {"Location_2": ["Enemy15",{"Location_10": [{"Exit": "Win"}]}]}]}
</code>
По факту словарь больше и более разветвлен, находится в отдельном json файле.
Реализация должна заключаться в том, что нужно выбирать локации(ключ словаря), заходить в них, внутри будут враги, последние числа названий которых нужно суммировать, и также другие локации.
Подскажите, какая конструкция должна быть у цикла по таким разветвлениям. Допустим, с помощью цикла фор попадаю в значения первой локации, и как далее реализовывать выбор элементов и последующие проходы в локации не соображу
Более подробные правила:
На прохождение дается 100000 секунд.
Цель - за отведенное время найти выход
По мере прохождения вглубь происходит затопление, поэтому
в каждую локацию можно попасть только один раз,
и выйти обратно нельзя (то есть двигаться можно только вперед).
Чтобы открыть выход и выбраться, нужно иметь не менее 300 очков опыта.
Если до открытия время заканчивается - гг умирает, а игра начинается заново.
Карта это json-файл. Локации в лабиринте описывается объектами,
в которых находится единственный ключ с названием, соответствующем формату "Location_nm_tm",
где N - номер локации, а T - это время,
которое необходимо для перехода. Например, если игрок заходит в локацию "Location_8_1000",
то он тратит на это 1000 секунд.
По ключу находится список, содержащий строки с врагами а также другие локации.
Описание врага представляет собой строку в формате "enemy_ex_tm", где K - количество опыта,
которое получает игрок, уничтожив врага, а M - это время,
которое потратит игрок для уничтожения врага.
Например, уничтожив монстра "Boss_exp10_tm20", игрок потратит 20 секунд и получит 10 единиц опыта.
Нужный путь только один.
При каждом ходе игрока скрипт должен запоминать в csv файл следующую информацию:

текущую локацию
текущий опыт
текущие дату и время

Я только для удобства разделил цифры и названия, чтобы удобно было вычленять, но алгоритм можно любой сделать, например просто отрезать
Enemy (если он присутствует в слове)

data = {"Location_1": ["Enemy_10", {"Location_2": ["Enemy_15",{"Location_10": [{"Exit": "Win"}]}]}]}

def analyze_object(object):
    count = 0

    # если объект - словарь, то проанализировать все значения словаря по ключу
    if isinstance(object, dict):
        for key in object:
            count += analyze_object(object[key])

    # если объект - список, то проанализировать все элементы списка
    if isinstance(object, list):
        for element in object:
            count += analyze_object(element)

    # если объект - строка, то вычленить числа
    if isinstance(object, str):
        word = object.split('_')
        if len(word) == 2:
            count += int(word[1])

    return count

print(analyze_object(data))


Как разбить файл .txt на два с помощью регулярных выражений?
Есть файл .txt: выгрузка диалога из WhatsApp. Как разбить его на два файла, чтобы в каждом из них остались только сообщения одного собеседника?
Пример:
<code>
[09:13, 06.10.2020] Marina: Привет, Соня! Забираю машину с ТО, не успеваю

[09:14, 06.10.2020] Соня: Привет! Принято!
</code>
и т.д.
Нужно, все сообщения от Marina в один файл, а все сообщения от Соня в другой файл.

я бы делал это так:

import re
from itertools import groupby
from pathlib import Path

work_dir = Path("/path/to")

input_file = r"/path/to/input_data.txt"
data = open(input_file).read()

data = sorted(re.findall(r"(\[[^\]]*\]\s*)(\w+)(.*)", data), key=lambda x: x[1])

for g,d in groupby(data, key=lambda x: x[1]):
    with open(work_dir / f"msg_{g}.txt", 'w') as f:
        for x in d:
            print("".join(x), file=f)

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


Неизвестный тип вывода CalledProcessError
Пытаюсь отловить исключение, возникающее при вызове команды cd (Windows 10). переменная exc.output представляет из себя что-то вроде
'b\x8d\xa5\xa2\xa5\xe0\xad\xae \xa7\xa0\xa4\xa0\xad\xae \xa8\xac\xef \xaf\xa0\xaf\xaa\xa8.\r\n', как конвертировать данную строку в человеко читаемый текст?

import subprocess

def run_cd(args=''):
    try:
        output = subprocess.check_output(['cd', f'{args}'],
                                          stderr=subprocess.STDOUT,
                                          shell=True)
    except subprocess.CalledProcessError as exc:
        print('error catched')
        print(exc.output)
    else:
        return output.decode("utf-8").strip()

Попробуйте указывать кодировку консоли
windows –
cp866

print(exc.output.decode("cp866"))

Проверка кодировки:

data = b'\x8d\xa5\xa2\xa5\xe0\xad\xae \xa7\xa0\xa4\xa0\xad\xae \xa8\xac\xef \xaf\xa0\xaf\xaa\xa8.\r\n'
print(data.decode('cp866'))
# Неверно задано имя папки.