Удаление повторяющихся элементов в Python [дубликат]

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

Почему list.remove() неправильно удаляет элементы в цикле?

                                (2 ответа)

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

Всем привет. Недавно начал изучение Python. И решил попробовать задачу с удалением из списка повторяющихся элементов. Решил несколькими способами, однако со способом, который привел ниже, вопрос возник. Подскажите, пожалуйста, почему все повторяющиеся элементы удалились, кроме числа 28, ведь метод count сам посчитал сколько раз конкретные числа встречаются в списке, а remove должен был удалить те, которые встречаются больше 1 раза?
<code>
list1 = [2,28, 3, 7, 3, 6,66, 2, 8, 8,88,23,7,28]
for i in list1:
  if list1.count(i) > 1:
    list1.remove(i)
print(list1)
</code>

Если еще актуально.На первой итерации цикла элементом i-тым элементом является число 2. Так как оно имеет дубликат, то соответственно удаляется и на ЭТОЙ ЖЕ итерации i-тым элементом становится число 28. На следующей итерации цикла этот элемент пропускается и цикл смотрит на число 3


Как получить аргументы deeplink в Aiogram 3
Всем привет
В aiogram 2 deeplink получить можно было с помощью
<code>
message.get_args()
</code>
Но в данной версии это не работает
Как получить его в v3?

Я не нашёл конкретную замену, но точно можно так
<code>
start_command, *args = msg.text.split()
</code>


Я хочу получить конкретное значение, возращаемое методом
К примеру, вот код:
<code>
return names_vacancie, urls, prices
</code>
И вот задача, я хочу получить только значение "urls", можно ли это сделать ? Если можно, то как ?

Если из функции возвращаете несколько переменных как тут
return names_vacancie, urls, prices, то их значения вернутся в кортеже (
tuple):

def get() -> tuple:
    names_vacancie, urls, prices = 1, 2, 3
    return names_vacancie, urls, prices

print(type(get()))
# <class 'tuple'>

Достать значение можно по индексу:

urls = get()[1]
print(urls)

Или через распаковку в переменные:

names_vacancie, urls, prices = get()
print(urls)

_, urls, _ = get()
print(urls)


Найти элемент по Xpath и Name в Selenium
Возможно ли как-то найти элемент по XPATH и NAME одновременно?
<code>
fields = driver.find_elements(by=By.XPATH, value='//*/td[8]')
</code>
Допустим, есть такая строчка кода. Возможно ли как-то задать поиск сразу по двум тегам?

Да, вы можете использовать and или or в XPath, чтобы объединить различные критерии поиска. Например, чтобы найти элементы, которые имеют тег td и имя атрибута class равное my_class:

fields = driver.find_elements(by=By.XPATH, value='//td[@class="my_class"]')

Чтобы найти элементы, которые имеют тег td или тег th и имя атрибута class равное my_class:

fields = driver.find_elements(by=By.XPATH, value='//(td|th)[@class="my_class"]')

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


Странное поведение функции any

hits = [
    [False, False, False],
    [False, False, False],
    [False, False, False],
]

print(any(hits))

Почему возвращает результат
True?

Потому что
any не просматривает значения во вложенных списках. Python любой непустой список интерпретирует как
True, поэтому и результатом является
True. Если вы хотите просмотреть все значения, то это можно сделать так:

print(any(map(any, hits)))


Чем отличается operator.itemgetter от operator.getitem?
Писал вот такой код

import operator

tuples = [(1, 'd'), (2, 'b'), (4, 'a'), (3, 'c')]

print(sorted(tuples, key=operator.itemgetter(1)))

В процессе написания опечатался и вместо
.itemgetter написал
.getitem, в итоге было вот это -

import operator

tuples = [(1, 'd'), (2, 'b'), (4, 'a'), (3, 'c')]

print(sorted(tuples, key=operator.getitem(1)))

с которым код не сработал и выдал вот такую ошибку

TypeError: getitem expected 2 arguments, got 1

В документации ничего подробного нет. Поэтому решил спросить здесь у понимающих разницу между первым и вторым
P.S. Первый вариант кода рабочий

operator.getitem(lst, i) - это то же самое, что и
lst[i]:

>>> import operator
>>> lst = [1, 2, 3, 4, 5]
>>> lst[2]
3
>>> operator.getitem(lst, 2)
3


Система для промо-кодов в телеграм боте
Создаю бота в телеграм на aiogram, мне нужно реализовать систему промо-кодов. А конкретней, чтобы пользователь мог вводить определённый промо-код или же текст, только один раз. Если он введёт этот промо-код ещё раз, то будет выдаваться ошибка. Здесь не будет кода, подскажите пожалуйста, как можно это реализовать?

Думаю, нет смысла рассказывать как создать промокод.
А для того чтобы проверить, использовал ли пользователь его, можно создать в бд таблицу из
"user_id", "promo_code", "check_promo_code" (Default = "0").
После предоставления бонуса выставить в строке
check_promo_code значение "1".
При второй попытке пользователя использовать промокод, будет проверяться
булевое значение в таблице и если оно будет
равно "1", то отправлять сообщения, по типу:

"Промокод можно использовать только один раз".

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


Задача на массивы по Python
Начал на днях изучать олимпиадное программирование и это очень сложно ведь я имею мало опыта в решении задач. Начались трудности с этой задачей.
В классе учится
n учеников. В школах у каждого школьника есть свое место. Ученик под номером
i сидит за i-той партой. Сегодня староста класса хочет похулиганить. Она решила посадить учеников так чтобы ни один ученик не сидел на своем месте. Она просит вас найти количество способов это сделать по модулю
1
0
9
+
7
10
9
+7. Например, если в классе 3 ученика тогда всего есть два способа как их можно посадить
(
[
231
]
,
[
312
]
)
([231],[312]).
Формат входного файла
Дается
n
(
1
≤
n
≤
1000000
)
n(1≤n≤1000000) - количество учеников в классе.
У меня появилась идея решить таким способом. Человек вводит число k, допустим. Потом создается цикл в котором составляется массив от 1 до k, затем в программа в случайном порядке перемешивает элементы массива и складывает их, и если попалась сумма(в формате строки), которой еще не было и не было в обратном порядке то она попадает в массив (t) с вариантами рассадки учеников. Потом если по истечении 10 циклов не добавлены новые строки в массив t, то подсчитывается количество элементов массива и отправляется в терминал.
У меня получилось реализовать только половину функций (до случайного порядка). Здесь у меня не особо нет идей. Вроде бы можно использовать модуль random, но можно ли там указать чтобы не было повторений в генерации случайных чисел в определенном диапазоне? Print внизу я использовал чтобы проверять, будет ли каждый раз случайная первая сумма массива.
Код внизу:
<code>
students = int(input())
studentslist = []
partanumberslist = []
m = 1
i = 0
while not m > students:
    studentslist.append(str(m))
    m = m + 1

def mix_list(studentslist):
    global secondlist
    secondlist = studentslist[:]
    list_length = len(secondlist)
    for i in range(list_length):
        index_aleatory = random.randint(0, list_length - 1)
        temp = list[i]
        secondlist[i] = list[index_aleatory]
        secondlist[index_aleatory] = temp
    return secondlist

mix_list(studentslist=studentslist)

while not i == 10:
    print(b''.join((secondlist)))
</code>

Можно попробовать такой подход. Берем, например, первые 6 случаев:

1 ученик, комбинаций пересадки 0
2 ученика >> 1
3 ученика >> 2
4 ученика >> 9
5 учеников >> 44
6 учеников >> 265

Наблюдаем закономерность - каждое следующее число подходящих комбинаций равно
предыдущее число комбинаций * число учеников +/- 1. Например, число комбинаций для 5 учеников =
44 = 9*5-1, а для 6 учеников =
265=44*6+1. Эта единица меняет знак при каждой итерации.
Напишем такой код:

N = 1000000
res = 0
d = 10 ** 9 - 7
sign = 1
for i in range(1, N):
    res = (res * (i + 1) + sign) % d
    sign = -sign
print(f'Комбинаций для {N} учеников по модулю 10**9-7 = {res}')

Комбинаций для 1000000 учеников по модулю 10**9-7 = 558002412

Примечание. Насчет корректности получения остатка
% d на каждой итерации не вполне уверен.
Проверил на 10 учениках таким кодом, совпало.

import itertools

lst = list('0123456789')
good = 0
for i in itertools.permutations(lst, len(lst)):
    res = sum(x == i[n] for n, x in enumerate(lst))
    if res == 0:
        good += 1
print(good)


Как спрятать информацию в .env
У меня есть файл .env, в котором есть ключ от сервисного аккаунта Гугла. Мне нужно перебросить проект на Python на чужой сервер, Windows Server. Как мне сделать так, чтобы сам Python мог юзать ключ, а тот, кто зайдет в .env файл не мог бы его прочитать вообще или добраться до него.
Так как это мс сервер, возможно, если закатать в экзешник до .env файла будет не добраться?

Как по мне, никак. При желании, человек все равно доберется до исходных данных, ведь у него есть исходники на Python
Но если взять извращения, то должна быть скомпилированная программа, которую мы запускаем. Она берет исходный код Python файла/файлов, добавляет в него соль, например в виде даты и времени и секретного слова, и после генерирует хэш. Также, хэш генерируется и в этой программе и сверяет их или же просто напрямую сверяет исходный код с вшитым в программу
Если все ок, то запускается Python скрипт с переданными в него параметрами в виде важных данных, которые будут в будущем использованы
По идее, нужно хорошо подумать, чтобы обойти подобные извращения
Ну или есть взять попроще вариант, можно просто скомпилировать программу на Python, тем самым скрыв её код. Туда же вшить данные из .env, но существуют простые декомпиляторы py файлов, что с легкостью поможет добраться до сокровенной информации


Как сочетать интерфейс на C# с кодом на Python?
Готовим проект для универа. Задумка заключается в том, что пишем интерфейс на C# и алгоритм шифровщика на пайтоне но незнаем как вшить Python в интерфейс.
Чтобы каждая кнопка выполняла свою функцию и т.д.

Для этих целей вы можете использовать IronPython:

dotnet add package IronPython

либо через менеджер пакетов в Visual Studio/Rider
Пример кода:

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

int y = 22;

ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
scope.SetVariable("y", y);
engine.ExecuteFile("hello.py", scope);
dynamic x = scope.GetVariable("x");
dynamic z = scope.GetVariable("z");
Console.WriteLine($"{x} + {y} = {z}");


Аннотация возвращаемого значения метода к типу его класса python
Python 3.8
Есть класс с полем, тип данных которого этот же класс

class MyClass:
    def __init__(self):
        self.instance = self

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

def get_instance(self) -> MyClass: # Ошибка!
    return self.instance

Но аннотация подчёркивается с сообщением Unresolved reference 'MyClass'. При запуске интерпретатор выдаёт ошибку NameError: name 'MyClass' is not defined
Как правильно написать аннотацию к методу, который возвращает тип класса, в котором находится этот метод? (В Python 3.8)

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

from typing import TypeVar

TMyClass = TypeVar("TMyClass", bound="MyClass")

class MyClass:
    def get(self) -> TMyClass:
        return

mc = MyClass()
mc.get().get()  # .get() автодополнение названия методов в PyCharm работает

можно и так

class MyClass:
    def get(self) -> 'MyClass':
        return

mc = MyClass()
mc.get().get()  # .get() автодополнение названия методов в PyCharm работает


Как создать комбинации нескольких списков без повторений?
Подскажите, пожалуйста, как в python создать комбинации слов из нескольких списков но не комбинировать собственные слова каждого списка. Пока придумал только с помощью itertools, но много лишних комбинаций.

import itertools

form = ['A', 'B', 'C']
style = ['D', 'E', 'F']
material = ['G', 'H', 'I']
color = ['J', 'K', 'L']
special = ['M', 'N', 'O']

results = itertools.combinations(form + style + material + color + special, 5)
for item in results:
    print(''.join(item))

Т.е. после вывода должно получиться что-то такое:

A D G J M
A E G J M
A F G J M

и т.д.,
но не должно получиться:

A B C D E
A B C D F
A B C D G

и т.д.
Каким-то образом этот код стал резать вывод:

def f(*iterables):
    if len(iterables) == 1:
        yield from iterables[0]
        return
    for letter in iterables[0]:
        for n in f(*iterables[1:]):
            yield letter + "+" + n

form = ['pryamaya', 'uglovaya', 'p-obraznaya', 's-ostrovom', 's-barnoj-stojkoj', 'do-potolka']
style = ['klassicheskaya', 'sovremennaya', 'neoklassika', 'loft', 'provans', 'kantri', 'haj-tek', 'modern',
         'minimalizm', 'skandinavskij-stil']
material = ['massiv-dereva', 'mdf', 'mdf-emal', 'shpon', 'akril', 'plastik', 'glyanecz', 'matovyj', 's-patinoj']
color = ['svetlaya', 'temnaya', 'belaya', 'golubaya', 'zelenaya', 'krasnaya', 'seraya', 'chernaya', 'cherno-belaya']
special = ['fasad-bez-ruchek', 'ramochnyj-fasad', 'fasad-s-frezerovkoj', 'radiusnyj-fasad']
for x in f(form, style, material, color, special):
    print(x)

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

def f(*iterables):
    if len(iterables)==1:
        yield from iterables[0]
        return
    for letter in iterables[0]:
        for n in f(*iterables[1:]):
            yield letter+n

form = ['A', 'B', 'C']
style = ['D', 'E', 'F']
material = ['G', 'H', 'I']
color = ['J', 'K', 'L']
special = ['M', 'N', 'O']

for x in f(form, style, material, color, special):
    print(x)

Вывод:

ADGJN
ADGJO
ADGKM
ADGKN
ADGKO
...
CFIJO
CFIKM
CFIKN
CFIKO
CFILM
CFILN
CFILO


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

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

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

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

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

Читаю книгу "Чистый Python". Там говорится о том, что свои магические методы не рекомендуется писать из-за возможной несовместимости с будущими версиями языка. Как быть, если на всяких Хабрах и прочих находятся статьи, которые доказывают обратное, при этом ссылок на литературу не дают. Можете, пожалуйста, подсказать. По возможности, с примерами и серьёзными источниками, стоит ли писать кастомные методы или нет.

Вот что говорит документация
Python

*
System-defined names, informally known as “dunder” names. These names are defined by the interpreter and its implementation (including the standard library). Current system names are discussed in the Special method names section and elsewhere. More will likely be defined in future versions of Python. Any use of * names, in any context, that does not follow explicitly documented use, is subject to breakage without warning.

Перевод на русский:

__ * __
Системно определенные имена, неофициально известные как «магические» имена. Эти имена определяются интерпретатором и его реализацией (включая стандартную библиотеку). Текущие имена систем обсуждаются в разделе «Имена специальных методов» и в других местах. Скорее всего, будет определено в будущих версиях Python. Любое использование имен __ * __ в любом контексте, которое не следует явно документированному использованию, может быть нарушено без предупреждения.

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


Проверка на наличие нескольких символов в строке в определенном порядке. Питон
Есть список b, состоящий из нескольких строк. Нужно проверить содержится ли в каждой конкретной строке слово (например, 'anton'). Должны быть буквы этого слова, не обязательно подряд (даже чаще не подряд - т.е. такая строка подходит: 'asrngktnv5jonj'), но именно в этом порядке. В слове совпадают последняя и третья с конца буквы.
В моей "изящной" конструкции такой код:

for i in range(len(b)):
    if ('a' in b[i] and 't' in b[i] and 'o' in b[i] and b[i].count('n') >= 2 and b[i].find('a') < b[i].find('n') < b[i].find('t') < b[i].find('o') < b[i].rfind('n')):
        print(i + 1, end=' ')

В нем я проверяю наличие каждой из букв в строке списка, а очередность - через сравнение значений индексов.
Проблема:

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

Отсюда два вопроса:

как проверить наличие букв в строке более компактно. Вообще, можно ли сделать конструкцию, в которой бы был список или кортеж из искомых символов и они искались в строке. Типа:

if ('a', 'n', 't', 'o') in b - ?
как проверить располагаются ли эти символы в нужной последовательности? (помня, что в искомом слове есть еще две одинаковые буквы)?

P.S. что касается проверки, делал ее в том числе и через срезы, типа:

for i in b:
    while b[i] != 'a':
        b[i] = b[i][1:]
    count += 1

перебирал нужные буквы, пока не находилась искомая я удалял первый символ строки. Когда буква находилась - к счетчику добавлял 1. В итоге при
count = 5 условие выполнялось. Но, тут тоже результат нулевой.

Вариант с регуляркой

import re

lines = ['asrngktnv5jonj', 'asrngkfnv5jonj', 'afdjflewkjcneckdbctlbnldjcodsnnnnnnnnnnn']
text = 'anton'
r = re.compile('.*'.join(re.escape(text)))
for line in lines:
    if r.search(line):
        print(f'Строка `{line}` содержит `{text}`')
    else:
        print(f'Строка `{line}` НЕ содержит `{text}`')

Строка `asrngktnv5jonj` содержит `anton`
Строка `asrngkfnv5jonj` НЕ содержит `anton`
Строка `afdjflewkjcneckdbctlbnldjcodsnnnnnnnnnnn` содержит `anton`


Напишите программу для расшифровки секретного слова методом частотного анализа
PYTHON
Напишите программу для расшифровки секретного слова методом частотного анализа.
Формат входных данных
В первой строке задано зашифрованное слово. Во второй строке задано одно целое число nn – количество букв в словаре. В следующих nn строках записано, сколько раз конкретная буква алфавита встречается в этом слове – <буква>: <частота>.
Формат выходных данных
Программа должна вывести дешифрованное слово.
Примечание. Гарантируется, что частоты букв не повторяются.
<code>
text = input()
list1 = {}
dicts = {a: text.count(a) for a in set(text)}

for i in range(int(input())):
    symbol = input().split(':')
    list1.setdefault(symbol[0],int(symbol[1]))

new_dicts = {v: k for k,v in list1.items()}

for v in dicts.values():
    for k1,v1 in new_dicts.items():
        if v == k1:
            print(new_dicts[k1],end='')
</code>
мой вывод:
ед
каждый раз разный не могу понять почему
подскажите пожалуйста что не так?
должно быть вот так:
Sample Input 1:
pop
2
д: 2
е: 1
Sample Output 2:
дед
прошу помочь

вы перемудрили. можно сразу составлять словарь соответствия частоты букве в коде, раз частоты не повторяются. просто делаем их ключом словаря dicts, а потом по ним выбираем букву
тогда в list1 можно сделать словарь расшифровки, и им воспользоваться в последнем цикле
<code>
text = input()
list1 = {}
dicts = {text.count(a):a for a in set(text)}

for i in range(int(input())):
    symbol = input().split(':')
    list1[dicts[int(symbol[1])]] = symbol[0]

for v in text:
    print(list1[v], end='')
</code>


Как ускорить этот код? Python
Есть такой код:
<code>
s1 = 'dfgwjkgofdgrghdflsdgdfd'
s2 = 'world'

w = []
for x in s2:
    if x in s1:
        w.append(x)
        s1 = s1.replace(x, '', 1)

print(True if ''.join(w) == s2 else False)
</code>
Он проверяет можно ли из букв первого слова собрать второе слово. При этом учитывает количество букв. Например, в данном случае выдаст True. А если s2 заменить на woorld, то выдаст False, так как в s1 всего одна буква o.
Он работает, но CodeWars его не принимает, так как выполнение слишком долгое для огромных строк. Я предполагаю, что можно использовать count вместо replace, но не совсем понимаю логику как это реализовать. А может это возможно с помощью iter, next... В общем, вопрос - как ускорить этот код или написать аналогичный, но более быстрый?

collections.Counter:

from collections import Counter

s1 = 'dfgwjkgofdgrghdflsdgdfd'
s2 = 'world'

print(Counter(s1) >= Counter(s2))

Для Питона до версии 3.10 код придётся изменить:

c1 = Counter(s1)
c2 = Counter(s2)
print(all(c1[k] >= v for k, v in c2.items()))


Объектно-ориентированное программирование python. /начинающий/ [закрыт]

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

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

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

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

Есть класс 'программист' и нужно написать внутри него метод rise(), который повышает его в должности. Почему мой способ не работает?
<code>
class Programmer:

    def __init__ (self, name, prof):
        self.name = name
        self.prof = prof
        self.time = 0

    def work(self, time):
        self.time = time + self.time
        return self.time

    def rise(self):
        if self.prof == 'Junior':
            self.prof == 'Middle'
        elif self.prof == 'Middle':
            self.prof == 'Senior'
        return self.prof

    def info(self):
        return f'{self.name} {self.time}ч. {self.prof}'

</code>

Возможно вам нужно это:
<code>
def rise(self):
  if self.prof == 'Junior':
    self.prof = 'Middle'
  elif self.prof == 'Middle':
    self.prof = 'Senior'
  return self.prof
</code>


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

[['', '', '', 'г. Москва', '27972,5'],
 ['Центральный', '22103,9', '100,2', 'Орловская область', '17229,8'],
 ['', '', '', 'Мурманская область', '23320,8'],
 ['Северо-Западный', '21029,5', '100,0', 'Новгородская область', '17881,9'],
 ['', '', '', 'Краснодарский край', '20517,5'],
 ['Южный', '19085,2', '100,0', 'Республика Адыгея', '17788,5']]

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

[['Центральный', '22103,9', '100,2', 'г. Москва', '27972,5'],
 ['Центральный', '22103,9', '100,2', 'Орловская область', '17229,8'],
 ['Северо-Западный', '21029,5', '100,0', 'Мурманская область', '23320,8'],
 ['Северо-Западный', '21029,5', '100,0', 'Новгородская область', '17881,9'],
 ['Южный', '19085,2', '100,0', 'Краснодарский край', '20517,5'],
 ['Южный', '19085,2', '100,0', 'Республика Адыгея', '17788,5']]

Замените сначала пустые строки на nan, а потом bfill все прекрасно заполнит
<code>
df.replace('', np.nan).bfill()
</code>


Как изменять размер шрифта в Entry tkinter?
Именно если Entry уже создан, а размер шрифта нужно изменить. Скажите, пожалуйста, как это сделать

Например так:
<code>
from tkinter import *

def change_font():
    ent['font']=10
window = Tk()
window.title("Размещение документации на сервере")
window.geometry('1200x400')
ent = Entry(window, text='что-то там')
ent.pack()
but = Button(command=change_font)
but.pack()
window.mainloop()
</code>
Так же можно обращаться к любым свойствам виджетов и изменять их


Вывод значений ключей при получении нужного json
Делаю get запрос

res = requests.request("GET", 'example.com', headers={'local':'ru'})

Cервер может  прислать один из этих json

{
  "code": 1,
  "result": {
    "code": 10000,
    "List": [
      {
        "Id": "34",
        "local": {
        }
      },
      {
        "Id": "35",
        "local": {
        }
      }
    ]
  }
}

или

{
  "msg": "server error",
  "code": 500
}

После делаю вывод

print('Disconnect', if res.json()["code"] == 500 else 'Active')

Как добавить к статусу  "Active" значения ключей  "Id": "35", "34" в одной строке
Чтобы в итоге выводы были такими:

Disconnect или
Active | 35, 34

Всё как я и написал в комментарии, вот проверка:

def func(json_):
    print('Disconnect' if json_["code"] == 500
          else f'Active | {",".join(x["Id"] for x in json_["result"]["List"])}')

func({
  "msg": "server error",
  "code": 500
})

func({
  "code": 1,
  "result": {
    "code": 10000,
    "List": [
      {
        "Id": "34",
        "local": {
        }
      },
      {
        "Id": "35",
        "local": {
        }
      }
    ]
  }
})

Вывод:

Disconnect
Active | 34,35


Как сделать изменение клавиатуры на стрелки вперед/назад Aiogram?
Всем привет, возник вопрос. Есть сообщение, внизу его кнопки, созданные из массива с элементами 1-10 и ниже две стрелочки, отображаются только 1-5 на кнопках. Как сделать, чтобы при кнопке вперед отображалось, 6-10 и обратно также. Как можно это сделать через Inline клавиатуру?

Для этого необходима паганация, рекомендую aiogram-dialog
Так же можно создать две клавиатуры и при нажатии на кнопку "Вперед" менять клавиатуру с помощью

  message.edit_reply_markup(keyboard)

Вот пример

   @dp.callback_query(Text('call_data'))
   async def keyboards(call: types.CallbackQuery):
       await call.message.answer('text',   reply_markup=markup)

  @dp.callback_query(Text('next'))
  async def up_balance(call: types.CallbackQuery):
      await call.message.edit_reply_markup(markup)

Это на примере aiogram v.3.0.0b6
В первом хендлере вызывается первая клавиатура
Во втором при нажатии на кнопку "Вперед" с callback_data='next'
клавиатура меняется на вторую


Ускорить код, ищущий числа, у которых сумма делителей даёт остаток 3 при делении на само число
Числа 4 и 18 обладают довольно занимательным свойством. Сумма делителей даёт остаток 3 при делении на само число.
Мои попытки найти хотя бы ещё одно число с этим свойством не увенчались успехом:
<code>
for n in range(1, 200000):
    divisors = [i for i in range(1, int(n**(0.5))+1) if n % i == 0]
    divisors = divisors + [n // i for i in divisors if n//i != i]
    if sum(divisors) % n == 3:
        print(n, end=", ")
</code>
То есть в диапазоне до 200000 таких чисел нет, а чтобы искать дальше, нужно оптимизировать слишком медленно работающий код.
Пожалуйста, помогите разобраться.

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

from numba import njit

@njit
def func(m):
    for n in range(1, m):
        divisors = [i for i in range(1, int(n**(0.5))+1) if n % i == 0]
        divisors = divisors + [n // i for i in divisors if n//i != i]
        if sum(divisors) % n == 3:
            yield n

%time print(list(func(5_000_000)))

Вывод:

[4, 18]
CPU times: user 35.6 s, sys: 68.6 ms, total: 35.6 s
Wall time: 35.6 s


Не работает вывод в самописном менеджере контекста
<code>
import time

class TimeManager:
    def __init__(self):
        self.startTime = time.time()
        self.timeExec = 0

    def __enter__(self):
        self.timeEnd = time.time()
        self.timeExec = self.timeEnd - self.startTime
        return self.timeExec

    def __exit__(self, exception_type, exception_val, trace):
        return True

    def printTime(self):
        print(self.timeExec)

def foo():
    a = 1
    for i in range(10000):
        a += i
    print(a)
    return a

with TimeManager() as tm:
    # foo()
    print('freg')
    tm.printTime()
</code>
При выводе на принт хотелось бы, чтобы выводил разницу во времени или хотя бы что-нибудь. Но вывод как будто вообще не работает. Консоль просто пустая. При этом обычный принт срабатывает

Замечания:

Из
__enter__ лучше возвращать
self
Разницу лучше считать в
__exit__ и там можно выводить
Намудрили с определением разницы по времени - ее нужно брать в конце и от того же метода, от которого берете начальное время, т.е.
time.time()
Имена переменных и методов рекомендуется в змеиной нотации писать

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

import time

class TimeManager:
    def __init__(self):
        self.start_time = 0
        self.time_exec = 0

    def __enter__(self):
        self.start_time = time.time()
        return self

    def __exit__(self, exc_type, exc_value, exc_traceback):
        self.time_exec = time.time() - self.start_time
        self.print_time()

    def print_time(self):
        print(f'Total time: {self.time_exec:.3f} sec')

def foo():
    a = 1
    for i in range(10000):
        a += i
    print(a)
    return a

with TimeManager() as tm:
    # foo()
    print('freg')
    tm.print_time()


Выбрать самое частое значение в строке датафрема
Есть датафрейм.

    column1 column2 column3
0   high    medium  low
1   medium  medium  high
2   low     medium  low

нужно в каждой строке найти повторяющиеся значение и записать его в колонку4, если повторяющихся значений нет, то выбрать рандомно. Т.е в первой строке значение выбирается рандомно и сохраняется в колонку4, во второй строке в колонку4 сохраняется medium, в третьей строке колонка4=low.
при выполнении этого кода

df['column4'] = df.apply(lambda row: max(row, key=row.count), axis=1)

получаю ошибку: ValueError: Series.count level is only valid with a MultiIndex

<code>
df.mode(axis=1).apply(lambda x: x.dropna().sample(1).values[0], axis=1)

0    high
1  medium
2     low
</code>

pandas.mode
The mode of a set of values is the value that appears most often. It
can be multiple values.
Для набора значений возвращает наиболее часто встречающийся элемент

pandas.sample
Return a random sample of items from an axis of object.
Возвращает случайный элемент

Про dropna, думаю, можно не писать


AttributeError: type object 'Player2' has no attribute 'x'
Говорит что нет атрибута x, а он есть.
Не знаю скорее всего ошибка очень глупая, но я реально не могу понять в чём дело.
Вот ошибка:

Traceback (most recent call last):
  File "C:\Users\Artyom\PycharmProjects\pythonProject4\main.py", line 51, in <module>
    print(Player2.x)
          ^^^^^^^^^
AttributeError: type object 'Player2' has no attribute 'x'

А вот мой код:

from tkinter import *

game = Tk()
game.title('Simple multiplayer game, it was made that show how to create multiplayer or communication this server')
game.geometry('1000x600')
game.resizable(width=False, height=False)
canvas = Canvas(game, width=1000, height=600)
canvas.place(in_=game, x=0, y=0)

class Player1:
    def __init__(self):
        self.x = 250
        self.y = 300
        self.v = 0
        self.photo = PhotoImage(file='knight.png')

    def up(self, event):
        self.v = -3

    def down(self, event):
        self.v = 3

    def stop(self, event):
        self.v = 0

class Player2:
    def __init__(self):
        self.x = 750
        self.y = 300
        self.v = 0
        self.photo = PhotoImage(file='knight.png')

    def up(self, event):
        self.v = -3

    def down(self, event):
        self.v = 3

    def stop(self, event):
        self.v = 0

def start():
    canvas.delete('all')
    canvas.create_image(Player1.x, Player1.y, image=Player1.photo)
    canvas.create_image(Player2.x, Player2.y, image=Player2.photo)

# start()

print(Player2.x)

game.mainloop()

У класса
Player2 нет атрибута
x, этот атрибут будет только у объектов этого класса.

player2 = Player2()
print(player2.x)


Как правильно настроить пагинацию Джанго?
views

def cat_detail(request, category_id):
    category = Category.objects.get(id=category_id)
     products = Product.objects.filter(category=category)
    paginator = Paginator(products, 3)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'product/cat_detail.html',
         {'category': category, 'products': products, 'page_obj': page_obj})

html

<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>

        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">next</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>

paginator = Paginator(products, 3) Эта строка во views не работаtn, отображаются все продукты, а не 3

Вам не надо в контекст добавлять
product ! В
page_obj есть все необходимые аргументы ->
object_list список записей текущей страницы


Unused import statement 'import discord'
Начал писать бота для discord и столкнулся с проблемой, что на команды он не реагирует, притом если делать всё через @ping бота всё работает. Искал в чём проблема но в документации discord.py и на форумах так и не нашёл ответ. Единственное, что в коде вызывает предупреждение это (Unused import statement 'import discord') Может это как-то влиять на работу отклика бота на команды ?
<code>
import random
import asyncio
import discord
from discord.ext import commands

config = {
    'token': 'token',
    'prefix': '%',
}

bot = commands.Bot(command_prefix=config['prefix'],)

#Начало команды. Бот отвечает, когда его пингуют.
ping_1 = 'пинг_1'
ping_2 = 'пинг_2'
ping_3 = 'пинг_3'
#Конец команды. Бот отвечает, когда его пингуют.

@bot.event
async def on_message(message):
    if bot.user in message.mentions:
        await message.channel.send(random.choice([ping_1,ping_2,ping_3]))
#Конец команды. Бот отвечает, когда его пингуют.

@bot.command()
async def test(ctx, arg):
    await ctx.send(arg)

bot.run(config['token'])
</code>

Добавьте в
on_message строку:

await bot.process_commands(message)

То есть так:

@bot.event
async def on_message(message):
    if bot.user in message.mentions:
        await message.channel.send(random.choice([ping_1,ping_2,ping_3]))

    await bot.process_commands(message)


Добавить подпись альбому при его отправке в канал telegram ботом aiogram
Подскажите пожалуйста как можно добавить подпись к альбому с фотографиями который бот пересылает в канал.
<code>
@dp.message_handler(state=ClientStatesGroup.send_description)
async def handle_description(message: types.Message, state: FSMContext):
    data = await state.get_data()
    media = data['media_group']
    await bot.send_media_group(chat_id='@channel', media=media)
</code>
Бот получает альбом собранный с помощью данной функции и хэндлера и сохраненным в хранилище FSM. Проблема в том, что с помощью данной функции создается структура похожая на список, но тип данных там <class 'aiogram.types.input_media.MediaGroup'> и в него нельзя добавить ключ caption со значением полученным из текста пользователя. Может есть возможность как то это обойти?

В общем решение я нашёл. Если кому понадобится такое делать, то стоит media конвертировать в str и полученный str ещё раз конвертировать в list с помощью ast.literal_eval
<code>
string_media = str(media)  # превращаем в str наш экземпляр класса MediaGroup
media_with_caption = ast.literal_eval(string_media)  # Превращаем str в list
media_with_caption[0]['caption'] = message.text  # Добавляем описание
</code>


Добавить ключ и значение в первый словарь находящийся в списке
Подскажите пожалуйста как можно добавить ещё один ключ и значение в первый словарь находящийся в списке. К примеру "add_key": "add_value"
вот пример списка:

media = [{"media": "something", "type": "photo"},
     {"media": "something_else", "type": "photo"}]

Что бы по итогу список выглядел так:

media = [{"media": "something", "type": "photo", "add_key": "add_value"},
     {"media": "something_else", "type": "photo"}]

Во избежании ошибок советую проверять есть ли первый элемент в массиве
<code>
media[0]['add_key'] = 'add_value'
</code>


Можно ли внедрить веб приложение на JS в окно PyQT интерфейса?
Например, есть карта с определенным функционалом, которая отображается в браузере, и соответственно написана средствами JS. Можно ли каким нибудь образом интегрировать содержимое браузера в интерфейс приложения на PyQT? Если да, то какие средства нужны для достижения этой цели?

Если вопрос звучит так:

Можно ли каким нибудь образом интегрировать содержимое браузера в интерфейс приложения на PyQT?

То ответ - Да можно.
А если нужен скрипт, то сначала покажите ваши достижения в этом вопросе.


Как из сегодняшней даты вычесть нужную дату?
Пытаюсь из сегодняшней даты вычесть 21.01.23(как пример) сделал так:
<code>
from datetime import datetime, timedelta

A = datetime(2023, 1, 22, 5)

B = datetime.now()

print (A - B)
</code>
В результате но показывает мне минуты, секунды. Как сделать так чтоб он показывал мне только год, месяц, день, час?
Хочу чтоб он просто перестал показывать секунды при ответе, как это сделать?

Если речь действительно идет про "чтоб он просто перестал показывать секунды при ответе" то вот так:

from datetime import datetime, timedelta
A = datetime(2023, 1, 22, 5)
B = datetime.now()
print(str(A - B).split(".")[0])

Результат:

5 days, 17:18:37

По ходу хочу заметить, что timedelta с годами не работает в принципе. И с месяцами, кстати, тоже.


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

df_test = pd.DataFrame(np.random.randint(low = 1, high = 12, size = (10 ,3)))
df_test = df_test.rename(columns={0: 'month', 1: 'value1', 2: 'value2'})
df_test

    m   a   b
0   8   1   8
1   4   3   8
2   1   2   5
3   3   4   1
4   5   8   2
5   9   7   6
6   9   6   9
7   3   5   10
8   2   3   1
9   8   5   2

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

month = 0 # для сохранения месяца
years = 2021 # начало отсчета для года
df_test['year'] = 0
for count in range(0, df_test.shape[0]):
    if df_test.loc[count, 'm'] > month: # если месяц больше сохраненного значения
        month = df_test.loc[count, 'm'] # изменяем сохраненный месяц
        df_test.loc[count, 'year'] = years
    elif df_test.loc[count, 'm'] < month: # если месяц меньше сохраненного значения
        years = years + 1                 # увеличиваем года
        month = df_test.loc[count, 'm']
        df_test.loc[count, 'year'] = years
    else:
        df_test.loc[count, 'year'] = years # только присваиваем значение

df_test

    m   a   b   year
0   8   1   8   2021
1   4   3   8   2022
2   1   2   5   2023
3   3   4   1   2023
4   5   8   2   2023
5   9   7   6   2023
6   9   6   9   2023
7   3   5   10  2024
8   2   3   1   2025
9   8   5   2   2025

Помогите улучшить код. Спасибо.

Формируем столбец с разностью методом
diff() последовательных
month, далее преобразуем его в булев массив с помощью
lt(0), где True - отрицательная разность (текущий месяц меньше предыдущего), затем суммируем его нарастающим итогом через
cumsum(), получая последовательность от 0 до N. Ноль соответствует точке отсчета, т.е. 2021 году, 1 - 2022 и так далее. Поэтому просто прибавляем 2021 и все.

df_test['year'] = df_test.month.diff().lt(0).cumsum() + 2021

   month  value1  value2  year
0      4       5       5  2021
1      4       3      10  2021
2      1       9      11  2022
3     10      11       6  2022
4      3       9       5  2023
5      9       5       5  2023
6      6       5       7  2024
7      3       4       5  2025
8      6       7       3  2025
9      7      11       2  2025


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

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

Расчет

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

Я пытался создать некоторые функции, но это не работает.
<code>
M1 = []

M2 = []

M3 = []

m1_length = int(input("Enter M1's length:"))

for i in range(0, m1_length):

    num1 = str(input("Enter M1 elements: "))
    M1.append(num1)

m2_length = int(input("Enter M2's length:"))

for i in range(0, m2_length):

    num2 = str(input("Enter M2 elements: "))
    M2.append(num2)

def common_number(M1, M2):

    M1 = set(M1)
    M2 = set(M2)

    if (M1 & M2):
        print(M1 & M2)

M3.append(common_number(M1, M2))
</code>

Ну у вас же написано всё в задании:

В программе должно быть создано не менее 3 функций:

Входные данные
Расчет
Выходные данные

Если я правильно понимаю:

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


Как получить атрибут экземпляра обработав его?
Как получить атрибут экземпляра обработав его?
Пример:

@dataclass
class Food:
    # Белка в 100гр рыбы, в гр
    p_100g: float

fish = Food(123)

# Содержимое белка в 100гр рыбы в кг
fish_protein_100g_in_kg = fish.p_100g / 1000

# Как получить то же самое при помощи синтаксиса fish.kg.p_100g?

Пытался сделать при помощи
__getattr__() и
__getattribute__()- что-то не могу понять как

Данный код не имеет практической ценности. Не надо так делать. Если это какая-то практическая задача, подумайте над более грамотным подходом. Например можно добавить классу Food метод  для конвертации в указанную размерность отдаваемых значений.
А так вот как вы просили
<code>
@dataclass
class Food:
    # Белка в 100гр рыбы, в гр
    p_100g: float

    def __getattr__(self, name):
        cls = type(self)
        if name == 'kg':
            return Food(self.p_100g / 1000)
        msg = f'{cls.__name__!r} object has no attribute {name!r}'
        raise AttributeError(msg)

fish = Food(123)
fish.kg.p_100g
# 0.123
</code>


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

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

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

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

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

даны варианты ответа на задачу:

A) 1
B) 2
C) 3
D) 4

Нужно случайным образом сгенерировать числа(%), которые будут отображать вероятность, что это правильный ответ. В сумме должно получаться 100%
Например:

A) 12%
B) 6%
C) 48%
D) 34%

Сгенерировать n - 1 случайное число, добавить к ним 0 и 100. Отсортировать. Сосчитать разницы между соседями - это ответ.

[21, 98, 24]          # случайные числа в интервале [0, 100]
[21, 98, 24, 0, 100]  # добавлены края диапазона
[0, 21, 24, 98, 100]  # после сортировки
[ 21,  3, 74,  2   ]  # разности между соседями, их сумма равна 100

Код:

import random

n = 4
target = 100
samples = [random.randrange(target + 1) for _ in range(n - 1)] + [0, target]
samples.sort()
probs = [b - a for a, b in zip(samples[:-1], samples[1:])]
print(sum(probs), '=', ' + '.join(map(str, probs)))

$ python random-percents.py
100 = 23 + 42 + 29 + 6

$ python random-percents.py
100 = 4 + 49 + 20 + 27

$ python random-percents.py
100 = 16 + 67 + 13 + 4

$ python random-percents.py
100 = 13 + 9 + 23 + 55


взаимодействие файла реализации и conf
Хочу создать полноценное консольное приложение для ОС без использования интерпретатора python, а скомпилированного файла реализации(~exe файл) с использованием файла конфигурации.
Они находятся в одной директории

/usr/bin/date-worker/.

я помечаю расположение файла реализации в переменные среды

export PATH="$PATH:/usr/bin/date-worker"

Перехожу в другой репозиторий, запускаю

pepe@pepe-Aspire-A315-41:~$ dw -h

выдает ошибку: не видит date.conf

FileNotFoundError: [Errno 2] No such file or directory: 'date.conf'

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

Все дело в том, что я запускал программу из другого репозитория, где функция "open()" пыталась найти мой файл.

open('date.conf', 'r', encoding='utf-8')

Решение - указать путь к моему конфигурационному файлу

open('/usr/bin/date-worker/date.conf', 'r', encoding='utf-8')


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

user = ["Player(index=0, name='user1', score=5, time=2),"
    "Player(index=1, name='user2', score=4, time=2),"
    "Player(index=2, name='user3', score=3, time=3"]

Прошу подсказки как из этого получить результат цикла for с user1 - 5, user2 - 4 ,user3 - 3.

class Player(metaclass=DataclsMeta):
"""Apparently an entry index, but seems to be always 0"""
index: int

"""Name of the player"""
name: str

"""Score of the player"""
score: int

"""Time the player has been connected to the server"""
duration: float

def deserialize_response(reader, response_type, ping):
    player_count = reader.read_uint8()
    resp = [
        Player(
            index=reader.read_uint8(),
            name=reader.read_cstring(),
            score=reader.read_int32(),
            duration=reader.read_float()
        )
        for player_num in range(player_count)
    ]
    return resp

Пытался сделать из списка строку, потом преобразовал ее обратно в список с помощью split(',"Player(') но это все не то, python имеет более гармоничное решение, прошу вашей помощи.
Заранее спасибо

Пример парсинга через регулярное выражение.
Функция
re.findall вернет список из кортежей с найденными значениями
Пример:

import re
from dataclasses import dataclass

@dataclass
class Player:
    """Apparently an entry index, but seems to be always 0"""
    index: int

    """Name of the player"""
    name: str

    """Score of the player"""
    score: int

    """Time the player has been connected to the server"""
    duration: float

# Тут по-сути список из одного элемента - строки, описывающей коллекцию Player
user = ["Player(index=0, name='user1', score=5, time=2),"
    "Player(index=1, name='user2', score=4, time=2),"
    "Player(index=2, name='user3', score=3, time=3"]
text = user[0]

items = re.findall(r"index=(\d+), name='(.+?)', score=(\d+), time=(\d+)", text)
print(items)
# [('0', 'user1', '5', '2'), ('1', 'user2', '4', '2'), ('2', 'user3', '3', '3')]

for index, name, score, time in items:
    player = Player(int(index), name, int(score), int(time))
    print(player)

Результат из цикла:

Player(index=0, name='user1', score=5, duration=2)
Player(index=1, name='user2', score=4, duration=2)
Player(index=2, name='user3', score=3, duration=3)


Оператор return в блоке try/except/finally
Имеется такая функция:

def f():
    try:
        1 / 0
    except:
        return 1
    finally:
        return 2
    return 3

При запуске она возвращает
2, хотя после возникновения исключения должна попадать в блок
except, где возвращается
1, разве
return не прерывает выполнение функции?

Короткий ответ: блок внутри
finally выполнится в любом случае, независимо от того, что происходит внутри блоков
try, except, else, поэтому вернется значение
2.

Если углубиться:
Согласно документации, когда внутри блоков
try/except/else встречается оператор
return, а после есть оператор
finally, то выполнение функции не прерывается, а происходит примерно следующее:

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

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

def f():
    try:
        a = 2
        return a
    finally:
        a += 1

В результате выполнения - функция вернет
2, поскольку числа в языке
Python - неизменяемые объекты, операция
+= создает новый объект, который никак не влияет на значение, скопированное для возврата через
return.
Но, изменим ситуацию:

def f():
    try:
        a = [2]
        return a
    finally:
        a[0] += 1

Уже здесь - вернется список
[3], потому что значение было изменено по ссылке.
Так происходит, потому что списки - это изменяемые объекты и в результате операций с ними возвращается тот же самый объект.

Такое поведение только у оператора return?
Вообще, такое прерывание выполнения и переход к блоку
finally происходит не только с оператором
return, но и при возникновении любого исключения, и много чего еще, например, вызова
sys.exit() (который, на самом деле, тоже вызывает исключение).
Убедимся в этом:

def f():
    try:
        raise Exception
    finally:
        return 1

В результате работы функции никакого исключения не возникнет и будет возвращено
1.
И, если задуматься, то это большая проблема, мы никогда не узнаем о том исключении, которое у нас возникло, вследствие возврата значения в блоке
finally.
Поэтому, в руководстве по написанию кода
PEP 8 есть специальный раздел, в котором написано, что не рекомендуется использовать
return в блоке
finally, поэтому: знать о том, как это работает - полезно, но применять - не стоит.

Use of the flow control statements
return/break/continue within the

finally suite of a
try...finally, where the flow control statement
would jump outside the
finally suite, is discouraged. This is because
such statements will implicitly cancel any active exception that is
propagating through the
finally suite.

Однако, в случае, если изначально было выброшено необработанное исключение, а в блоке
finally выбрасывается еще одно, тогда будут выведены они оба.

def f():
    try:
        raise Exception
    finally:
        raise TypeError

Ошибка:

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    raise Exception
Exception

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 4, in <module>
    raise TypeError
TypeError

Выводы:
Обобщив все вышесказанное, можно понять, что:
Оператор
finally выполняется всегда, и выполняется он в последнюю очередь, поэтому, если в блоке
try-except-else встретится какая-либо исключительная ситуация (возврат значения, исключение, операторы прерывания), то код в блоке
finally может повлиять на них (в случае возникновения новой исключительной ситуации).
Но, естественно, это относится к только одному цельному блоку (
try-except-else-finally), и если бы мы слегка изменили исходный пример:

def f():
    return 3
    try:
        1 / 0
    except:
        return 1
    finally:
        return 2

То, конечно, функция уже вернет
3, потому что до блока исключений она не успеет дойти, после вызова
return ее выполнение прервется.
Такое поведение используется только с оператором
finally, и, например, в случае:

def f():
    try:
        return 1
    except:
        return 2
    else:
        return 3

Несмотря на то, что ошибок в блоке
try нет - блок
else не выполнится, и будет возвращено значение
1, потому что отсутствует оператор
finally, вследствие чего ожидаемое поведение с прерыванием работы не меняется.

Дополнительно
Функционал с гарантированным выполнением блока
finally используется неявно и при использовании контекстного менеджера
with, именно поэтому его часто рекомендуют в использовании: что бы ни происходило внутри блока
with - операция закрытия файла/соединения будет произведена.


Удалить строку из txt файла которая будет выведена и имеет определенный текст в конце строки?
У меня есть много строк в txt файле, мне нужно вывести рандомную строку, но чтобы в конце был определенный текст
пример:
asd79asd98as7dasd89a8sd9 | vip
asdsda7sda8s7d0895gs875a | premium
я пишу заданный аргумент вип или премиум и он ищет в txt файле строчку с определенным аргументом
код который у меня есть на данный момент
<code>
with open("key.txt", encoding='utf-8') as file:
    lines = file.readlines()

random_line = random.choice(lines).strip()

print(random_line)
</code>

Вот этой строкой вы выбираете случайный элемент из списка всех строк:

random.choice(lines).strip()

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

arg = 'vip'

lines_to_choice = []

for line in lines:
    if arg in line:
        lines_to_choice.append(line)

random_line = random.choice(lines_to_choice).strip()

Или проще, через генератор:

random_line = random.choice([line for line in lines if 'vip' in line]).strip()


Как переопределить классы стилей messages django
Как можно переопределить стили для системы оповещения (messages) в Django, чтобы они совпадали с классами стилей bootstrap

Вам просто нужно переопределить MESSAGE_TAGS в settings.py проекта и дописать нужные стили (bootstrap5)
<code>
from django.contrib.messages import constants as messages
MESSAGE_TAGS = {
    messages.DEBUG: 'alert-secondary',
    messages.INFO: 'alert-primary',
    messages.SUCCESS: 'alert-success',
    messages.WARNING: 'alert-warning',
    messages.ERROR: 'alert-danger',
}
</code>


Как правильно вынести код в отдельную функцию?
Делаю тг бота и чтобы код не повторялся, вынес его в отдельную функцию. Работает правильно, но тг бот возвращает только одну карточку(значение). Происходит это потому что return выходит из цикла, но как это решит по другому я немного не понимаю
tg_bot.py
<code>
def create_card(json_file):

for index, i in enumerate(json_file):
    card = f'{hbold(i.get("name"))}\n' \
           f'{hbold(i.get("price") + " ₽")}\n' \
           f'{i.get("link")}'

    if index % 20 == 0:
        time.sleep(3)

    return card

@dp.message_handler(Text(equals='Процессоры'))
async def result(message: types.Message):
    await message.answer('Ищем лучшее для вас')

    CPU()

    with open('CPU_citilink5%.json') as file:
        data = json.load(file)
        card = create_card(data)
        await message.answer(card)
</code>
Немного о проекте: тг бот на основе парсера, который собирает данные с ситилинка

Если вы используете оператор return внутри цикла, он выйдет из цикла после первой итерации и вернет только первую карту. Чтобы вернуть все карты, вы можете использовать структуру данных списка для хранения карт, а затем вернуть список после завершения цикла.
Одним из возможных решений было бы инициализировать пустой список перед циклом, добавить каждую карту в список внутри цикла, а затем вернуть список после завершения цикла:

def create_card(json_file):
cards = []
for index, i in enumerate(json_file):
    card = f'{hbold(i.get("name"))}\n' \
           f'{hbold(i.get("price") + " ₽")}\n' \
           f'{i.get("link")}'
    cards.append(card)
return cards

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

    cards = create_card(data)
for card in cards:
    await message.answer(card)

Таким образом, функция перебирает все карточки в json-файле и сохраняет их в списке. Затем бот перебирает список и отправляет каждую карточку в виде сообщения.


Округлить число до сотен, 10005 до 10100
как окргулить число именно до сотен, например:
<code>
12003 - 12100
10135 - 10200
5711 - 5800
</code>

Как вариант - добавить к числу +50, а потом уже округлять до сотен.
<code>
print round(12003 + 50, -2)
print round(10135 + 50, -2)
print round(5711 + 50, -2)
</code>
+50 нужно для того, чтобы обычное "стандартное" округление, работало как округление "вверх".


Сравнивание столбцов в sqlite python
Есть таблица sqlite, в ней есть два столбца, которые содержат списки гостей. По большей части они идентичны, но есть небольшие различия, которые мне нужно достать
Столбец 1(NAME):
Вова
Вася
Петя
Коля
Саша
Наташа
Даша
Столбец 2(NAME2):
Вова
Вася
Петя
Коля
Саша
Вывод, который нужно получить: Наташа и Даша не придут.

Используйте оператор EXCEPT
SQL-запрос

SELECT name
  FROM guests
EXCEPT
SELECT name2
  FROM guests;

Таблица
guests

name    name2
Саша    Саша
Петя    Петя
Коля    Коля
Вова    Вова
Вася    Вася
Наташа
Даша

Результат

name
Даша
Наташа


Поддерживают ли TG-боты 3го человека в чате автоматически?
(1)
Есть некий бот. Он принимает заказ на, пусть будет, пиццу, опрашивая клиента. Как wizard.
В конце опроса клиент нажимает на кнопку "Да, оформить заказ".
В моём случае необходимо, чтобы в чат с клиентом, после оформления заказа, подключался оператор. Всегда.
До недавней поры у нас это было сделано через посылку приглашения в группу 1-1 c оператом, после приёма заказа. Простыня заказа при этом  отправляется в эту группу.
Но, запарно, неудобно.
(2)
Мне подсказали, что якобы с недавней поры ТГ поддерживает 3х (и более?) человек у бота.
То есть, оператору можно сразу пребывать в группе с ботом и каждым новым клиентом автоматически, как бы подглядывая за клиентом делающим заказ.
То есть, у оператора будут, скажем, сотни изолированных, уникальных чатов с любым новым клиентом:
"бот-оператор-клиент"
Вопрос:
Такое действительно возможно?
Чаты эти будут уникальные, изолированные?
Как это делается? И как называется?

Оператор может присоединиться к чату с клиентом после того, как он сделает заказ. Вы можете использовать функцию
Telegram Bot API под названием «
getUpdates», чтобы прослушивать новые сообщения и определять, когда клиент разместил заказ. Как только бот обнаружит, что заказ оформлен, он может пригласить оператора присоединиться к чату с покупателем. Есть и другие способы добиться этого, например, с помощью вебхуков.

Да, в чате
Telegram с ботом может быть несколько человек.
Telegram поддерживает групповые чаты, в которых бот может взаимодействовать с несколькими участниками. Бота можно добавить в существующий групповой чат или создать новый групповой чат с оператором и клиентом. Эта функция называется «групповой чат», и ее можно использовать для создания комнаты чата, в которой несколько человек могут одновременно общаться с ботом.

Оператор может использовать
Telegram Bot API для мониторинга группового чата и автоматического определения новых клиентов. Также бота можно запрограммировать на уведомление оператора о присоединении нового клиента к групповому чату. Таким образом, оператор может сразу начать общение с клиентом.

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


Python/Selenium javascript error: argument is not defined [закрыт]

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

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

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

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

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

selenium.common.exceptions.JavascriptException: Message: javascript error: argument is not defined

вот собственно сам метод(если коротко, то его суть скролл до элемента)
<code>
    def scroll_to_element(self, locator):
        return self.driver.execute_script("argument[0].scrollInToView();", locator)
</code>
С чем это может быть связано?

В моем случае проблема была с синтаксисом я использовал argument[0], а нужно arguments[0], то есть верный код будет выглядеть вот так:
<code>
    def scroll_to_element(self, locator):
        return self.driver.execute_script("arguments[0].scrollInToView();", locator)
</code>


random.shuffle() возвращает None
есть код:
<code>
import random

mylist = [0, 1, 2, 3, 4, 5, 6, 7]
print(random.shuffle(mylist))
</code>
код возвращает None и я не могу понять почему

Дело в том, что функция
random.shuffle() ничего не возвращает, она изменяет исходный объект.

The shuffle() method takes a sequence, like a list, and reorganize the
order of the items.

Попробуйте:

import random

mylist = [0, 1, 2, 3, 4, 5, 6, 7]
random.shuffle(mylist)

print(mylist)


Ошибка при выполнении json.load()
При выполнении данного куска кода, появляется ошибка, хотя все написано вроде бы правильно. Прошу помощи.
Код:

import json

with open('database.json', 'r') as file:
    data = json.load(file)
print(data)

Файл database.json:

data = {
    "president": {
        "name": "Zaphod Beeblebrox",
        "species": "Betelgeusian"
    }
}

Ошибка:

Traceback (most recent call last):
  File "D:\Projects\Programming\Python\Teaching\teaching.py", line 4, in <module>
    data = json.load(file)
  File "C:\Users\Jokimazi\AppData\Local\Programs\Python\Python310\lib\json\__init__.py", line 293, in load
    return loads(fp.read(),
  File "C:\Users\Jokimazi\AppData\Local\Programs\Python\Python310\lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "C:\Users\Jokimazi\AppData\Local\Programs\Python\Python310\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\Jokimazi\AppData\Local\Programs\Python\Python310\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

В файле не должно быть переменной, только сами данные.
Чтобы получить нормальный json, запишите его!

with open('database.json', 'w') as file:
    file.write(json.dumps(data))

Содержание файла:

{"president": {"name": "Zaphod Beeblebrox", "species": "Betelgeusian"}}

Теперь такой файл открывается без проблем.
Подробнее о структуре json файлов можно почитать здесь.


Помогите исправить ошибку shutil
Делаю функцию для распаковки архива (в папке с архивом создаётся папка в которой все файлы):

def unpack_archives(archive_path):
    archive_path = Path(archive_path + '/archive')
    for archive in archive_path.rglob("*"):
        try:
            shutil.unpack_archive(archive, archive_path)
        except BaseException:
            continue

Вылазит ошибка, если файл уже был распакован, то есть там файл уже создан. Как это убрать? Какую ошибку вписать в try. Если у меня два архива в папке и один уже был распакован, то я не смогу из-за ошибки распаковать второй архив. Ошибка:

Traceback (most recent call last):
  File "C:\Projects\Test_Project\Test.py", line 125, in <module>
    sort_files(files_paths, groups_of_files)
  File "C:\Projects\Test_Project\Test.py", line 45, in sort_files
    shutil.move(file_path, path_folder_for_sort + '/' + name_group)
  File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python311\Lib\shutil.py", line 822, in move
    raise Error("Destination path '%s' already exists" % real_dst)
shutil.Error: Destination path '/Projects/Example/documents\kek.txt' already exists

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

import os

def unpack_archives(archive_path):
    for archive in archive_path.rglob("*"):
        shutil.unpack_archive(archive, os.path.join(archive_path, archive))

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


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

Можно поставить wmi (всего 28 kb) и получить список всех процессов в Windows, оттуда и брать ID, который необходимо убить с
kill().

pip install wmi

import wmi
f = wmi.WMI()

for process in f.Win32_Process():
    if process.Name == 'Telegram.exe':
        print(process.ProcessId)

Чтобы быстрее работало, не идём по всем процессам, а делаем фильтр средствами библиотеки. Отрабатывает за 86ms вместо 5s:

for process in f.Win32_Process(name = 'Telegram.exe'):
    print(process.ProcessId)


Реализовать Telegram bot в несколько файлов?
Всем привет, учусь разрабатывать telegram ботов на основе библиотеки telebot, код вышел достаточно массивным, и хочу его как-то разделить на файлы, пример: есть файл main.py и register.py
main.py:

import config
import registr
import telebot

bot = telebot.TeleBot(config.token)

@bot.message_handler(commands=['start'])
def getmsg(m):
    bot.send_message(m.from_user.id, "Привет!")
    bot.register_next_step_handler(m, registr.step_one)

def ending(m):
    bot.send_message(m.from_user.id, "Конец!")

if __name__ == "__main__":
    bot.polling(none_stop=True, interval=0)

registr.py

import config
import main
import telebot

bot = telebot.TeleBot(config.token)

@bot.message_handler()
def step_one(m):
    bot.send_message(m.from_user.id, "Шаг 1!")
    bot.register_next_step_handler(m, step_second)

@bot.message_handler()
def step_second(m):
    bot.send_message(m.from_user.id, "Шаг 2!")
    bot.register_next_step_handler(m, main.ending)

Суть проблемы в том, что когда запускается функция step_one в файле registr.py, то сообщение выводится, а дальше возвращается в main.py... а если добавить в конце registr.py строчку
bot.polling(none_stop = True), то вывод "Привет" нету, а сразу выводится "Шаг 1!" в step_one в файле registr.py, словно он игнорирует строчку с выводом "Привет!"...

Суть проблемы в том, что когда запускается функция step_one в файле registr.py, то сообщение выводится, а дальше возвращается в main.py...

Это не проблема, а особенность работы в проекте с несколькими файлами. Вы импортируете функции в файле registr.py и используете их в main.py

а если добавить в конце registr.py строчку bot.polling(none_stop = True)

В дополнительном файле с функциями не должно быть
bot.pollig(), как не должно быть и строчки
bot = telebot.TeleBot(config.token). Инициализация бота должна производиться один раз, допустим в main.py, используйте второй файл как библиотеку фукций.


Как алгоритм использовать для решения задачи?
не могу понять как решить следующую задачу:
На вход программа получает две строки. В первой находится список целых чисел, разделенных пробелом. Во второй строке программа получает натуральное число group_size. Программа должна определить, можно ли полученный список разделить на группы размера group_size так, чтобы в каждой группе все элементы были одинаковы. На выходе программа должна вывести True или False.
Пример входных данных:
0 6 4 4 5 4 5 5 6 5 2 5 5 0 1 3 1 7 7 6 2 1 2 5 0 0 1 6 6
2
Выходные данные:
False
Вот я начал так решать:
<code>
string='3 2 2 3 3 3 1 4 4 3 2 1 3 4 2 4'
lst=string.split()
lst.sort(reverse=False) #1122223333334444
print(lst)
group=int(2)
print(group)
ind=0
lstgr=[]
#print(type(lstgr))
for i, item in enumerate(lst):
    lst[i]=int(item) #11 22 22 33 33 33 44 44
    for j in range(0,group):
        lstgr.append(lst[i])
    #print(i,lst[i],ind)
</code>
отсортировал список, но не понимаю, как можно разделить на необходимые группы и сравнить их? можете подсказать?

Это можно сделать так:
<code>
string = '0 6 4 4 5 4 5 5 6 5 2 5 5 0 1 3 1 7 7 6 2 1 2 5 0 0 1 6 6 2' # входная строка
group_size = 2 # по сколько группируем

numbers = string.split() # преобразуем в список

for num in set(numbers):
    c = numbers.count(num) # сколько раз число встречается в списке
    if c%group_size: # если кол-во появлений в списке не кратно размеру группы - задача невыполнима
        print(False)
        break
else:
    # сюда программа доходит, если проверила все числа и все прошли проверку кол-ва вхождений
    print(True)
</code>


Как переименовать файл

def normalize(item_path):
    CYRILLIC_SYMBOLS = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяєіїґ"
    TRANSLATION = ("a", "b", "v", "g", "d", "e", "e", "j", "z", "i", "j", "k", "l", "m", "n", "o", "p", "r", "s", "t",
                   "u", "f", "h", "ts", "ch", "sh", "sch", "", "y", "", "e", "yu", "ya", "je", "i", "ji", "g")
    TRANS = {}
    for cyril_symb, latin_symb in zip(CYRILLIC_SYMBOLS, TRANSLATION):
        TRANS[ord(cyril_symb)] = latin_symb
        TRANS[ord(cyril_symb.upper())] = latin_symb.upper()
    table = item_path.maketrans(TRANS)
    return str(item_path).translate(table)

for file_path in files_paths:
    new_name = normalize(split(file_path)[-1].split('.')[0])
    os.rename(split(file_path)[-1], new_name + '.' + split(file_path)[-1].split('.')[-1])

Пытаюсь переименовать файлы с русского на английский. Например если файл: Архив.rar нужно его переименовать в Archiv.rar. Но у меня выдаёт ошибку:

Traceback (most recent call last):
  File "C:\Projects\Test_Project\Test.py", line 100, in <module>
    os.rename(split(file_path)[-1], new_name + '.' + split(file_path)[-1].split('.')[-1])
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'Архив.rar' -> 'Arhiv.rar'

То есть я правильно беру по срезам все, но не понимаю почему не работает.

translation = {
    'а': 'a',
    'б': 'b',
    'в': 'v',
    'г': 'g',
    'д': 'd',
    'е': 'e',
    'ё': 'j',
    'ж': 'zh',
    'з': 'z',
    'и': 'i',
    'й': 'j',
    'к': 'k',
    'л': 'l',
    'м': 'm',
    'н': 'n',
    'о': 'o',
    'п': 'p',
    'р': '',
    'с': 's',
    'т': 't',
    'у': 'u',
    'ф': 'f',
    'х': 'h',
    'ц': 'ts',
    'ч': 'ch',
    'ш': 'sh',
    'щ': 'sch',
    'ъ': '',
    'ы': 'y',
    'ь': '',
    'э': 'e',
    'ю': 'yu',
    'я': 'ya',
    'є': 'je',
    'і': 'i',
    'ї': 'ji',
    'ґ': 'g',
    'А': 'A',
    'Б': 'B',
    'В': 'V',
    'Г': 'G',
    'Д': 'D',
    'Е': 'E',
    'Ё': 'J',
    'Ж': 'ZH',
    'З': 'Z',
    'И': 'I',
    'Й': 'J',
    'К': 'K',
    'Л': 'L',
    'М': 'M',
    'Н': 'N',
    'О': 'O',
    'П': 'P',
    'Р': '',
    'С': 'S',
    'Т': 'T',
    'У': 'U',
    'Ф': 'F',
    'Х': 'H',
    'Ц': 'TS',
    'Ч': 'CH',
    'Ш': 'SH',
    'Щ': 'SCH',
    'Ъ': '',
    'Ы': 'Y',
    'Ь': '',
    'Э': 'E',
    'Ю': 'YU',
    'Я': 'YA',
    'Є': 'JE',
    'І': 'I',
    'Ї': 'JI',
    'Ґ': 'G'
}
name = 'Архив.rar'

print(''.join(map(lambda x: translation.get(x, x), name)))
# Ahiv.rar

Только я бы, на Вашем месте, еще и замену для пробела добавил на
_ (к примеру)

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

pip install transliterate

from transliterate import translit

print(
    translit('Архив.rar', 'ru', reversed=True)
)
# Arhiv.rar

С переименованием

from pathlib import Path
# Считаем что переменную translation мы уже создали
name = 'Архив.rar'

def rename_file(original_file_path: Path):
    new_file_path = original_file_path.absolute().parent.joinpath(
        ''.join(map(lambda x: translation.get(x, x), original_file_path.name))
    )
    if original_file_path.exists() and original_file_path.is_file():
        original_file_path.rename(new_file_path)

rename_file(Path('Архив.rar'))


Как создать список с названиями папок в которые заходить нельзя
Пишу скрипт для сортировки файлов по форматам. Скрипт создает папки с названиями ключей из словря:

groups_of_format = {
        'images': ['JPEG', 'PNG', 'JPG', 'SVG', 'EXE'],
        'video': ['AVI', 'MP4', 'MOV', 'MKV'],
        'documents': ['DOC', 'DOCX', 'TXT', 'PDF', 'XLSX', 'PPTX', 'PY'],
        'audio': ['MP3', 'OGG', 'WAV', 'AMR', 'XML'],
        'archive': ['ZIP', 'GZ', 'TAR'],
    }

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

def create_folders_from_groups(path_to_folder, folder_names):
    for folder_for_sorted in folder_names.keys():
        os.makedirs(path_to_folder + '/' + folder_for_sorted, exist_ok=True)

Функции для обхода папок и файлов:

def parse_files(folder_path):
    path = Path(folder_path)

    file_names = []
    file_paths = []
    for item in path.rglob("*"):
        if item.is_file():
            file_names.append(item.name)
            file_paths.append(Path(item))
    return file_names, file_paths

def parse_folders(folder_path):
    path = Path(folder_path)

    folder_names = []
    folder_paths = []

    for item in path.rglob("*"):
        if not item.is_file():
            folder_names.append(item.name)
            folder_paths.append(Path(item))
    return folder_names, folder_paths

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

for item in path.rglob("*"):
        if not item.is_file() and 'zip' in path.parts[:-1]:
            folder_names.append(item.name)

На проверку совпадения элементов из разных массивов можно совершить через использование set

a = ['1', '3']
b = ['1', '2']
bool(set(a) & set(b)) # True


Подскажите как убрать ошибку

Traceback (most recent call last):
  File "C:\Projects\Test_Project\Test.py", line 81, in <module>
    shutil.move(file, path_folder_for_sort + '/' + name_group)
  File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python311\Lib\shutil.py", line 822, in move
    raise Error("Destination path '%s' already exists" % real_dst)
shutil.Error: Destination path '/Projects/Example/documents\activate_this.py' already exists

Вылетает такая ошибка в cmd. Я написал скрипт который сортирует по папкам файлы из словаря, скрипт запускается из cmd(python script_name /path/to/folder). Скорее всего ошибка в том что есть функция которая создаёт папки и если я 2 раза сортирую одну и ту же папку, то ошибка вылезает потому что эти папки из ключей словаря с форматами файлов уже существуют. Как я могу это исправить чтобы я мог сортировать одну папку несколько раз без ошибки?
И может будут какие-то рекомендации по моему коду, я очень сомневаюсь что сделал его по стандартам)))

import os
import shutil

from pathlib import Path
from os.path import split
from sys import argv

def create_folders_from_groups(path_to_folder, folder_names):
    for folder_for_sorted in folder_names.keys():
        os.makedirs(path_to_folder + '/' + folder_for_sorted, exist_ok=True)

def parse_files(folder_path):
    path = Path(folder_path)

    file_names = []
    file_paths = []

    for item in path.rglob("*"):
        if item.is_file():
            file_names.append(item.name)
            file_paths.append(Path(item))
    return file_names, file_paths

def parse_folders(folder_path):
    path = Path(folder_path)

    folder_names = []
    folder_paths = []

    for item in path.rglob("*"):
        if not item.is_file():
            folder_names.append(item.name)
            folder_paths.append(Path(item))
    return folder_names, folder_paths

def sort_files(files_paths, groups_of_files):
    pass

if __name__ == '__main__':

    path_folder_for_sort = argv[-1]
    groups_of_format = {
        'images': ['JPEG', 'PNG', 'JPG', 'SVG', 'EXE'],
        'video': ['AVI', 'MP4', 'MOV', 'MKV'],
        'documents': ['DOC', 'DOCX', 'TXT', 'PDF', 'XLSX', 'PPTX', 'PY'],
        'audio': ['MP3', 'OGG', 'WAV', 'AMR', 'XML'],
        'archive': ['ZIP', 'GZ', 'TAR'],
    }
    groups_of_files = {
        'images': [],
        'video': [],
        'documents': [],
        'audio': [],
        'archive': [],
    }
    set_of_formats = set()
    set_of_unknown_formats = set()

    files_names, files_paths = parse_files(path_folder_for_sort)
    folders_names, folders_paths = parse_folders(path_folder_for_sort)
    create_folders_from_groups(path_folder_for_sort, groups_of_format)
    for file in files_names:
        for name_group, formats in groups_of_format.items():
            if file.split('.')[-1].upper() in formats:
                groups_of_files[name_group].append(file)
                set_of_formats.add(file.split('.')[-1])
            elif file.split('.')[-1].upper() not in formats:
                set_of_unknown_formats.add(file.split('.')[-1])
                set_of_unknown_formats = set_of_unknown_formats.difference(set_of_formats)
    print(groups_of_files)
    print('Known formats of files: ', set_of_formats)
    print('Unknown formats of files: ', set_of_unknown_formats)
    for file in files_paths:
        for name_group, formats in groups_of_files.items():
            if split(file)[-1] in formats:
                shutil.move(file, path_folder_for_sort + '/' + name_group)

Эта ошибка возникает при повторной обработке каталога, поскольку ранее файлы уже были перенесены в соответствующие подкаталоги.
path.rglob("*") рекурсивно сканирует каталог с подкаталогами и находит уже перенесенные файлы. Далее
shutil.move() пытается перенести найденные файлы сами в себя, что и вызывает ошибку.
Есть несколько способов избежать ошибки, некоторые из них:

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

if Path(file) != Path(path_folder_for_sort + '/' + name_group + '/' + split(file)[-1]):
    shutil.move(file, path_folder_for_sort + '/' + name_group)

обработать ошибку:

try:
    shutil.move(file, path_folder_for_sort + '/' + name_group)
except Exception as e: # или except shutil.Error as e:
    print('Не могу переместить файл сам в себя',e)


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

def forIndex(request):
    if request.method == "POST":
        newText = request.POST["file"]
        newdata = Data()
        newdata.name = newText
        print(newText)
        with open("text.txt", "w") as file:
            data = file.write(newText)
            newdata.file = data
    return render(request, "new/index.html")

Вам нужно переопределить метод
form_valid в классе представления (CBV) и добавить свою логику.

def form_valid(self, form):
    """If the form is valid, save the associated model."""
    self.object = form.save(commit=False)
    # дописать Вашу логику
    self.object.save()
    form.save_m2m()
    return super().form_valid(form)


Повторения в словарях, сложение значений повторяющихся ключей
Вводится число - кол-во вводимых пар(ключ + значение), затем сами пары.
Пример:
3
A: 35
B: 58
A: 54
Как сложить значения повторяющихся ключей? В данном случае 35 + 54
P.s. ключ и значения разделяются ": ". Я убираю это с помощью списка(.split)
Пробовал через .keys но у меня не получилось, хотя, возможно, что-то неправильно писал в вычислениях

Повторений ключей в словаре быть не может. Поэтому сложение значений производится на этапе ввода:
<code>
n = int(input("Введите количество пар: "))
res = {}
for _ in range(n):
    key, value = input().split(": ")
    if key in res:
        res[key] += int(value)
    else:
        res[key] = int(value)

print(res)

'''
Введите количество пар: 3
A: 35
B: 58
A: 54
{'A': 89, 'B': 58}
'''
</code>


Как работает атрибут query_pk_and_slug
В классе
SingleObjectMixin есть атрибут
query_pk_and_slug не очень понятно, что он делает?
Когда он равен
True подходит для такого URL
/home/<pk:pk>/<slug:slug>, а
False
/home/<pk:pk> или
/home/<slug:slug>?

Когда он равен True подходит для такого URL /home/<pk:pk>/slug:slug, а False /home/<pk:pk> или /home/slug:slug?
Ответ: Да

Если query_pk_and_slug = True, функция get_object будет искать по slug и pk
Если query_pk_and_slug = False, функция get_object будет возвращаться по pk, если в роуте найдет <:pk>, иначе будет искать по <:slug>


Вложенный цикл в шаблоне проходит только раз в Django
Я пытаюсь создать таблицу в шаблоне, используя циклы.
view.py:

def main_page(request):
    groups = CurrentGroup.objects.all();
    classes = Class.objects.all();

    numbers = [1, 2, 3, 4, 5, 6]
    times = ["8:00-9:35", "9:45-11:20", "12:20-13:55", "14:05-15:40", "16:20-17:55", "18:05-19:40"]

    data = {
        "timetable": zip(numbers, times),
        "classes": classes,
        "groups": groups
    }

    return render(request, 'index.html', context=data);

index.html (фрагмент шаблона):

{% for i in '123456'|make_list %}
{% for number, time in timetable %}
    <tr>
    <td>{{number}}</td>
    <td>{{time}}</td>
    {% for group in groups %}
    {% if group.course == 1 %}
        <td>
            <select>
            {% for class in classes %}
            {% if class.group_attitude_id == 6 %}
                <option>{{class.class_name}}</option>
            {% endif %}
            {% if group.group_attitude == class.group_attitude %}
                <option>{{class.class_name}}</option>
            {% endif %}
            {% endfor %}
            </select>
        </td>
        {% endif %}
        {% endfor %}
    </tr>
{% endfor %}
{% endfor %}

Почему-то внутренний цикл
{% for number, time in timetable %} проходит только один раз. При этом внешний цикл вполне работает и создает новые строки, если их писать до вложенного цикла. Как мне сделать так, чтобы вложенный цикл проходил все 6 раз, как и должен?

Как работают итераторы в Python? Функция zip создает итератор, который позволяет перебрать элементы один раз

"timetable": zip(numbers, times)

Вот пример

a = zip([1, 2, 3], [4, 5, 6])

print('FIRST')
for i in a:
    print(i)
print('SECOND')
for i in a:
    print(i)


Объединить несколько списков по элементам
Есть таблица, представленная в виде списка списков (на смысл не обращать внимания):

table = [['', 'Количество', 'Продано', 'Цена'],
         ['', 'элементов', 'товаров', 'товара'],
         ['Картошка', '23', '14', '34'],
         ['Лимон', '20', '10', '30'],
         ['Огурец', '35', '17', '20']]

Те списки, у которых 1 элемент пустой, являются названиями столбцов, и их нужно объединить по элементам, то есть создать список следующего вида:

['', 'Количество элементов', 'Продано товаров', 'Цена товара']

И заменить в главном списке, чтобы получить такой список в итоге:

[['', 'Количество элементов', 'Продано товаров', 'Цена товара'],
 ['Картошка', '23', '14', '34'],
 ['Лимон', '20', '10', '30'],
 ['Огурец', '35', '17', '20']]

Моя реализация

col = []
for sp in table:
    if sp[0] == '':
        col.append(sp)

Как решить данную задачу дальше не знаю

Ну можно сделать с помощью генераторов списка и zip
<code>
arr = [f'{i} {j}'for i, j in zip(*(item for item in table if item[0] == ''))]
</code>


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

def parse_folder(path):
    files = []
    for file in os.listdir(path):
        if isdir(path + '/' + file):
            parse_folder(path + '/' + file)
        files.append(file)
    print(files)

Если у нас 2 вложенные папки в указанную папку будет 3 списка:

['profiles_settings.xml']
['.gitignore', 'inspectionProfiles', 'misc.xml', 'modules.xml', 'Project_1.iml', 'workspace.xml']
['.idea', 'Imp_helb.py']

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

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

import os
from os.path import isdir

def parse_folder(path):
    files = []
    for file in os.listdir(path):
        if isdir(path + '/' + file):
            files.extend(parse_folder(path + '/' + file))
        else:
            files.append(file)

    return files

print(parse_folder("some_folder"))

А вообще, для рекурсивного обхода удобнее использовать метод
rglob объекта
Path из
pathlib:

from pathlib import Path

def parse_folder(path):
    path = Path(path)

    files = []

    for item in path.rglob("*"):
        if item.is_file():
            files.append(item.name)

    return files

print(parse_folder("some_folder"))

Также для обхода дерева директорий можно использовать функцию
os.walk, но она намного менее удобна в использовании чем метод
Path.rglob.


Рассчитать результат (профит) сделок
Есть список с вложенными словарями (сделки) необходимо рассчитать профит от сделок.
Профит должен быть рассчитан в последовательности buy -> sell -> buy -> sell... т.е. моя первая покупка(buy) 17 фьючерсов со средней 6025,41 следующая сделка продажа(sell) этих 17 фьючерсов по средней 6015,53
Цифрами:
Профит buy = 17 * (6015(sell) - 6025(buy)) итого убыток = -170.
Профит sell = 17 * (6025(buy) - 6015(sell)) итого прибыль = +170.
Поэтому в списке важно сохранить последовательность элементов.
qtyUnits = количество акции
side = направление сделки (sell - продажа, buy - покупка)
Сложность еще в том, что сначала необходимо рассчитать среднюю цену для сделки. Т.е. если обратить внимание на orderno он повторяющийся - это одна заявка, а id разные — это сделки из одной заявки, собственно для этих сделок и надо рассчитать среднюю цену(price) и общее кол-во qtyUnits
<code>
{'id': '2006663898136052343', 'orderno': '2006663898136074714', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-27T12:35:59.0000000Z', 'board': None, 'qtyUnits': 10, 'qtyBatch': 10, 'qty': 10, 'price': 6025.0, 'accruedInt': 0, 'side': 'buy', 'existing': True, 'commission': None}

{'id': '2006663898136052344', 'orderno': '2006663898136074714', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-27T12:35:59.0000000Z', 'board': None, 'qtyUnits': 7, 'qtyBatch': 7, 'qty': 7, 'price': 6026.0, 'accruedInt': 0, 'side': 'buy', 'existing': True, 'commission': None}

{'id': '2006663902431019077', 'orderno': '2006663902431021426', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-27T17:19:27.0000000Z', 'board': None, 'qtyUnits': 1, 'qtyBatch': 1, 'qty': 1, 'price': 6019.0, 'accruedInt': 0, 'side': 'sell', 'existing': True, 'commission': None}

{'id': '2006663902431019078', 'orderno': '2006663902431021426', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-27T17:19:27.0000000Z', 'board': None, 'qtyUnits': 2, 'qtyBatch': 2, 'qty': 2, 'price': 6018.0, 'accruedInt': 0, 'side': 'sell', 'existing': True, 'commission': None}

{'id': '2006663902431019079', 'orderno': '2006663902431021426', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-27T17:19:27.0000000Z', 'board': None, 'qtyUnits': 1, 'qtyBatch': 1, 'qty': 1, 'price': 6017.0, 'accruedInt': 0, 'side': 'sell', 'existing': True, 'commission': None}

{'id': '2006663902431019084', 'orderno': '2006663902431021426', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-27T17:19:27.0000000Z', 'board': None, 'qtyUnits': 3, 'qtyBatch': 3, 'qty': 3, 'price': 6016.0, 'accruedInt': 0, 'side': 'sell', 'existing': True, 'commission': None}

{'id': '2006663902431019089', 'orderno': '2006663902431021426', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-27T17:19:27.0000000Z', 'board': None, 'qtyUnits': 2, 'qtyBatch': 2, 'qty': 2, 'price': 6015.0, 'accruedInt': 0, 'side': 'sell', 'existing': True, 'commission': None}

{'id': '2006663902431019090', 'orderno': '2006663902431021426', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-27T17:19:27.0000000Z', 'board': None, 'qtyUnits': 2, 'qtyBatch': 2, 'qty': 2, 'price': 6015.0, 'accruedInt': 0, 'side': 'sell', 'existing': True, 'commission': None}

{'id': '2006663902431019091', 'orderno': '2006663902431021426', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-27T17:19:27.0000000Z', 'board': None, 'qtyUnits': 6, 'qtyBatch': 6, 'qty': 6, 'price': 6014.0, 'accruedInt': 0, 'side': 'sell', 'existing': True, 'commission': None}

{'id': '2006663902431019092', 'orderno': '2006663902431021458', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-27T17:20:01.0000000Z', 'board': None, 'qtyUnits': 6, 'qtyBatch': 6, 'qty': 6, 'price': 6017.0, 'accruedInt': 0, 'side': 'sell', 'existing': True, 'commission': None}

{'id': '2006663902431019093', 'orderno': '2006663902431021458', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-27T17:20:01.0000000Z', 'board': None, 'qtyUnits': 11, 'qtyBatch': 11, 'qty': 11, 'price': 6017.0, 'accruedInt': 0, 'side': 'sell', 'existing': True, 'commission': None}

{'id': '2006663911020954609', 'orderno': '2006663911020981710', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-30T14:05:36.0000000Z', 'board': None, 'qtyUnits': 4, 'qtyBatch': 4, 'qty': 4, 'price': 5970.0, 'accruedInt': 0, 'side': 'buy', 'existing': True, 'commission': None}

{'id': '2006663911020954610', 'orderno': '2006663911020981710', 'symbol': 'ALRS-3.23', 'brokerSymbol': 'MOEX:ALRS-3.23', 'exchange': 'MOEX', 'date': '2022-12-30T14:05:36.0000000Z', 'board': None, 'qtyUnits': 10, 'qtyBatch': 10, 'qty': 10, 'price': 5971.0, 'accruedInt': 0, 'side': 'buy', 'existing': True, 'commission': None}

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

all_deals = []

# deals - это список где все словари

date = [d['date'] for d in deals]

for dt in date:
    temp_data = []
        for dl in deals:
            if dt in dl['date']:
                temp_data.append((dl['date'], dl['side'], dl['qty'], dl['price'], dl['commission']))

    if temp_data not in all_deals:
        all_deals.append(temp_data)

for item in all_deals:
    print(item,'\n')
</code>


Как при помощи pymorphy3 перевести в родительный падеж всё предложение целиком?
Могли бы вы помочь с модулем pymorphy3? Хочу перевести в родительный падеж фразу целиком и получить "первого числа месяца", но это не работает с фразой:
<code>
spasibo = ("первое число месяца")
morph = pymorphy3.MorphAnalyzer()
one = morph.parse(spasibo)[0]
spasibo = (one.inflect({'gent'}).word)
</code>
только с отдельными словами, а как склонять предложения целиком?

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

import pymorphy3

phrase = "первое число месяца"
morph = pymorphy3.MorphAnalyzer()
result = ' '.join(morph.parse(word)[0].inflect({'gent'}).word for word in phrase.split())
print(result)

Вывод:

первого числа месяца


Перегрузка оператора += (iadd)
Что лучше возвращать из перегруженного магического метода
__iadd__: новый объект, или тот же самый, через
self?

Возвращать нужно новый объект.
Это принципиально важный момент, потому что при использовании оператора
+= (и других) с изменяемыми объектами могут возникнуть нежелательные проблемы.
Покажу наглядно, что может произойти, если мы переопределим этот оператор и все-таки будем возвращать тот же самый объект (другими словами - сделаем его изменяемым):

class SomeObj:
    def __init__(self, val):
        self.val = val

    def __iadd__(self, other):
        self.val += other.val
        return self

a = SomeObj(5)
b = SomeObj(6)
print(id(a))  # 19774544
a += b
print(id(a))  # 19774544
print(a.val)  # 11

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

a = SomeObj(5)
print(a.val)  # 5
b = a
a += SomeObj(1)
print(a.val)  # 6
print(b.val)  # 6

То увидим, что вследствие возврата того же самого объекта - в переменной
b, которая содержит ссылку на исходный объект, изменилось значение атрибута
val, не смотря на то, что к этой переменной никто не обращался, в будущем это может быть чревато различными side-эффектами.

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

class SomeObj:
    def __init__(self, val):
        self.val = val

    def __iadd__(self, other):
        return SomeObj(self.val + other.val)

a = SomeObj(5)
b = SomeObj(6)
print(id(a))  # 39177904
a += b
print(id(a))  # 39176240
print(a.val)  # 11

Заметим, что в данном случае ссылка в переменной
a теперь указывает на другой, вновь созданный объект.
Теперь убедимся, что пример с копированием ссылки отрабатывает корректно:

a = SomeObj(5)
print(a.val)  # 5
b = a
a += SomeObj(1)
print(a.val)  # 6
print(b.val)  # 5

Все правильно, значение в объекте переменной
b не изменилось, потому что в результате операции был создан новый объект.


Не могу использовать базу данных в боте телеграм. Ошибка sqlite3 [закрыт]

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

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

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

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

Пишу бота на aiogram.
Подключил базу данных и пытаюсь передать в нее значения из листа State.
Выдает ошибку AttributeError: aexit
Сначала создаю такую функцию в отдельном файле:

async def sql_add_command(state):
async with state.proxy as data:
    cur.execute('INSERT INTO menu VALUES (?,?,?,?,)', tuple(data_values()))
    base.commit()

Потом обращаюсь к ней после завершения конечных автоматов:

...
await state.update_data(name_user=message.text.title())
global user_data
user_data = await state.get_data()
**await sql_db.sql_add_command(state)**
await state.finish()

Traceback выдает AttributeError: aexit на строчку, выделенную **.

Не поставил скобочки у state.proxy()


Python API: Как достать amount из страницы
Вот код страницы, которую надо спарсить:

<html>
    <head>
        <meta name="color-scheme" content="light dark">
    </head>
    <body>
        <pre style="word-wrap: break-word; white-space: pre-wrap;">
            {"contractData":{"amount":6414680,"owner_address":"TMXSPuwvw3A1PcMB2VssrXKfF26ANzfrcj","to_address":"T9yssSMcwoSXkh4jVpXG8KPPzeAyA5WQk6"}}
        </pre>
    </body>
</html>

В
<p> есть amount и его значение, как их оттуда достать?
Вот мой код:

import requests
from bs4 import BeautifulSoup

transaction = 'тут ссылка на страницу'

response = requests.get(transaction).text
soup = BeautifulSoup(response, 'lxml')

Распарсить полученную строку как JSON и достать значение как из словаря. Псевдокод:
<code>
resAsStr = requests.get(transaction).text

resAsDict = json.loads(resAsStr)

amount = resAsDict["contractData"]["amount"]
</code>


Не компилируется файл .py в .exe
Всем привет
у меня имеется python3.10.8, библиотеки установленные:

et-xmlfile      1.1.0
numpy           1.24.1
opencv-python   4.5.4.58
openpyxl        3.0.10
pip             22.3.1
pyzbar          0.1.9
setuptools      57.0.0
wheel           0.36.2

Версия конвертора auto-py-to-exe 2.26.1
Ошибка после конвертации

Traceback (most recent call last):
  File "inventary.py", line 9, in <module>
ModuleNotFoundError: No module named 'openpyxl'

Пробовал последнюю версию opencv-python, та же ошибка, помогите пожалуйста

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


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

vacs = [{'name': 'WEB-Разработчик/программист (SEO-правки)', 'description': 'Hastra Agency ищет разработчика с опытом работы с связи с ростом отдела SEO-продвижения. Требуемый о...', 'key_skills': ['HTML', 'CSS', 'MySQL', 'PHP', 'SE']}, {.....}, {....}]
O']

Как я сделал ниже - не работает

 {% for item in vacs %}

    <div id="content" class="p-4 p-md-5 pt-5">

        <h2 class="mb-4">Последние вакансии профессии Web-разработчика</h2>
        <p>{{ item[0]['key_skills'] }}</p>

{% endfor %}

Есть такой вариант, из вашего представления передаёте переменные и указываете html файл
views.py

def update_html(request):
    var = len(parser.array_len_element)
    var_categoryes = len(parser.pagination_iteration_arr)

    return render(request, 'local.html', {'len': f'{var}', 'categoryes': f'{var_categoryes}'})

local.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {% load static %}
    <link rel="stylesheet" type="text/css" href="{% static 'bootstrap.min.css' %}">
    <link rel="stylesheet" type="text/css" href="{% static 'style.css' %}">
</head>
<body>
<p>Категорий загружено:</p>
<p id="datacategoryes">{{categoryes}}</p>
<p>Товаров загружено:</p>
{% for item in len %}

    <div id="content" class="p-4 p-md-5 pt-5">

        <h2 class="mb-4">Последние вакансии профессии Web-разработчика</h2>
        <p>{{ item[0]['key_skills'] }}</p>

{% endfor %}

</body>
</html>

далее соответственно можете уже его итерировать, в связке с js (к примеру для динамического обновления)всё то же самое, только js по триггеру ходит в ваш view и возращает json,html, и тд


Удаление символов в переменной Python [закрыт]

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

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

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

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

Как лучше реализовать удаление символов из сообщения?
Знаю, как можно удалять слова из строки, но символы из конкретного слова — без понятия.
Например, пользователь мне присылает "@user", а мне надо в формат "user".
Пишу бота для тг под aiogram.

str = "@user"
x = str.replace("@", "")
print(x)