Конвертировать дату ДД / ММ / ГГГГ в ГГ-ММ-ДД Python
Я загружаю файл, в котором хранятся даты формата ДД / ММ / ГГГГ (например 15.10.2020), каждая дата начинается с новой строки. Необходимо сделать новый новый файл на основе исходного с датами в формате ГГ-ММ-ДД.
Как можно реализовать данную задачу?

# Открываем файл с датами ДД.ММ.ГГГГ в режиме чтения
file1 = open('DD.MM.YYYY.txt','r')
# Открываем файл, куда запишем даты ГГ.ММ.ДД в режиме перезаписи
file2 = open('YY.MM.DD.txt','w')
# Получаем содержимое файла 1 и разделяем этот текст на даты
# Получившийся список дат мы перебираем
for i in file1.read().split('\n'):
    # Каждую дату мы делим ещё на дату месяц и год. После чего записываем
    # во второй файл.
    sd = i.split('.')
    file2.write(f'{sd[2][2]}{sd[2][3]}.{sd[1]}.{sd[0]}')


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

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

Для того, чтобы проверить первый элемент, надо писать

if num_list[0] == 100:
    print(2)

А как сделать так, чтобы проверить все элементы? Написать
if num_list[0,1,2,3,4,5] == 100 не получается

можно использовать
filter

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

for x in filter(lambda n:n==100, num_list):
    ...


Прохождение по кортежам в списке. python
Всем привет уже такой вопрос задавал но так и не нашел удовлетворяющий ответ.
Напишите функцию sum_of_segments, которая принимает список сегментов и возвращает сумму длин всех сегментов. Перекрытие сегментов должно учитываться только один раз. Сегменты — это пары целых чисел в формате кортежа, например: (2, 7) — это интервал от 2 до 7. Длина этого сегмента равна 5.
Список с перекрывающимися сегментами: [(2, 5), (8, 11), (4, 6)]. Сумма длин этих сегментов равна 7. Поскольку (2, 5) и (4, 6) перекрываются, мы можем рассматривать интервал как (2, 6), который имеет длину 4.
И главное функция должна работать не перегружая память если числа будут большими.
Примеры:
sum_of_segments([(1, 2), (6, 10), (11, 15)])
result is 9
sum_of_segments([(1, 4), (7, 10), (3, 5)])
result is 7
sum_of_segments([(1, 5), (10, 20), (1, 6), (16, 19), (5, 11)])
result is 19
sum_of_segments([(0, 25), (-999999999, 15), (52, 62)])
result is 100000034
<code>
fff = [(1, 17), (2, 15), (4, 14), (3, 16)]

def sum_my(segments):
    new_list = segments
    new_list_tuples = []
    for i in range(len(new_list) - 1):
        # если в списке у соседних кортежах 2е числа не равны при i+1
        if new_list[i][1] + 1 != new_list[i + 1][1]:
            # то вычесляем разницу кортежа и добавляем в новый список
            new_list_tuples.append(new_list[i][1] - new_list[i][0])
            # если равны 2е числа +1
        if new_list[i][1] + 1 == new_list[i + 1][1]:
            # и у первого кортежа первое число меньше или равно чем у второго кортежа
            if new_list[i][0] <= new_list[i + 1][0]:
                #
                new_list_tuples.append(new_list[i + 1][1] - new_list[i][0])
            else:
                new_list_tuples.append(new_list[i + 1][1] - new_list[i + 1][0])

    print(new_list)
    print(new_list_tuples)
    print(sum(new_list_tuples))
sum_my(fff)
</code>
Проблема я не могу понять как проверить на слияние если таких много в списке

Из каждого сегмента сделайте две пары
(начало; +1) и
(конец; -1). Сложите все пары в один список и отсортируйте его по первому полю.
Теперь задайте
active=0 и пройдите по списку. Для каждой пары добавляйте второе поле к
active
Если
active было 0, а стало 1, запомните позицию (
start = первое поле)
Если
active стало 0,  вычислите разность первого поля со
start и добавьте к сумме длин.
В остальных случаях ничего не делать.
Всё.


datetime64[ns] to timestamp unix (секунды)
Есть датафрейм, в котором индекс это объект
DatetimeIndex, он же формат даты
datetime64[ns]

                       A  B  C
'2022-12-14 12:00:00'  1  2  3
'2022-12-14 12:00:01'  5  6  7

Необходимо из этого индекса сделать столбец
'timestamp_s', в котором собственно будет храниться время из индексов в формате
timestamp
unix секунды.
На ум пришло грубое решение:

df['timestamp_s'] = df.index.astype('int32')
df['timestamp_s'] = df['timestamp_s'].apply(lambda x: (x / 1000000000).__int__())

Собственно, сначала переводим
datetime64[ns] в формат
int32, ну и затем каждый элемент делим на 10000000, так как после конвертации у нас получились наносекунды. Интересует вопрос, думаю что есть дефолтная функция, которая сделает конвертацию гораздо быстрее, но как она выглядит?
p.s. Данное решение занимает ~53мс, датафрейм состоит из 2млн+ строк и 4 столбцов формата
int32

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

df['timestamp_s'] = df.index.view('int64')/(10**9)

Обратите внимание на модификатор
.view(), который теперь разработчики pandas рекомендуют использовать в подобных случаях вместо
.astype().


Как преобразовать excel в json
Есть файл excel, в котором названия столбцов и сами данные могут быть как на русском, так и на английском языке, но при конвертации его в json слетает кодировка для строк на русском языке
Пример слова Наименование

\u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435"

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

import pandas
excel_data_df = pandas.read_excel('name.xlsx', sheet_name='Ex')
json_str = excel_data_df.to_json(orient='records')
print(json_str)

Добавьте кодировку UTF-8, тогда проблем с русским не должно быть:
<code>
import pandas

excel_data_df = pandas.read_excel('name.xlsx', sheet_name='Ex')
json_str = excel_data_df.to_json(orient='records', force_ascii=False)
print(json_str)
</code>


не просто можно, а нужно. к спискам в значениях можно обратиться через модификатор
str:

df["b_p"] = df["bids"].str[0]
print(df)

   lastUpdateId               bids               asks    b_p
0    1311508485   [1.662, 2249.05]    [1.663, 1020.4]  1.662
1    1311508485   [1.661, 4713.99]   [1.664, 6024.12]  1.661
2    1311508485   [1.66, 10568.12]  [1.665, 34493.35]  1.660
3    1311508485  [1.659, 18546.99]  [1.666, 18836.93]  1.659
4    1311508485  [1.658, 32589.85]   [1.667, 7370.94]  1.658

Ну и тип данных остался таким, какой нужен:

print(df.info())

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 4 columns):
 #   Column        Non-Null Count  Dtype
---  ------        --------------  -----
 0   lastUpdateId  5 non-null      int64
 1   bids          5 non-null      object
 2   asks          5 non-null      object
 3   b_p           5 non-null      float64
dtypes: float64(1), int64(1), object(2)


Проблема в том, что map() изменяются значения всего столбца, а не только значения, соответствующие указанному условию. Вы можете использовать where() метод в сочетании map(), чтобы изменять только те значения, которые соответствуют указанному условию.
Вот как вы могли бы исправить свой код:
<code>
import pandas as pd
import numpy as np

df = pd.DataFrame([[1234, 'a', 'b', 'c', 'd'],
                   [[2345, np.nan, np.nan, 'f', np.nan],
                   [2345, np.nan, np.nan, 'g', np.nan],
                   [6789, 's', 'asd', 'g', 'v']],
                  columns=['1', '2', '3', '4', '5'])

df['2'] = df['1'].where(df['1'].isin([2345, 6789]), df['1'].map({2345: '1111111111', 6789:'44444444'}))
df['3'] = df['1'].where(df['1'] == 2345, df['1'].map({2345: '2222222222'}))
df['4'] = df['1'].where(df['1'].isin([2345, 6789]), df['1'].map({2345: '3333333333', 6789: '555555555'}))

print(df)
</code>


Python - Выбор ответа пользователя, да, нет, ответ некорректный
Всем доброго дня! Столкнулся с неочевидной (для меня) проблемой работы цикла.
Программа после своей первой итерации спрашивает пользователя, играем еще раз или нет.
Возможные ответы "д" и "н", если же пользователь ввел другой символ, запрос еще раз. При первом выборе все ок, и "д" и "н" отрабатывают.
Но если выбрать сначала "д", пройти еще одну работу программы, и после выбрать "н", то программа просит ввести "н" еще несколько раз... Загадка
<code>
from random import *
answers = ["Да", "Нет"]

def new_game():
    flag = True
    while True:
        request = input('Хотите сыграть еще раз? "д" - да, "н" - нет: ')
        if request == "н":
            print('Пока-пока!')
            break
        elif request == "д":
            magicball()
        else:
            print('Не понял вашего ответа')

def magicball():
    while True:
        question = input(f"Задай же свой вопрос: ")
        answer = choice(answers)
        print(f"Мой ответ тебе: {answer}!")
        new_game()
        break
magicball()
</code>

Проблема в том, что вы вызываете ещё одну функцию
magicball(), при этом ту, которую запускаете изначально - не завершаете, поэтому после выбора варианта "нет" условие выхода не срабатывает и она продолжает работать по
while True:
Если отталкиваться конкретно от вашего кода, то самый простой вариант исправления:

elif request == "д":
    magicball()
    break


Можно ли интегрировать скомпилированные модули QT в проект на PyQT?
Чисто теоретический вопрос: передо мной стоит задача разработать графический интерфейс, в котором будет некое количество разделенных окон посредством QDockWidget. Я хотел бы реализовать его на PyQT6. И у меня возник вопрос, можно ли поместить в эти виджеты уже скомпилированные модули с графическим интерфейсом на QT, которые написаны на C++?

Чтобы использовать скомпилированный модуль C++ в PyQt, вам нужно будет использовать QtCore.QObject.connect метод для подключения сигналов и слотов модуля C ++ к вашему приложению PyQt. Это позволит вам обмениваться данными между модулем C ++ и вашим PyQt-кодом. Затем вы можете использовать этот QtWidgets.QDockWidget класс для создания разделенных окон в вашем графическом интерфейсе и добавления модуля C++ к этим виджетам.


Как поставить условие на время?
Если я поставлю условие на текущее время, то программа сработает, а если поставить условие на время, которое нужно подождать, то программа входит в бесконечное ожидание. Почему?
<code>
import time

now = time.localtime()

hour = int(input("Укажите час.\nВвод: "))
minute = int(input("Укажите минуту.\nВвод: "))

while True:
    if now.tm_hour == hour and now.tm_min == minute:
        print("Hello World!")
        break
</code>

Переменная
now задана один раз и тем самым вы сверяете одно и то же бесконечно.

import time

hour = int(input("Укажите час.\nВвод: "))
minute = int(input("Укажите минуту.\nВвод: "))

while True:
    now = time.localtime()
    if now.tm_hour == hour and now.tm_min == minute:
        print("Hello World!")
        break

Однако, лучше заместо
time.localtime использовать
datetime.now:

from datetime import datetime

hour = int(input("Укажите час.\nВвод: "))
minute = int(input("Укажите минуту.\nВвод: "))

while True:
    dt = datetime.now()
    if dt.hour == hour and dt.minute == minute:
        print("Hello World!")
        break


Как найти максимальный элемент среди списков под соответствующим номером?
Вводится натуральное число x >= 2, список списков, который состоит из x элементов по x чисел в элементе. Необходимо построить список, состоящий из x элементов, каждый из которых является максимальным среди элементов списков с соответствующим номером. Сравнивается сначала числа 2, 7, 0. 7 добавляется в список и т.д. . Пример: дан список [[2,4,12], [7,-1,11], [0,5,2]
Результат: [7,5,12]
<code>
n = int(input('Введите кол-во списков в списке: '))
my_list = []
result = []
if n >= 2:
    for _ in range(n):
        elem = [int(i) for i in input('Введите числа во вложенном списке: ').split()]
        my_list.append(elem)
    print('Исходный список: ', my_list)

else:
    print('Перебор элементов закончился')
</code>

Решить можно довольно просто:
<code>
a = [[2, 4, 12], [7, -1, 11], [0, 5, 2]]

b = [max(x) for x in zip(*a)]

print(b) # [7, 5, 12]
</code>


Как отфильтровать queryset по manytomany модели?
В двух приложениях модели с
uuid через
ManyToManyField. Надо выбрать все объекты первой модели и во второй отфильтровать только те, в которых встречается related_uuid из первой модели.
Выдает ошибку:
django.db.utils.NotSupportedError: (1235, "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'")
models apps orders

class Orders(models.Model):
    serial = models.CharField(max_length=150, blank=True, verbose_name='Серийный')
    uuid = models.ManyToManyField('RelatedUuid')

class RelatedUuid(models.Model):
    related_uuid = models.CharField(max_length=25, verbose_name='uuid', unique=True)

models apps storehouses

class StoreRelated(models.Model):
    name = models.CharField(max_length=150, blank=True, verbose_name='Склад')
    uuid = models.ManyToManyField('RelatedUuid')

class RelatedUuid(models.Model):
    related_uuid = models.CharField(max_length=25, verbose_name='uuid', unique=True)

views apps orders

from Storehouse.models import StoreRelated
queryset = Orders.objects.all()
uuid_list = queryset.values_list('uuid__related_uuid', flat=True)
print(uuid_list) # <QuerySet ['aWcSrm955DseQZXip9h9zp', 'aauegVkPk8FkGEtkr8wXaQ']>
store_queryset = StoreRelated.objects.filter(uuid__related_uuid__in=uuid_list) # тут error

что не так? как правильно отфильтровать вторую модель?

<code>
queryset = Orders.objects.all()
uuid_list = queryset.values_list('uuid__related_uuid', flat=True)
uuid_list = list(uuid_list)
print(uuid_list) # <QuerySet ['aWcSrm955DseQZXip9h9zp', 'aauegVkPk8FkGEtkr8wXaQ']>
store_queryset = StoreRelated.objects.filter(uuid__related_uuid__in=uuid_list) # тут error
</code>
Так попробуй. Джанго возвращает расширенный list, Питон не всегда его понимает


Поиск по большой csv базе на python
Есть база csv весом 1,2gb.

Надо выполнить поиск по номеру и вывести все данные желательно каждый столбец в отдельную переменную. Я сделал это таким образом:

number = input(" ")
csv_file=csv.reader(open(filename, 'r', encoding="utf8"))
for row in csv_file:
    phone, email, name = ['', '', '']
    if number in row[0]:
        phone, email, name = res
        print(name, phone, email)
        break

Это долго. Попробовал через parquet + pandas, вышло в 2 раза быстрее, но с неудобным выводом:

df = dd.read_parquet(filename)
res = df[df['phone']==79999999999].compute()
print(res)

Как я могу оптимизировать код, что бы было быстрее и нужный мне вывод?
P.S. База не будет изменяться. Возможно проще будет перевести csv таблицу в sql таблицу.

Загрузи в SQL, хотяб в sqlite. Построй индекс и будет искать за секунды.


как сделать чтобы функция возвращала наиболее часто встречающиеся номера
(Если два или более чисел встречаются одинаковое количество раз, оба значения должны быть отмечены и возвращены. ):
<code>
str_ = '9, 3, 0, 3, 9, 2, 4, 9'

def most_used_numbers(numbers):
    numbers_used = {}
    numbers_list = eval(numbers)
    print(numbers_list)

    for elem in numbers_list:
        if elem in numbers_used:
            numbers_used[elem] += 1
        else:
            numbers_used[elem] = 1
    return numbers_used

print(most_used_numbers(str_))
</code>

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

str_ = '9, 3, 0, 3, 9, 2, 4, 9'
str2_ = '3, 3, 2, 4, 9, 0'

def most_used_numbers(numbers):

        numbers_used = {}
        numbers_list = numbers.split(', ')
        biggest_num = float('-inf')
        big_nums = []

        for elem in numbers_list:
            if elem in numbers_used:
                numbers_used[elem] += 1
            else:
                numbers_used[elem] = 1

        for elem in numbers_list:
            if elem > biggest_num:
                biggest_num = elem
                big_nums = [int(elem)]
            elif elem == biggest_num:
                big_nums.append(int(elem))

        if len(big_nums) > 1:
            return big_nums
        else:
            return biggest_num

print(most_used_numbers(str_))
print(most_used_numbers(str2_))

Объяснение
Объявил доп. переменные
biggest_num (по стандарту отрицательная бесконечность) и
big_nums где будут сохраняться наши самые большие числа. Я поместил код с проверкой в отдельный цикл для читаемости, но вы смело можете переносить его в тот цикл, что был у вас ранее. В
if делается проверка на то является ли число больше чем самое большое число (по стандарту идёт проверка на то является ли число больше чем минус бесконечность), далее самым большим числом делаем число которые прошло проверку и перезаписываем имеющийся массив в переменной
big_nums чтобы в будущем стирались прошлые записанные числа. Если же элемент равняется самому большому число, то тогда добавляем его в массив больших чисел. В конце идёт проверка на длину массива, если длина массива больше чем 1 элемент, тогда вернуть массив, в противоположном случае, вернуть самое большое число.


VK API. Python. Как создать индивидуальную переменную для каждого пользователя с помощью словаря?
Я познакомился с основами Python. Решив применить знания на практике, я начал постепенно создавать простого бота для ВК с использованием VK API. Попрошу без нравоучений в роде "тебе не стоит пока сюда лезть, занимайся основами" или "сначала изучи все о API, потом что-то делай".
К сути дела: Я хочу сделать одну единственную переменную для каждого пользователя - количество поинтов. На просторах интернета предлагают использовать базы данных, но не хочу с ними связываться из-за одной переменной. Я читал, что это возможно сделать с помощью словаря (ключ, значение). Хотелось бы, чтобы словарь был вида {ID: points}. Звучит достаточно просто. Как такового примера я не нашел ни тут, ни в YouTube.
Прочитал на этом форуме предложение использовать dict.get, я попытался, но этот метод напрочь отказывается записывать ID пользователя в качестве ключа. Когда я попробовал в консоли узнать тип: print(type(points)), выдало ошибку "NameError: name 'points' is not defined". Если таким образом попытаться узнать тип любой переменной, например x, выдаст такую же ошибку. Несколько часов я лазил в интернете на различных форумах, и не нашел ответа.
При запуске кода, я пишу боту команду "/point" и консоль выводит ошибку "KeyError: (мой ID в вк)". То есть строка points.get(from_id, 0) не записывает ID пользователя в словарь и следующая строка его, соответственно, не находит.
Господа айтишники, как всё-таки достичь цели? Подчеркну ещё раз, я не вижу смысла заморачиваться с MySQL и прочими базами ради одной переменной. Создаю я этого бота больше для практики, поковыряться, ради интереса. Попрошу не критиковать.
<code>
import vk_api
from vk_api.utils import get_random_id
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
import random

session = vk_api.VkApi(token = 'не дам')
vk = session.get_api()
VkBotLongPoll = VkBotLongPoll(session, group_id=не дам)

def write_message(sender, message):
    session.method('messages.send', {'chat_id': sender, 'message': message, 'random_id': get_random_id()})

def get_name(from_id):
    sender_info = vk.users.get(user_ids = from_id)[0]
    full_name = sender_info.get('first_name') + ' ' + sender_info['last_name']
    return full_name

points = {}

for event in VkBotLongPoll.listen():
    if event.type == VkBotEventType.MESSAGE_NEW and event.from_chat and event.message.get('text') !='':
        msg = event.message.get('text').lower()
        sender = event.chat_id
        from_id = event.message.get('from_id')
        name = get_name(from_id)
        if msg == '/point':
            x = random.randint(1, 10)
            points.get(from_id, 0)
            points[from_id] += x
            write_message(sender, name + ', ' + f'you have earned {x} points')
</code>

Когда я попробовал в консоли узнать тип: print(type(points)), выдало ошибку "NameError: name 'points' is not defined".

Подозреваю, что функция type() вызывалась в Python Console в IDE, соответственно, в консоли переменные были не инициализированы , это и приводило к исключению. Если вызвать print(type(points)) в теле кода, либо же в режиме дебаггера - она должна вернуть <class 'dict'> , т.к в коде переменная points инициализирована как пустой словарь.

строка points.get(from_id, 0) не записывает ID пользователя в словарь и следующая строка его, соответственно, не находит.

Метод словаря get() не перезаписывает значение в существующем словаре, а лишь только возвращает значение по переданному ключу в качестве аргумента.
Таким образом строка
points[from_id] += x вызовет эксепшн KeyError (если бы она была с = , вместо += - тогда бы создала новый ключ с id from_id)
В данном случае, не совсем понятна структура словаря. Зачем делать ключ fromId в словаре points?  Если уж это должна быть импровизированная БД ) Скорее, здесь будет смысл считать переменную points как название таблицы (словаря с таблицей), а внутри хранить значения в виде ключ (id юзера) и значение (кол-во очков юзера).
Таким образом:

points = {}

points[999] = 1

print(points[999])

Я присвоил юзеру с id 999 значение 1.
Вы же , сначала берете несуществующее значение (думая что оно туда запишется), далее
points.get(from_id, 0) из словаря, при этом еще используя += делаете это:
points[from_id] += x
(то ли присвоить, то ли хотите инкрементировать значение по несуществующему ключу - не понял).

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

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


Удаление элементов из вложенных список
сталкнулся с тем, что есть необходимость удалять определенные элементы из отдельного подсписка главного списка. И казалось бы, в чем проблема, берем remove и полетели, но вся беда в том, что в подсписках списка элемнты могут совпадать и remove удалит и их. Что делать? Как удалить конкретный элемент подсписка главного списка, если он может быть и в других подсписках списка?
<code>
for i in range(len(text)):
        newMassiv = []
        for j in range(len(text)):
            newMassiv.append((random.choice(SubMassive[i])))
            SubMassive[i].remove(newMassiv[j])
        massive.append(newMassiv)
</code>

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

# Создайте новый список, содержащий только те элементы, которые мы хотим сохранить
filtered_list = filter(lambda x: x not in SubMassive[i], text)

# Добавьте отфильтрованный список в основной список
massive.extend(filtered_list)

В качестве альтернативы вы могли бы использовать цикл for для перебора элементов в подсписке и использовать ключевое слово del для удаления каждого элемента из основного списка. Этот подход потенциально может вызвать проблемы, если один и тот же элемент появляется в нескольких подсписках, но он может быть более эффективным, чем использование метода фильтрации, если у вас есть только небольшое количество элементов для удаления.
Вот пример того, как этот подход мог бы работать:

# Используйте цикл for для перебора элементов в подсписке
for element in SubMassive[i]:
    # Используйте ключевое слово del, чтобы удалить каждый элемент из основного списка
    del text[element]

# Добавьте остальные элементы из основного списка в новый список
massive.extend(text)


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

>>>c = Cipher('orange')
>>>c.alphabet

O R A N G E B C D F H I J K L M P Q S T U V W X Y Z

>>>c.encode('Hello World')
"Btggj vjmgp"

>>>c.decode("Fjedhc dn atidsn")
"Kojima is genius"

Мой код:

import string

class Cipher:
    def __init__(self, name):
        alphabet = list(string.ascii_uppercase)
        self.x = list(name.upper())
        for j in self.x:
            alphabet.remove(j)
        self.x.extend(alphabet)
        self.alp = ''.join(i for i in self.x)

    def encode(self, data):
        alphabet = string.ascii_uppercase
        x = data.upper().split()
        ind =[]
        d = []
        for i in range(0, len(x)):
            z = []
            for j in x[i]:
                z.append(alphabet.index(j))
                if x[i].index(j) == len(x[i]) - 1:
                    ind.append(z)
        for i in range(0, len(ind)):
            s1 = ''
            for j in ind[i]:
                s1 += self.alp[j]
                if ind[i].index(j) == len(x[i]) - 1:
                    d.append(s1)
        return ' '.join(i for i in d)

    def decode(self, data):
        alphabet = string.ascii_uppercase
        x = data.upper().split()
        ind = []
        d = []
        for i in range(0, len(x)):
            z = []
            for j in x[i]:
                z.append(self.alp.index(j))
                if x[i].index(j) == len(x[i]) - 1:
                    ind.append(z)
        for i in range(0, len(ind)):
            s1 = ''
            for j in ind[i]:
                s1 += alphabet[j]
                if ind[i].index(j) == len(x[i]) - 1:
                    d.append(s1)
        return ' '.join(i for i in d)

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

Вариантов решения вашей проблемы достаточно много.
Приведу два самых очевидных:

Хранить алфавит в двух вариациях: верхнем и нижнем регистре

self.alphabet += self.alphabet.lower()
В итоге из
ORANGEBCDFHIJKLMPQSTUVWXYZ получаем
ORANGEBCDFHIJKLMPQSTUVWXYZorangebcdfhijklmpqstuvwxyz
Для кодирования/декодирования вам будет необходимо сравнивать не с исходным алфавитом
ascii_uppercase(), а с таким же расширенным:
alphabet += alphabet.lower(), исходный текст трогать не нужно.

При преобразовании учитывать исходный регистр символа
Если символ в исходной строке был в нижнем регистре:
x[i].islower(), то добавлять к результату
alphabet[i].lower(), и наоборот при помощи метода
x[i].isupper() и
alphabet[i].upper()


Как задать условие if?
Извиняюсь за такой вопрос. Буду рад помощи и пойду спать...
Приведу пример.
Есть 5 продавцов орехов.
Количество орехов у продавцов:

Первый: 1000
Второй: 85000
Третий: 56000
Четвертый: 31000
Пятый: 16000

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

Первый: от 500 до 1000
Второй: от 5000 до 85000
Третий: от 3000 до 56000
Четвертый: от 10000 до 31000
Пятый: от 4000 до 16000

То есть у нас есть такие условия для каждого продавца:

Первый: min = 500; max = 1000
Второй: min = 5000; max = 85000
Третий: min = 3000; max = 56000
Четвертый: min = 10000; max = 31000
Пятый: min = 4000; max = 16000

Теперь нужно вывести только тех продавцов, которые готовы продать 5000 или больше орехов.
Соответственно, получается условие:

Если min >= 5000: Вывести 'Номер продавца'

Что даст нам такой вывод:

Второй

Всё верно. НО. Третий и пятый продавцы тоже могут продать 5000 орехов или больше. Просто в из их объявлений в переменную min попадает другое количество, которое не соответствует условию. Так вот вопрос: как задать условие при котором выведутся все продавцы, у которых можно купить 5000 или больше орехов? То есть вот так:

Второй
Третий
Пятый

Тут нужно комплексное условие с использованием
and:

seller = [
  [500, 1000],
  [5000, 85000],
  [3000, 56000],
  [10000, 31000],
  [4000, 16000]
]

for i, [min, max] in enumerate(seller):
  if (min <= 5000 and max >= 5000):
    print(f'{i+1} продавец:', min, max)

Вывод:

2 продавец: 5000 85000
3 продавец: 3000 56000
5 продавец: 4000 16000


Как найти наиболее похожий столбец по двум критериям
У меня есть двумерный массив и два значения. Как найти столбец, который был бы ближе остальных по a и b?
<code>
a = 5
b = 24000

m = [[4.5, 5.3, 4.2, 5.7, 5],
     [25000, 23000, 22000, 27000, 13000]]
</code>

можно попробовать искать по минимальной сумме относительных отклонений, чтобы выровнять влияние больших и маленьких значений
<code>
import numpy as np

a = 5
b = 24000
aim = np.array([a,b]).reshape(2,-1)

m = np.array([[4.5, 5.3, 4.2, 5.7, 5],
     [25000, 23000, 22000, 27000, 13000]])

idx = np.sum(np.abs(m-aim) / m, axis=0).argmin()

print(m[:,idx])   # [5.3e+00 2.3e+04]
</code>


Создать функцию по значению переменной
Допустим, у меня есть переменная
func_name = 'qwerty'.
Мне нужно сделать:

def qwerty():

Используя переменную
func_name.

вообще, это выглядит как ошибка проектирования, но можно использовать такой "ужасный" код, сохранив в переменную заранее заготовленный шаблон функции
<code>
def template(a):
    print(a)

func_name = 'qwerty'

globals()[func_name] = template

qwerty(25)
</code>


как получить текст пересланного сообщения aiogram python
я переслал боту сообщение, как сделать так, что бы он достал текст из сообщения, которое я переслал ему?

В этом примере функция handle_forwarded_message представляет собой обработчик сообщений, который запускается всякий раз, когда сообщение пересылается боту. Атрибут is_forwarded декоратора message_handler гарантирует, что обработчик вызывается только для переадресованных сообщений.
<code>
@dp.message_handler(is_forwarded=True)
async def handle_forwarded_message(message: types.Message):
    text = message.text  # получите текст исходного сообщения, которое было переслано
</code>


Не знаю как можно оптимизировать данный код, он очень сильно нагружает пк и работает медленно
Я еще новичок, так что приму критику. Переменные x, x1, y, y1 это координаты положения курсора мыши. Я сравниваю их для определения движения мыши. Я думаю что сильно нагружает именно цикл while, но я не знаю как от него избавится. Сравнение координат должно происходить только при зажатой клавише "CTRL".
вот мой код:
<code>
import pyperclip
import pyautogui as pg
import time
import keyboard as kb
from googletrans import Translator

def copy_clipboard():
    pg.hotkey('CTRL', 'C')
    time.sleep(0.5)  # ctrl-c is usually very fast but your program may execute faster
    return pyperclip.paste()

def translate():
    time.sleep(3)
    translator = Translator()
    con = copy_clipboard()
    result = translator.translate(str(con), src='ru', dest='en')
    cont = result.text
    print(cont)
    pyperclip.copy(cont)

while True:
    a = 1
    x, y = 0, 0
    while kb.is_pressed('CTRL'):
        if a == 1:
            a = 0
            continue
        x1, y1 = x, y
        x, y = pg.position()
        if x != x1 or y != y1:
            if abs(x-x1) >= 100:
                if x-x1 > 0:
                    if x != 0 and x1 != 0:
                        translate()
                else:
                    if x != 0 and x1 != 0:
                        print('Движение влево')
                        print(x, x1)
            elif abs(y-y1) >= 100:
                if y-y1 > 0:
                    if y != 0 and y1 != 0:
                        print('Движение вниз')
                        print(y, y1)
                else:
                    if y != 0 and y1 != 0:
                        print('Движение вверх')
                        print(y, y1)
        time.sleep(1)

</code>

time.sleep всегда ставить в начало цикла на случай попадания continue(полагаю в этом и проблемма), во втором цикле так же исспользовать sleep, значения которого должны быть 0.1 тк одна секунда слишком большое время.
Изменить подход- исспользовать модуль pynput, который будет вызывать функцию при нажатии и отпускании клавиш, а не впадать в цикл.  То есть цикл не нужен, нужно вызывать функцию при нажатии контрл, которая сохраняет координаты; нужно вызывать вторую функцию при отпускании контрл которая и выполнит основную задачу.


Как остановить бесконечный цикл командой стоп, которую пишет пользователь в чате телеграм бота? Python
Есть многопользовательский телеграм бот, который по команде запускает парсинг объявлений с сайта. Вызывается функция
start_parsing, запускается цикл
While True. При получении в чате команды
стоп, хендлер ловит команду и вызывается функция
stop_parsing, которая должна остановить работу бесконечного цикла

@dp.message_handler(Text(equals="start"))
async def start_parsing(message: types.Message):
    await bot.send_message(chat_id=message.from_user.id, text="парсинг запущен")
    while True:
        #тут код с парсингом

@dp.message_handler(Text(equals="stop"))
async def stop_parsing(message: types.Message):
    #тут код, который останавливает цикл While True из функции "start_parsing"
    await bot.send_message(chat_id=message.from_user.id, text="парсинг остановлен")

Частично проблема решилась созданием глобальной переменной
parsing_continue. Цикл
While при каждой итерации проверяет, что она равна
True. А по команде стоп в функции
stop_parsing эта переменная становится
False.
Но это работает только для 1 пользователя. Когда их несколько, команда стоп тормозит парсер всех других пользователей, т.к. переменная глобальная

global parsing_continue

@dp.message_handler(Text(equals="start"))
async def start_parsing(message: types.Message):
    await bot.send_message(chat_id=message.from_user.id, text="парсинг запущен")
    global parsing_continue
    parsing_continue = True
    while parsing_continue:
        #тут код с парсингом

@dp.message_handler(Text(equals="stop"))
async def stop_parsing(message: types.Message):
    global parsing_continue
    parsing_continue = False
    await bot.send_message(chat_id=message.from_user.id, text="парсинг остановлен")

Возможно, в варианте с глобальной переменной поможет словарь, в котором ключом будут динамически создаваемые переменные
parsing_continue, привязанные к id пользователя.
Или существует более подходящая конструкция, чем блокирующий цикл While True.
Может можно как-то создать задачу, которая будет активироваться при старте, и сниматься при стопе.
Сам в питоне новичок, с языком знаком по библиотеке aiogram для ботов. Нагуглил варианты с событийными циклами, creating task, event-loop и тд... Пока не разобрался, это то что нужно, или нет. Подозреваю, что это целая тема для изучения.
Буду благодарен если подскажите куда вообще копать

Записывайте
parsing_continue в хранилище стейта.

from aiogram.dispatcher import FSMContext
from aiogram.contrib.fsm_storage.memory import MemoryStorage

dp = Dispatcher(bot, storage=MemoryStorage())

@dp.message_handler(Text(equals="start"))
async def start_parsing(message: types.Message, state: FSMContext):
    await bot.send_message(chat_id=message.from_user.id, text="парсинг запущен")
    # записываете в хранилище
    await state.update_data({"parsing_continue": True})
    # обязательно чтобы делалось именно так, не нужно это в переменную записывать
    while (await state.get_data()).get("parsing_continue"):
        print(1)
        await asyncio.sleep(5)

@dp.message_handler(Text(equals="stop"))
async def stop_parsing(message: types.Message, state: FSMContext):
    # просто обновляем данные
    await state.update_data({"parsing_continue": False})
    await bot.send_message(chat_id=message.from_user.id, text="парсинг остановлен")


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

data_1 ... data_n

программа искала индекс строки и имя столбца каждого элемента в таблице и выводила его в формате

data_1 - (index, column_name)
...
data_1 - (index, column_name)
data_2 - (index, column_name)
...
data_2 - (index, column_name)
...
data_n - (index, column_name)

Например, дан датафрейм:

        module_name version   python
   0    Pandas      1.3.5     3.7
   1    SciKitLearn 1.0       3.7
   2    SeaBorn     0.11.2    3.7
   3    NumPy       1.23.dev0 3.7

Также дана строка с данными для поиска:

Pandas 0.11.2 3.7

на выходе должно получится:

Pandas - (0, module_name)
0.11.2 - (2, version)
3.7 - (0, python)
3.7 - (1, python)
3.7 - (2, python)
3.7 - (3, python)

Мой код:

import pandas as pd
n=int(input())
d={}
for _ in range(n):
    temp=input().split()
    d[temp.pop(0)]=temp
df=pd.DataFrame(d)
my_list=input().split()
for i in df.columns.values:
    for j in df[i]:
        for k in my_list:
            if k==j:
                print(j, '-', f'({df[df[i] == j].index[0]},{i})')

Из него получается так:

Pandas - (0,module_name)
0.11.2 - (2,version)
3.7 - (0,python)
3.7 - (0,python)
3.7 - (0,python)
3.7 - (0,python)

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

Что-то вы городите циклы прям один на другом.
попробуйте так, например:

for i in ["Pandas", "0.11.2", 3.7]:
    res = df[df==i].stack().index.values
    for j in res:
        print(f"{i} - {j}")

на выходе:

Pandas - (0, 'module_name')
0.11.2 - (2, 'version')
3.7 - (0, 'python')
3.7 - (1, 'python')
3.7 - (2, 'python')
3.7 - (3, 'python')


TypeError: argument of type 'Guild' is not iterable
Нужно сделать проверку при вступлении на сервер, есть ли человек на другом дискорд сервере - получить его роли - если есть определённая роль - выдать ему здесь отдельную роль
<code>
channel = bot.get_channel(989555562377277551)
    role = discord.utils.get(member.guild.roles, id = 968234676152074240)
    guildlmq = bot.get_guild(1033138116153835580)
    rolemq = discord.utils.get(guildlmq.roles, id=1033138116191596680)
    mqfamq = discord.utils.get(member.guild.roles, id = 1033829865859862588)
    if member in guildlmq and rolemq in member.guildlmq.roles:
        await member.add_roles(mqfamq)
        await channel.send(f'<@{member.id}>\n1')
    else:
        await member.add_roles(role)
        await channel.send(f'<@{member.id}>\n2')
</code>

Есть более простой вариант.
Создаем ивент:

@client.event
async def on_member_join(member):

Далее просто выдаем пользователю роль по айди:

    role1 = discord.utils.get(member.guild.roles, id = roleid)
    role2 = discord.utils.get(member.guild.roles, id = roleid)
    await member.add_roles(role1, role2)

Можно проверить является ли вступивший ботом:

    if not member.bot:

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

    if member.guild.id == 'guildid':

Полный код:

@client.event
async def on_member_join(member):
    if not member.bot:
        if member.guild.id == 'guildid':
            role1 = discord.utils.get(member.guild.roles, id = roleid)
            role2 = discord.utils.get(member.guild.roles, id = roleid)
            await member.add_roles(role1, role2)


Задачка на количество сочетаний
Условие
Вася пришёл на образовательный семинар и обнаружил, что зрителей на мероприятии — NN, а количество мест — MM.
Помогите Васе определить вероятность того, что он попадёт на семинар.
Формат вывода
Два числа N и M.
Формат вывода
Два числа — количество вариантов, в которых Вася попадает на семинар и количество всех вариантов групп на семинаре.
Примечание
В первом примере обозначим участников числами 1, 2, 3. Предположим, что 1 — это Вася.
Тогда все вариации участников выглядят так:

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

А благополучными из них для Васи являются только 3:

1 2
1 3
1 4

Пример 1
Ввод: 4 2 Вывод: 3 6
Пример 2
Ввод: 10 3 Вывод: 36 120
Задачка из яндекс практикума. Мой код проходит 7 тестов, на 8 получает неправильный ответ. Какие именно там тесты неизвестно. Как можно сделать иначе? Я что-то упустил или не понял

import math

n, m = map(int, input().split())
k = math.comb(n, m)
print(int(k / n * m), k)


Изменение значений в DataFrame
Есть некий DataFrame, представленный ниже:

     name   version  year
  0  Python 2      1999
  1  Java   SE8    2010
  2  PHP    8      2015

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

0 year 2000
1 year 2014
2 version 7

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

     name   version year
  0  Python 2       2000
  1  Java   SE8     2014
  2  PHP    7       2015

в общем случае решения можно свести к циклу по совету @CrazyElf:

for i in df2.itertuples():
    df1.loc[i[0], i[1]] = i[2]

df1:

     name version  year
0  Python       2  2008
1    Java     SE8  2014
2     PHP       7  2015

UPDATE
Вот что-то такое, более-менее векторное:

dummies = pd.get_dummies(df2,prefix='', prefix_sep='', dtype=bool)
t = dummies.multiply(dummies[1], axis=0).drop(columns=[1]).replace(0, np.nan)
df1.update(t.fillna(df1))

df1, понятно, будет

     name version    year
0  Python       2  2008.0
1    Java     SE8  2014.0
2     PHP     7.0    2015


Объединение нескольких DataFrame
Не получается объединить датафреймы представленные ниже. Изначальный датафрейм
df спарсил из xml. Остальные находятся в таблицах Excel. Нужно объединить их с условиями, что определенный номер счета означает определенные виды расходов и доходов, а отдел соответствует департаменту. При этом доход должен быть положительным числом, а расход отрицательным. DataFrame
df_finally это нужный конечный результат. Спасибо всем за ответы заранее )

import pandas as pd

df = pd.DataFrame([['123', 'ФАКТ', '2022','Январь', 100, 'Бухгалтерия', 'Выплата зарплаты'],
                   ['456', 'ФАКТ', '2022','Январь', 200, 'Склад', 'Списание'],
                   ['789', 'ФАКТ', '2022','Январь', 300, 'Отдел продаж', 'Продажи']],
                   columns=['Счет', 'Вид', 'Год', 'Месяц', 'Сумма', 'Отдел', 'Статья'])
df_info = pd.DataFrame([['123', 'Расходы', 'Основные расходы'],
                        ['789', 'Доходы', 'Доход от продажи'],
                        ['111', 'Расходы', 'Операц расходы'],
                        ['456', 'Расходы', 'Списания и возвраты']],
                        columns=['Счет', 'Статья_01', 'Статья_02'])

df_info_departments = pd.DataFrame([['Бухгалтерия', 'Финансовый'],
                                  ['Отдел продаж', 'Коммерческий'],
                                  ['Склад', 'Логистики']],
                                  columns=['Отдел', 'Департамент'])

df_info_st = pd.DataFrame([['Выплата зарплаты', 'ФОНД ЗП'],
                           ['Списание', 'Расходы'],
                           ['Продажи', 'Доходы']],
                           columns=['Статья', 'Статья_03'])
df_finally = pd.DataFrame([['123', 'ФАКТ', '2022','Январь', 'Расходы', 'Основные расходы', 'ФОНД ЗП',100,
                            'Бухгалтерия', 'Выплата зарплаты', 'Финансовый'],
                           ['456', 'ФАКТ', '2022','Январь', 'Расходы', 'Списания и возвраты', 'Расходы',200,
                            'Склад', 'Списание', 'Логистики'],
                           ['789', 'ФАКТ', '2022','Январь', 'Доходы', 'Доход от продажи', 'Доходы', 300,
                            'Отдел продаж', 'Продажи', 'Коммерческий']],
                          columns=['Счет', 'Вид', 'Год', 'Месяц', 'Статья_01', 'Статья_02', 'Статья_03', 'Сумма',
                                   'Отдел', 'Статья', 'Департамент'])
print(df, '\n', df_info, '\n', df_info_departments, '\n', df_info_st, '\n', df_finally)

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

rres = df.merge(df_info, on="Счет").merge(
    df_info_departments, on="Отдел").merge(
    df_info_st, on="Статья")

res:

  Счет   Вид   Год   Месяц  Сумма         Отдел            Статья Статья_01            Статья_02   Департамент Статья_03
0  123  ФАКТ  2022  Январь    100   Бухгалтерия  Выплата зарплаты   Расходы     Основные расходы    Финансовый   ФОНД ЗП
1  456  ФАКТ  2022  Январь    200         Склад          Списание   Расходы  Списания и возвраты     Логистики   Расходы
2  789  ФАКТ  2022  Январь    300  Отдел продаж           Продажи    Доходы     Доход от продажи  Коммерческий    Доходы


Запуск python файла через bat-ник с подключением библиотек
Мой проект был написан в Pycharm, а следовательно виртуальное пространство было создано автоматический (vevn). Основной рабочий файл main.py, а библиотеки, которые я использую PyQt5 и requests.
Я накидал такой код в bat-нике:

@echo off
%~dp0vevn\Scripts\activate.bat
python %~dp0main.py
%~dp0vevn\Scripts\deactivate.bat

В теории он должен был работать. активирую виртуалку по абсолютному пути, запускаю main.py, и после деактивирую виртуалку.
После запуска от имени админа, на мгновение открывается консоль, но ничего не происходит. Через pause, понял, что строка
python %~dp0main.py не работает.
Вопрос: почему и как это исправить?

Чтобы сработало Ваше решение, необходимо вызывать bat файл через call. Простой запуск bat файла - создаётся свой контекст:
<code>
@echo off
call %~dp0vevn\Scripts\activate.bat
python %~dp0main.py
call %~dp0vevn\Scripts\deactivate.bat
</code>
Вывод для моего случая:
Microsoft Windows [Version 10.0.19044.2251]
(c) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.
C:\Projects\QT\taskWinUI>b.bat
C:\Projects\QT\taskWinUI>echo C:\Projects\QT\taskWinUI
C:\Projects\QT\taskWinUI\
C:\Projects\QT\taskWinUI>call C:\Projects\QT\taskWinUI\Scripts\activate.bat
Being destroyed
(taskWinUI) C:\Projects\QT\taskWinUI>
^^^^^^^^- указывет нам, что venv запустился


Aiogram не правильно обрабатывает сообщение от пользователя
Начал изучать Aiogram, хочу сделать очень простого бота, который генерил бы 2 числа a,b от -100 до 100 и присылал бы a*b, от пользователя ожидал бы правильный ответ.
<code>
a = random.randrange(-100, 100)
b = random.randrange(-100, 100)
@dp.message_handler(commands=['math_task'])
async def math_task(message:types.Message):
    await bot.send_message(message.from_user.id,
                            text='Начинаем')

    await message.answer(text=('Перемножить',a,b))

@dp.message_handler()
async def math_task(message:types.Message):
    c = a * b
    if message.text==c:
        await message.answer("YES")
    else:
        await message.answer('NO')
</code>
бот реагирует на любой ответ пользователя NO.
пробовал message.text==c заменить message.text in c.
В чем может быть ошибка?

надеюсь ответ устроит ( в данном случае это бесконечный цикл)

a = random.randrange(-100, 100)
b = random.randrange(-100, 100)
@dp.message_handler(commands=['math_task'])
async def math_task(message:types.Message):
    await bot.send_message(message.from_user.id,text='Начинаем')

    await message.answer(text=f'Перемножить {a}, {b}')

@dp.message_handler()
async def math_task(message:types.Message):
    global a,b
    c = a * b
    if str(message.text)==str(c):
        await message.answer("Правильно")
        a = random.randrange(-100, 100)
        b = random.randrange(-100, 100)
        await message.answer(text=f'Перемножить {a}, {b}')
        math_task
    else:
        await message.answer('Неправильно, пробуй еще.')

executor.start_polling(dp)

но можно запихнуть в цикл for или while (например)

for a in range(5): #или while something:
    @dp.message_handler()
    async def math_task(message: types.Message):
        global a, b
        c = a * b
        if str(message.text) == str(c):
            await message.answer("Правильно")
            a = random.randrange(-100, 100)
            b = random.randrange(-100, 100)
            await message.answer(text=f'Перемножить {a}, {b}')
        else:
            await message.answer('Неправильно, пробуй еще.')


Сортировка объектов datetime в python
Задача заключается в подсчете времени, в которое горит лампочка, пока за ней смотрит наблюдатель. Из входных данных - отрезки включения и выключения лампочки, а также время наблюдения. Код выглядит так (знаю, громоздко):

from datetime import datetime
from typing import List, Optional

def sum_light(els: List[datetime],
              start_watching: Optional[datetime] = None,
              end_watching: Optional[datetime] = None) -> int:
    if start_watching is None:
        start_watching = els[0]
    if end_watching is None:
        end_watching = datetime.max
    els = sorted(els + [start_watching] + [end_watching])
    start = els.index(start_watching)
    end = els.index(end_watching)
    if start_watching is not None and end_watching is None:
        return int(sum((on - off).total_seconds() for off, on in
                   zip(els[start + (start % 2 == 0)::2], els[start + (start % 2 == 0) + 1::2])))
    elif start_watching is None and end_watching is not None:
        return int(sum((on - off).total_seconds() for off, on in
                   zip(els[:end + 1:2], els[1:end + 1:2])))
    elif start_watching is not None and end_watching is not None:
        return int(sum((on - off).total_seconds() for off, on in
                   zip(els[start + (start % 2 == 0):end + 1:2], els[start + (start % 2 == 0) + 1:end + 1:2])))
    else:
        return int(sum((on - off).total_seconds() for off, on in
                   zip(els[::2], els[1::2])))

if __name__ == "__main__":
    print("Example:")
    print(
          sum_light(
                    [
                      datetime(2015, 1, 12, 10, 0, 0),
                      datetime(2015, 1, 12, 10, 0, 10),
                    ],
                    datetime(2015, 1, 12, 10, 0, 0),
                    datetime(2015, 1, 12, 10, 0, 10),
                   )
         )

Следующий этап задачи - несколько лампочек (к входным данным добавляется номер лампочки, и теперь это объекты типа Tuple[datetime, int]. В коде могут быть как объекты tuple, так и просто объекты datetime, которые должны пониматься как первая лампочка (без индекса)).Код такой:

def sum_light(
              els: List[Union[datetime, Tuple[datetime, int]]],
              start_watching: Optional[datetime] = None,
              end_watching: Optional[datetime] = None) -> int:
    if start_watching is None:
        start_watching = els[0]
    if end_watching is None:
        end_watching = datetime.max
    els = [(elem, 1) if type(elem) is datetime else elem for elem in els] # Здесь привожу все элементы к общему виду
    els = sorted(els + [start_watching] + [end_watching], key=lambda x: (x[0], x[1]))

Но теперь, когда я пытаюсь отсортировать список по объекту
datetime и индексу, интерпретатор ругается:

els = sorted(els, key=lambda x: x[0])

TypeError: 'datetime.datetime' object is not subscriptable

Почему в первом случае код спокойно отсортировал список по
datetime, а во втором выскакивает ошибка?

Досконально изучив возможности сортировки, понял, что кортежи можно отсортировать с помощью модуля operator. Задав оператору itemgetter() второй объект кортежа, а именно число (в моем случае номер лампочки), я смог отсортировать список так, чтобы включение и выключение каждой лампочки шло друг за другом, что дает мне возможность узнать время работы лампочки, поочередно вычитая время выключения из времени включения с помощью zip.


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

Напишите функцию find_lines_len_more_6, которая принимает имя файла и
находит количество строк, превышающее 6 символов. Не забывайте
исключать знак переноса на новую строку, стоящий в конце строки.
Функция find_lines_len_more_6 должна возвращать найденное количество
строк

подскажите пожалуйста где и в чем ошибка в написанном мной коде:
<code>
def find_lines_len_more_6(file_name:str) -> int:
    with open(file_name, 'r') as f:
        file_name = file_name.split('\n')
        return sum(1 for line in file_name if len(line)>6)+1
</code>
пробовала убирать +1 в возвращаемом значении, код все равно не проходит на решение

Ошибок в вашем коде две:

file_name = file_name.split('\n') - после открытия файла на чтение вы не читаете содержимое файла при помощи функции
read(), а начинаете парсить его название

sum(1 for line in file_name if len(line)>6)+1 - +1 в конце совершенно ни к чему.

Если исправить, то получается рабочий код:

def find_lines_len_more_6(file_name: str) -> int:
    with open(file_name, 'r') as f:
        lines = f.read().splitlines()
        return sum(1 for line in lines if len(line) > 6)

print(find_lines_len_more_6('test.txt')) # 2

test.txt

123456
1234567
12345
12345678

Как верно написали в комментариях для разбития файла на строки лучше использовать функцию
str.splitlines(), поскольку для разделения в ней используется не только символ переноса строки
\n, но и другие.


Задача на умножение матриц с использованием NumPy
Всем привет, изучаю возможности NumPy. Не пойму, правда, тут моя математика просела окончательно или понимание Python.
Введите через пробел 16 чисел, создайте из них вектор. Преобразуйте вектор в матрицу А размера 4 на 4 любым способом. Найдите натуральное число x из диапазона [1, 9], для которого матрица вида
x 0 0 0
0 x 0 0
0 0 x 0
0 0 0 x
при умножении на матрицу A увеличит всё её элементы в 3 раза. Выведите на экран произведение матриц.
Мое начало кода:

import numpy as np

data=input('Enter 16 numbers using space: ')
lst=list(map(int, data.split(' ')))

a=np.array(lst).reshape(4,4)
b=a*3

Дальше думала сделать что-то вроде деления матриц, но запуталась + в ответе матрица далеко не диагональная получается:

from numpy.linalg import inv
b_inv=inv(b)

c=a*b_inv
print(c)

Помогите разобраться, пожалуйста)

Значение x отыскивается в уме и не зависит от другой матрицы. Оператор
* в
NumPy означает поэлементное умножение массивов. Вам нужен оператор
@.

import numpy as np

a = np.array(range(16)).reshape(4, 4)
print(a)

b = 3 * np.eye(4)
print(b)

c = a @ b
print(c)

$ python matrices.py
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
[[3. 0. 0. 0.]
 [0. 3. 0. 0.]
 [0. 0. 3. 0.]
 [0. 0. 0. 3.]]
[[ 0.  3.  6.  9.]
 [12. 15. 18. 21.]
 [24. 27. 30. 33.]
 [36. 39. 42. 45.]]


Проблема аргумента ctx discord.py
Пишу бота используя
disnake и столкнулся с вопросом. Ниже две почти аналогичные функции:

@bot.slash_command(description='Очищает данное количесво сообщений.')
async def clear(ctx, reason: int = commands.Param(name="number_of_messages_to_clear")):    #slash-command clear
    print(ctx)
    await check_moderator_role(сtx=ctx)
    await ctx.channel.purge(limit=int(reason))
    await ctx.response.send_message(embed=disnake.Embed(description=f'**{reason} сообщений(e) удалено!** :white_check_mark:'), delete_after=60)

@bot.command()
async def clear(ctx, reason):    #unslash-command clear
    print(ctx)
    await check_moderator_role(ctx=ctx)
    await ctx.channel.purge(limit=int(reason))
    await ctx.send(embed=disnake.Embed(description=f'**{reason} сообщений(е) удалено!** :white_check_mark:'), delete_after=60)

В них прописаны две команды, обычная команда работает, слэш - нет.
Ошибка как я уже точно определил во второй строке функции, а именно в её аргументе -
await check_moderator_role(ctx=ctx)

check_moderator_role(ctx) - моя сам описная функция, знать что в ней находится не обязательно, сама она рабочая, проблема с её аргументом.
Я выяснил, что аргумент
ctx в разных функциях почему - то разный, в слеш - команде он равен:
<disnake.interactions.application_command.ApplicationCommandInteraction object at 0x000000000399F740>, а в анслеш:
<disnake.ext.commands.context.Context object at 0x0000000003D0E6A0>, я думаю проблема в этом.
Вопрос такой: Почему аргумент
ctx в разных функциях имеет разные значения и может ли из-за этого не работать функция?
Стек ошибки:
disnake.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: check_moderator_role() got an unexpected keyword argument 'сtx'

Сам далеко не самый опытный но во первых, проверку на наличие нужной роли делайте через декоратор, во вторых,
ctx не подходит в данном случае и вместо него нужно использовать
inter.

@bot.slash_command(description='Очищает данное количесво сообщений.')
@commands.has_any_role('роль') #название вашей роли
async def clear(inter, reason: int = commands.Param(name="number_of_messages_to_clear")):    #slash-command clear
    await inter.channel.purge(limit=int(reason))
    await inter.response.send_message(embed=disnake.Embed(description=f'**{reason} сообщений(e) удалено!** :white_check_mark:'), delete_after=60)


Как работать со списком в этом случае?
У меня есть 2 списка.

list_1 = [1,2,3,4,5,6,7,8,9,10]
list_2 = ["Игрок","Повар","Моряк","Солдат"]

Мне не обходимо совместить объекты из 2 списков таким образом.

1 - Игрок
2 - Повар
3 - Моряк
4 - Солдат

5 - Игрок
6 - Повар
7 - Моряк
8 - Солдат

9 - Игрок
10 - Повар

Воспользуйтесь функциями
zip и
cycle:

from itertools import cycle

list_1 = [1,2,3,4,5,6,7,8,9,10]
list_2 = ["Игрок","Повар","Моряк","Солдат"]

print(dict(zip(list_1, cycle(list_2))))

# {1: 'Игрок', 2: 'Повар', 3: 'Моряк', 4: 'Солдат',
#  5: 'Игрок', 6: 'Повар', 7: 'Моряк', 8: 'Солдат', 9: 'Игрок', 10: 'Повар'}

Если в итоге нужен список, а не словарь, то:

list(zip(list_1, cycle(list_2)))
# [(1, 'Игрок'), (2, 'Повар'), (3, 'Моряк'), (4, 'Солдат'),
#  (5, 'Игрок'), (6, 'Повар'), (7, 'Моряк'), (8, 'Солдат'), (9, 'Игрок'), (10, 'Повар')]


Вот код который создаёт новый массив
b, в котором все числа не превосходят сотни:

a = array(...)
b = a[a <= 100]
print(b)

P.S. Вы ведь с
NumPy работаете?


Принять на вход строки и сформировать DataFrame
на вход подается число n - это кол-во строк с данными для построения таблицы
далее на вход подаются n строк вида:

column_name_1 data_1 ... data_n
Кол-во строк может меняться, подскажите пожалуйста как с учетом этого принять строки и сформировать датаframe? (Наверное с помощью цикла, но у меня не получается правильно алгоритм прописать)
пробовал так, выдает ошибку

import pandas as pd
n = int(input())
for _ in range(n):
    df = pd.DataFrame(input())

import pandas as pd
n = int(input())           # читаем кол-во
d = {}
for _ in range(n):         # читаем строки
    temp = input().split()
    d[temp.pop(0)] = temp  # и складываем в словарь
df = pd.DataFrame(d)       # делаем фрайм из словаря
print(df)


Как перевести код с С++ на python? [закрыт]

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

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

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

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

Не знаю C++ нужно с него перенести код на python, желательно python 3
такой код:
<code>
    #include <iostream>
#include <math.h>
using namespace std;
double fack(int64_t n){ //fackториал
double xf = 1;
for (int k = 1; k < n; k++) xf *= k;
return xf;
}
int main()
{
for(double i = 0.1; i <= 10; i+=0.01){
double out = 1;
for(int64_t j = 1; j < 26; j+=1) out += cos(j*M_PI/4)*pow(i,j)/fack(j);
cout « i « "\t"« out « endl;
}
cout « "Hello World!" « endl;
return 0;
}
</code>

Все просто. Код одинаковый с С++. По сути просто синтаксис меняется
<code>
import math

def fack(n: int) -> float:
    xf = float(1)
    for k in range(1, n):
        xf *= k
    return xf

if __name__ == "__main__":
    for i in range(0.1, 10.0, 0.01):
        out = float(1)

        for j in range(1, 26, 1):
            out += math.cos(j * math.pi / 4) * math.pow(i, j) / fack(j)

        print(i, "\t", out)
    print("Hello World!")
</code>


Как объединить массивы с одинаковым элементом?
Есть список массивов типа
[ ['1234', '5678', '1'], ['1234', '9012', '2'] ].
Я хочу находить все массивы с одинаковым первым элементом и добавлять значения в один общий. То есть должно получится вот это:
['1234', '5678', '1', '9012', '2']. К решению даже близко не подобрался.

Можно например так:
<code>
list_collection = [['1234', '5678', '1'], ['1234', '9012', '2'], ['1', '2', '3', '4']]

desired_element = list_collection[0][0]

filtered_lists = [list_[1:] for list_ in list_collection if list_[0] == desired_element]

joined_list_collection = [desired_element] + [element for list_ in filtered_lists for element in list_]

print(joined_list_collection) # ['1234', '5678', '1', '9012', '2']
</code>


super() в классах Python
При знакомстве с фреймворком PyQt5, я заметил, что в функцию
super() еще и записывают параметры.
Я не могу понять, зачем и почему, и что это дает?
Пример:

class Example(QWidget):
   def __init__(self):
      super(Example, self).__init__()

PyQt5 здесь ни при чем.
Один из способов, которым Python достигает парадигмы
объектно-ориентированную программирования,
этого —
поддержка наследования, что он делает с помощью
super().

class Example(QWidget):
   def __init__(self):
      super(Example, self).__init__()

В Python 3 вызов
super(Example, self) эквивалентен вызову
super() без параметров.

super() может принимать два параметра:

первый параметр является подклассом,
а второй параметр является объектом,
который является экземпляром этого подкласса.


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

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import json
import os
import sys
import threading

'''Json в котором собраны login, password, id аккаунтов'''
working_dir = os.path.sep.join(sys.argv[0].split(os.path.sep)[:-1])

with open(os.path.join(working_dir, "accounts.json"), "r", encoding="utf-8") as file:
    data = json.loads(file.read())
    accounts = data["accounts"]

'''Функция которая открывает браузер и авторизует аккаунты'''
def auth_user():
    for account in accounts:
        print(account)
        try:
            options = webdriver.ChromeOptions()
            s = Service("/Users/valiev/code/python/vkbot_playlist/chromedriver/chromedriver")
            driver = webdriver.Chrome(service=s, options=options)
        except Exception as ex:
            print(ex)
        finally:
            driver.close()
            driver.quit()

if __name__ == '__main__':
    threads = []
    for i in range(2):
        t = threading.Thread(target=auth_user, args=())
        threads.append(t)
        t.start()

Как сделать чтоб первый поток брал первый элемент а второй поток следующий и так далее. При данном коде в консоль выводиться следующие:

{'id': '1'}
{'id': '1'}
{'id': '2'}
{'id': '2'}
{'id': '3'}
{'id': '3'}
{'id': '4'}
{'id': '4'}
{'id': '5'}
{'id': '5'}
{'id': '6'}
{'id': '6'}
{'id': '7'}
{'id': '7'}

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

def auth_user(t):
    for k in range(0 + t, len(accounts) + t, 2):
        if k >= len(accounts): # проверяем к , чтоб не вылететь за пределы списка.
            continue
        account = accounts[k]

if __name__ == '__main__':
    threads = []
    for i in range(2):
        t = threading.Thread(target=auth_user, args=(i,))
        threads.append(t)
        t.start()

В принципе, можно увеличить количество потоков, заменив 2 на 3,4, ... .


Сортировка и вывод по условию в датасете pandas
Имеется следующий датасет (строк много):

date
user
event_type
parameter

0
2020-04-01_00:01:08 770906
770906
3
unknown

1
2020-04-01_00:00:30 527877
527877
1
text

2
2020-04-01_00:01:12 539948
539948
3
picture

3
2020-04-01_00:01:20 107541
107541
3
picture

4
2020-04-01_00:01:38 374954
374954
4
text

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

df.date = df.date.str.replace(r'\s.*','', regex=True)
df.date = pd.to_datetime(df.date, format='%Y-%m-%d_%H:%M:%S')
df[df['date']=='2020-04-18' + pd.Timedelta(30, "m")]

Но выдает ошибку:

TypeError: can only concatenate str (not "Timedelta") to str
Подскажите, как решить?

С подсветкой синтаксиса, конечно, понятнее что у Вас происходит.
Фильтровать
datetime по строчной переменной нельзя
Можно так:

df[df['date'].dt.date==pd.to_datetime('2020-04-18')]

.dt.date обрезает
datetime с временем до даты и сравнивает с датой
pd.to_datetime('2020-04-18')
Таким образом получаем все записи на данную дату игнорируя время.
Альтернативно можно обращаться к году, месяцу и дню непосредственно:

df[(df['date'].dt.year == 2020) & (df['date'].dt.month == 4) & (df['date'].dt.day == 18)]

Если в dataset только один день, то можно сократить до:

df[df['date'].dt.day == 18]

Что касается
timedelta, её добавлять можно исключительно к колонке:

df[df['date'].dt.day == 18]['date'] + pd.Timedelta(30, "m")

Кстати, обращаться к колонке можно через
.:

df[df.date.dt.day == 18].date + pd.Timedelta(30, "m")

В качестве прямо совсем альтернативы, можно не приводить колонку
date к
datetime и фильтровать по строковой переменной:

d̶f̶.̶d̶a̶t̶e̶ ̶=̶ ̶d̶f̶.̶d̶a̶t̶e̶.̶s̶t̶r̶.̶r̶e̶p̶l̶a̶c̶e̶(̶r̶'̶\̶s̶.̶*̶'̶,̶'̶'̶,̶ ̶r̶e̶g̶e̶x̶=̶T̶r̶u̶e̶)̶
̶d̶f̶.̶d̶a̶t̶e̶ ̶=̶ ̶p̶d̶.̶t̶o̶_̶d̶a̶t̶e̶t̶i̶m̶e̶(̶d̶f̶.̶d̶a̶t̶e̶,̶ ̶f̶o̶r̶m̶a̶t̶=̶'̶%̶Y̶-̶%̶m̶-̶%̶d̶_̶%̶H̶:̶%̶M̶:̶%̶S̶'̶)̶
df[df.date.str.contains('2020-04-18')]

Но
timedelta с этим делом работать не будет.


select_related получить определенные поля
Подскажите как получить все поля в
Post а у родителей только
slug
У меня получиться что нужно в ручную прописывать все  поля для
Post так как применил
only:

posts = Post.objects.filter(sub_post=self.object)\
        .select_related('sub_post__topics_category__category')\
        .only('sub_post__topics_category__category__slug',
              'sub_post__topics_category__slug', 'sub_post__slug')

поля
Post:

('name', 'id', 'text', 'discussion', 'cat_post', 'top_post')

Есть ли способ применить only только к select_related не трогая содержимого пост ?

select_related следует использовать для всей модели, а затем уже отфильтровать требуемые поля. Это будет работать:
<code>
Articles.objects.select_related('blog').only('blog__name', 'title', 'create_time')
</code>
Оригинальный ответ


При запуске файла main.py получаю UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcf in position 4: invalid continuation byte
Я использую библиотеку eel для написания веб-интерфейса но получаю выше указанную ошибку.
Я пробовал:

Переустанаволивать билиотеку
Пересохранять всё файлы в кодировке utf-8
Использовать другой редактор кода

Вот сама ошибка:

C:\Users\amd\Documents\Python>python main.py
Traceback (most recent call last):
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\gevent\threadpool.py", line 173, in __run_task
thread_result.set(func(*args, **kwargs))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcf in position 4: invalid
continuation byte
2022-12-11T18:05:07Z (<ThreadPoolWorker at 0x284dd48 thread_ident=0xcc0 threadpo
ol-hub=<Hub at 0x887f78 thread_ident=0x378>>, <built-in function gethostbyaddr>)
failed with UnicodeDecodeError

Traceback (most recent call last):
File "main.py", line 3, in <module>
eel.start("index.html")
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\eel\__init__.py", line 185, in start
run_lambda()
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\eel\__init__.py", line 176, in run_lambda
return btl.run(
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\bottle.py", line 3172, in run
server.run(app)
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\bottle_websocket\server.py", line 17, in run
server.serve_forever()
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\gevent\baseserver.py", line 398, in serve_forever
self.start()
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\gevent\baseserver.py", line 336, in start
self.init_socket()
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\gevent\pywsgi.py", line 1546, in init_socket
self.update_environ()
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\gevent\pywsgi.py", line 1558, in update_environ
name = socket.getfqdn(address[0])
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\gevent\_socketcommon.py", line 304, in getfqdn
hostname, aliases, _ = gethostbyaddr(name)
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\gevent\_socketcommon.py", line 276, in gethostbyaddr
return get_hub().resolver.gethostbyaddr(ip_address)
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\gevent\resolver\thread.py", line 66, in gethostbyaddr
return self.pool.apply(_socket.gethostbyaddr, args, kwargs)
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\gevent\pool.py", line 161, in apply
return self.spawn(func, *args, **kwds).get()
File "src\gevent\event.py", line 329, in gevent._gevent_cevent.AsyncResult.get

File "src\gevent\event.py", line 359, in gevent._gevent_cevent.AsyncResult.get

File "src\gevent\event.py", line 347, in gevent._gevent_cevent.AsyncResult.get

File "src\gevent\event.py", line 327, in gevent._gevent_cevent.AsyncResult._ra
ise_exception
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\gevent\_compat.py", line 66, in reraise
raise value.with_traceback(tb)
File "C:\Users\amd\AppData\Local\Programs\Python\Python38-32\lib\site-packages
\gevent\threadpool.py", line 173, in __run_task
thread_result.set(func(*args, **kwargs))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcf in position 4: invalid
continuation byte

Код файла который выдает ошибку(данный код открывает окно приложения с веб- итрефейсом):

import eel
eel.init("web")
eel.start("index.html")

Путь к папке web: C:\Users\amd\Documents\Python\web
Путь к python файлу: C:\Users\amd\Documents\Python
Браузер: Chrome
ОС: Windows 7 (32-bit)
Код html документа:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" type="text/css" href="styles.css">
<script type="text/javascript" src="/eel.js"></script>
</head>
<body>
<input type="" name=" ", id="number-input">

<h2 class="style">Enter your number here</h2>
<button class="button-1">1</button>
<button class="button-2">2</button>
<button class="button-3">3</button>
<button class="button-4">4</button>
<button class="button-5">5</button>
<button class="button-6">6</button>
<button class="button-7">7</button>
<button class="button-8">8</button>
<button class="button-9">9</button>

</body>
</html>

Вот лог установки:

C:\Users\amd>pip install eel --log out.log
Collecting eel
Using cached Eel-0.15.1-py3-none-any.whl
Requirement already satisfied: pyparsing in
c:\users\amd\appdata\local\programs\
python\python38-32\lib\site-packages (from eel) (3.0.9)
Requirement already satisfied: bottle in
c:\users\amd\appdata\local\programs\pyt
hon\python38-32\lib\site-packages (from eel) (0.12.23)
Requirement already satisfied: bottle-websocket in
c:\users\amd\appdata\local\pr
ograms\python\python38-32\lib\site-packages (from eel) (0.2.9)
Requirement already satisfied: whichcraft in
c:\users\amd\appdata\local\programs
\python\python38-32\lib\site-packages (from eel) (0.6.1)
Requirement already satisfied: future in
c:\users\amd\appdata\local\programs\pyt
hon\python38-32\lib\site-packages (from eel) (0.18.2)
Requirement already satisfied: gevent-websocket in
c:\users\amd\appdata\local\pr
ograms\python\python38-32\lib\site-packages (from bottle-websocket-
>eel) (0.10.1
)
Requirement already satisfied: gevent in
c:\users\amd\appdata\local\programs\pyt
hon\python38-32\lib\site-packages (from gevent-websocket->bottle-
websocket->eel)
(22.10.2)
Requirement already satisfied: zope.event in
c:\users\amd\appdata\local\programs
\python\python38-32\lib\site-packages (from gevent->gevent-websocket-
>bottle-web
socket->eel) (4.5.0)
Requirement already satisfied: greenlet>=2.0.0 in
c:\users\amd\appdata\local\pro
grams\python\python38-32\lib\site-packages (from gevent->gevent-
websocket->bottl
e-websocket->eel) (2.0.1)
Requirement already satisfied: zope.interface in
c:\users\amd\appdata\local\prog
rams\python\python38-32\lib\site-packages (from gevent->gevent-
websocket->bottle
-websocket->eel) (5.5.2)
Requirement already satisfied: cffi>=1.12.2 in
c:\users\amd\appdata\local\progra
ms\python\python38-32\lib\site-packages (from gevent->gevent-
websocket->bottle-w
ebsocket->eel) (1.15.1)
Requirement already satisfied: setuptools in
c:\users\amd\appdata\local\programs
\python\python38-32\lib\site-packages (from gevent->gevent-websocket-
>bottle-web
socket->eel) (49.2.1)
Requirement already satisfied: pycparser in
c:\users\amd\appdata\local\programs\
python\python38-32\lib\site-packages (from cffi>=1.12.2->gevent-
>gevent-websocke
t->bottle-websocket->eel) (2.21)
Installing collected packages: eel
Successfully installed eel-0.15.1

Прошу вашей помощи!

Обычно такая ошибка возникает, когда указана неверная кодировка для декодирования файла.
Оказалась кириллица не в той кодировке, в имени компьютера, "amd-ПК".


Операции над циклом range
Помогите найти ошибку.
Из предложенного списка нужно убрать те числа, которые нарушают последовательность. Но из-за указанного range для сравнения рядом стоящих пар, последнее значение списка не выводится. Есть ли у вас идеи, как можно исправить код?
<code>
def ranges(number):
    list = []
    for i in range(len(number)-1):

        if number[i]<number[i+1]:
            list.append(number[i])

    return (list)

print(ranges([7, 2, 4, 7, 16, 8, 10, 12]))
</code>

Не называйте свою переменную
list, так вы перекрываете встроенный класс
list. А чтобы последнее число списка попало в результат нужно проверять этот случай отдельно. Либо после окончания цикла (но тогда придётся повторять там проверку на "меньше"), либо вставить проверку на то, что это последний элемент внутрь вашей проверки, чтобы кода получилось поменьше (но для больших списков это будет неэффективно):

def ranges(number):
    lst = []
    for i in range(len(number)-1):

        if number[i]<number[i+1]:
            lst.append(number[i])
            # Проверка, что это был последний элемент
            # Если да, то его тоже добавляем - условие то выполнено
            if i == len(number)-2:
                lst.append(number[i+1])

    return (lst)

print(ranges([7, 2, 4, 7, 16, 8, 10, 12]))

Вывод:

[2, 4, 7, 8, 10, 12]


Подскажите пожалуйста, ошибка при установке torch
ERROR: Could not find a version that satisfies the requirement torch (from versions: none)
ERROR: No matching distribution found for torch

PyTorch не получится установится при помощи команды
pip install torch.
Для установки вам нужно перейти на официальный сайт и выбрать конфигурацию вашей системы, после чего установить
Package в значение
pip и система предоставит вам ссылку, которую нужно будет ввести в консоль для установки при помощи пакетного менеджера
pip
Также, для работы
PyTorch, должен быть предварительно установлен пакет
numpy.


python сохранить файл doc в pdf
Подскажите пожалуйста как в python сохранить файл doc в pdf
на примере простого кода:
<code>
from docxtpl import DocxTemplate
doc = DocxTemplate("шаблон.docx")
context = { 'emitent' : 'ООО Ромашка', 'address1' : 'г. Москва, ул. Долгоруковская, д. 0', 'участник': 'ООО Участник', 'адрес_участника': 'г. Москва, ул. Полевая, д. 0', 'director': 'И.И. Иванов'}
doc.render(context)
doc.save("шаблон-final.docx")
</code>
Спасибо.

Одно из решений - воспользоваться библиотекой
docx2pdf
В вашем примере формат файла
docx подходит для её работы, но если понадобится сконвертировать файл с форматом
doc, то для этой задачи библиотека не подойдет.
Для установки пропишите в консоль следующую команду
pip install docx2pdf

from docx2pdf import convert

convert("input.docx", "output.pdf")


Питон, разбитие текста на строки
Прошу помощи, имею вывод, например

['Отвертка трещоточная с набором бит (636120)', 'Паста-смывка 200мл (973515-4002)', 'Разрушитель ржавчины (973520-4500)', 'Очиститель тормозов (973520-0650)', 'очки защитные Классик (GL-01010)', 'перчатки (PGT-020)', 'GW40 210мл (973520-3210)']

Нужно этот текст превратить в построчный вывод, вот так:

Отвертка трещоточная с набором бит (636120)
Паста-смывка 200мл (973515-4002)
Разрушитель ржавчины (973520-4500)
Очиститель тормозов (973520-0650)
очки защитные Классик (GL-01010)
перчатки (PGT-020)
GW40 210мл (973520-3210)

Элементов может быть разное количество, которое заведомо неизвестно. Прошу помочь кодом на питоне. Спасибо.

<code>
d = ['Отвертка трещоточная с набором бит (636120)', 'Паста-смывка 200мл (973515-4002)', 'Разрушитель ржавчины (973520-4500)', 'Очиститель тормозов (973520-0650)', 'очки защитные Классик (GL-01010)', 'перчатки (PGT-020)', 'GW40 210мл (973520-3210)']
for a in d:
    print(a)
</code>
сделано простым перебором списка


Как уложиться в лимиты задачи?
Решил на днях порешать задачи на одном сайте. Для данной задачи установлены лимиты в использовании 256 мегабайт памяти и не более 1 секунды на исполнение кода.
Задача звучит так:
У старика есть бесконечное количество зелёных, красных и жёлтых яблок.
Он решил ставить яблоки в ряд по такому алгоритму: сначала
g зелёных яблок, потом
y жёлтых яблок, далее
r красных яблок,
y жёлтых яблок, и наконец
g зелёных яблок (то есть, если
g=1, y=3, r=4, то ряд будет выглядеть так:
GYYYRRRRYYYG).
Цель задачи - найти цвет яблока на
n-ной позиции.
Входные данные:

n, g, y, r (1≤n,g,y,r≤10^12)
Всё бы ничего, но при проверке, в одном из своих тестов сайт в качестве
n использует число
1000000000000.
Собственно это и доставляет проблему - при выполнении моего кода с небольшими числами всё окей, но стоит вписать триллион и пайтон намертво виснет. Подскажите, есть ли возможность оптимизировать программу?
Код:

n, g, y, r = map(int, input().split())
k = ""
x = ""
x += "G"*g
x += "Y"*y
x += "R"*r
x += "Y"*y
x += "G"*g
while not len(k)>n:
    k += x
print(k[n-1])

Не стоит заводить эту последовательность в виде строки, задачу нужно решать математически.
Очевидно, что вся последовательность повторяется блоками по
(g+y+r)+(y+g) яблок.
Тогда алгоритм примерно следующий:

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

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

[0 .. g-1, g .. g+y-1, ... , (g+y+r)+(y+g)-1

Наша задача лишь определить к какой из 5 частей относится число n

Вывести цвет яблока, который соответствует части, в которую попало число
n


Не отображается текст на кнопках tkinter
Есть код:
<code>
from tkinter import *

window = Tk()
window.title("Калькулятор")
window.geometry("400x600")
window.resizable(False, False)
canvas = Canvas(window, width=400, height=400, bg='white')

font_settings = ("Times New Roman", 40, "")
virtualImg = PhotoImage()

resultLabel = Label(window, text="0", font=font_settings, image=virtualImg, width=375, height=75, compound=CENTER, bg="grey77", anchor="e")
resultLabel.place(x=10, y=10)

oneButton = Button(window, text="1", font=font_settings, image=virtualImg, width=75, height=75)
oneButton.place(x=134, y=276)

mainloop()
</code>
При его запуске на кнопке не отображается текст, а точнее 1. помогите пожалуйста. спасибо.

Добавьте параметр
compound=CENTER:

oneButton = Button(window, text="1", font=font_settings, image=virtualImg, width=75, height=75, compound=CENTER)


Как сделать так, чтобы каждый раз вывод был с новой строки
<code>
prasa = input ()

b = int (input ())

print (b * prasa)
</code>
Чтобы каждый раз переменная prasa выводилась с новой строки.

Рассмотрим функцию print:
Она имеет аргументы
*objects, sep=' ', end='\n', flush=False. flush и sep нам не важны. Аргумент end, обозначающий заключающие символы вывода, как было показано ранее по умолчанию имеет значение переноса строки (
\n).
Поэтому, вам не нужно ничего делать для того, чтобы каждый новый print был с новой строки.
На всякий случай, если вам необходим вывод через строчку, то передавайте строчку  с переносом строки, вот так:

print(prasa + '\n')

Возможно, вы неправильно сформулировали вопрос и вам нужен вывод с новой строки каждый раз. Тогда вам тоже ничего не нужно делать. Вводя значение, вы клавишей Enter сами переносите строку.
Зная то, что вы ввели еще одну переменную, вероятно то, что вам нужно несколько раз повторить prasa. В таком случае тоже все просто:

print((prasa + '\n') * b)


SyntaxError: invalid syntax (unknown token [ ])
Пока что учу циклы и сделал примерный код, чтобы понять как оно работает:

counter = 0

while counter < 15:
  print(counter)
  counter = counter + 1
else:
  print("end")

Когда запускаю код выводит ошибку:

File <string>, line 3
     print(counter)
     ^
SyntaxError: invalid syntax (unknown token [ ])

Смотрел много видео и читал форумы но до сих пор не могу понять что с этим делать.

Сам код корректный, у вас проблема с отступами, с точки зрения интерпретатора количество пробелов должно быть одинаковым внутри одного блока, но среди Python-разработчиков принято использовать четыре пробела, либо одну табуляцию.
<code>
counter = 0

while counter < 15:
    print(counter)
    counter = counter + 1
else:
    print("end")
</code>


Как вывести все слова которые имеют по одной цифре?
Как сделать чтобы при вводе текста выводились только те слова в которых есть 1 цифра.
Проблема в том, что программа выводит только 1 слово с строки в которой есть цифра.
<code>
from tkinter import *

def clear():
    input_entry.delete(0, END)
    output_entry.delete(0, END)

def display():

    s1 = input_entry.get()
    s2 = ''

    for word in s1.split():
        for char in word:
            if char.isdigit():
                s2 = word

    s_list = s2.split()

    s3 = ' '.join(s_list)

    output_entry.delete(0, END)

    output_entry.insert(0, s3)

root = Tk()

root.title("Тitle")

input_label = Label(text="Введите текст:")
output_label = Label(text="Результат:")

input_label.grid(row=0, column=0, sticky="w")
output_label.grid(row=1, column=0, sticky="w")

input_entry = Entry(width = 50)
output_entry = Entry(width = 50)

input_entry.grid(row=0,column=1, padx=5, pady=5)
output_entry.grid(row=1,column=1, padx=5, pady=5)

input_entry.insert(0, "Ввести текст")
output_entry.insert(0, "Результат")

display_button = Button(text="Старт", command=display)
clear_button = Button(text="Очистка", command=clear)

display_button.grid(row=2, column=0, padx=20, pady=5,
sticky="w")
clear_button.grid(row=2, column=1, padx=20, pady=5,
sticky="e")

root.mainloop()
</code>

У вас неверно реализована логика в методе
display.
Замените код на этот и всё будет работать.

def display():
    input_ = input_entry.get()
    correct_words = []
    for word in input_.split():
        count_digits = len([x for x in word if x.isdigit()])
        if count_digits == 1:
            correct_words.append(word)

    output_entry.delete(0, END)

    output_entry.insert(0, ' '.join(correct_words))


Не работает проверка существования таблицы sqlite
ДВС! У меня задача, проверить базу SQLite на существование таблицы. Везде рекомендуется способ:

conn = sqlite3.connect('mysqlite.db')
c = conn.cursor()

#get the count of tables with the name
c.execute(''' SELECT count(name) FROM sqlite_master WHERE type='table' AND name='students1' ''')

#if the count is 1, then table exists
if c.fetchone()[0]==1 :
    print('Table exists.')
else :
    print('Table does not exist.')

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

Возникло исключение: OperationalError
no such column:students1

Средство самого sql: if not exists, мне не подойдет, так как и сам код питона будет отличаться при наличии таблицы.
Подскажите, как это исправить?
Спасибо!

Исключение
OperationalError возникает из-за того, что не получилось произвести запрос из базы данных по одной из двух причин:

Из-за отсутствия таблицы - исключение

OperationalError: no such table
Из-за отсутствия столбца в таблице - исключение
OperationalError: no such column

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

conn = sqlite3.connect('mysqlite.db')
c = conn.cursor()

try:
  c.execute(''' SELECT count(name) FROM sqlite_master WHERE type='table' AND name='students1' ''')
  data_list = c.fetchall()
except sqlite3.OperationalError:
  print('Something goes wrong')

Задача: проверить базу SQLite на существование таблицы

Но этот код проверяет не только существование таблицы, но и существование столбца
students1, что не соответствует условию задачи, поскольку при существовании таблицы, но отсутствии столбца
students1, все равно будет вызвано исключение.
Для проверки существования только таблицы достаточно в вашем запросе убрать дополнительную фильтрацию по столбцу и тогда исключение
OperationalError не будет возникать по другим причинам.

conn = sqlite3.connect('mysqlite.db')
c = conn.cursor()

try:
  table_name = 'table'
  c.execute(''' SELECT count(name) FROM sqlite_master WHERE type=table_name''')
  data_list = c.fetchall()
except sqlite3.OperationalError:
  print(f'Table {table_name} doesnt exist')


Как избавиться от глобальной переменной PyTelegramBotAPI
Дело в том что когда кто-то смотрит фото в боте и приходит другой юзер и нажимает на другую кнопку то переменная меняется для всех и потом выводит данные для всех 2-го юзера.
Понимаю что дело в переменной
nnn но не понимаю как по другому реализовать

modely_markup = types.InlineKeyboardMarkup(row_width=1)
for i in row:
    modely_markup.add(
        types.InlineKeyboardButton(
            text=f'(#{i[0]}) •{i[1]}• {i[-1]}',
            callback_data="girl:"+f'{i[0]}'))

@bot.callback_query_handler(func=lambda call:True)
def call_back(call):
    for i in row:
        if call.data != "girl:" + f'{i[0]}':
            continue

        #bot.send_media_group(chat_id=call.message.chat.id, media=[photo])
        bot.send_photo(
            chat_id=call.message.chat.id,
            photo=(i[2] ),
            caption=girl_Profile.format(i[1], i[-4], i[-3], i[-2]),
            reply_markup=girl_markup)

        global nnn
        caldata = call.data
        num = re.findall(r'[1-9][1-9]?',caldata)
        nnn = int(num[0])-1

    if call.data == 'next_photo':
        bot.send_media_group(
            chat_id=call.message.chat.id,
            media=([types.InputMediaPhoto(row[nnn][3]),
                   types.InputMediaPhoto(row[nnn][4]),
                   types.InputMediaPhoto(row[nnn][5])]))

Можно сделать словарь с юзерами и в них хранить нужные данные

from typing import Union

# делаем глобальный словарь с юзерами
data_storage: dict[int, dict[int, dict]] = {}

# функция добавления для удобства
def add_user(chat_id: int, user_id: int) -> None:
    # создаем в словаре по чайт айди пустой словарь
    data_storage.setdefault(chat_id, {})
    # в который потом пихаем юзер айди в котором будет data и state
    data_storage[chat_id].setdefault(user_id, {"data": {}, "state": ""})
    # PS если такой ключ в data_storage уже есть то он не будет перезаписывать данные

# делаем функцию для записи данных в дату
# обязательно указывать название аргумента типа update_data(message=message, data={'key':value})
def update_data(*, data: dict, user_id: int = None, chat_id: int = None,
                message: Union[types.Message, types.CallbackQuery] = None) -> None:
    if message and (chat_id or user_id):
        logging.error("В качестве аргументов использовать либо 'message' либо 'chat_id' и 'user_id'")
        return

    _user_id = message.from_user.id if message else user_id
    if isinstance(message, types.CallbackQuery):
        message = message.message
    _chat_id = message.chat.id if message else chat_id or user_id
    # на всякий случай проверяем есть ли юзер в словаре
    add_user(_chat_id, _user_id)
    # и спокойно добавляем данные в дату
    data_storage[_chat_id][_user_id]['data'].update(data)

# по аналогии с функцией выше
def get_data(*, user_id: int = None, chat_id: int = None,
             message: Union[types.Message, types.CallbackQuery] = None) -> dict:
    if message and (chat_id or user_id):
        logging.error("В качестве аргументов использовать либо 'message' либо 'chat_id' и 'user_id'")
        return {}
    _user_id = message.from_user.id if message else user_id
    if isinstance(message, types.CallbackQuery):
        message = message.message
    _chat_id = message.chat.id if message else chat_id or user_id
    add_user(_chat_id, _user_id)
    return data_storage[_chat_id][_user_id]['data']

Пример использования

@bot.message_handler()
def start(msg: types.Message):
    update_data(data={'s': '123'}, message=msg)
    data = get_data(msg) # < {'s': '123'}

PS. В целом
update_data можно упростить и оставить только
message но вдруг ты захочешь поменять данные для другого юзера и чата. Так что на ваше усмотрение.
UPD. Пример для вашего кода

@bot.callback_query_handler(func=lambda call: True)
def call_back(call):
    for i in row:
        if call.data != "girl:" + f'{i[0]}':
            continue

        # bot.send_media_group(chat_id=call.message.chat.id, media=[photo])
        bot.send_photo(
            chat_id=call.message.chat.id,
            photo=(i[2]),
            caption=girl_Profile.format(i[1], i[-4], i[-3], i[-2]),
            reply_markup=girl_markup)

        caldata = call.data
        num = re.findall(r'[1-9][1-9]?', caldata)
        update_data(data={'nnn': int(num[0]) - 1}, message=call)
        # nnn = int(num[0])-1

    if call.data == 'next_photo':
        nnn = get_data(message=call).get("nnn")
        bot.send_media_group(
            chat_id=call.message.chat.id,
            media=([types.InputMediaPhoto(row[nnn][3]),
                    types.InputMediaPhoto(row[nnn][4]),
                    types.InputMediaPhoto(row[nnn][5])]))


Помощь с подсчётом в датасете pandas
Имеется следующий датасет:

date
user
event_type
parameter

0
2020-04-01_00:01:08 770906
770906
3
unknown

1
2020-04-01_00:00:30 527877
527877
1
text

2
2020-04-01_00:01:12 539948
539948
3
picture

3
2020-04-01_00:01:20 107541
107541
3
picture

4
2020-04-01_00:01:38 374954
374954
4
text

Надо найти день, когда число уникальных пользователей, отправивших текстовое сообщение (
event_type=4,
parameter=text), было максимальным.
Также нужно определить 20-минутный интервал [time; time + 20 min), в течение которого произошло больше всего событий?
Если таких интервалов несколько, нужно найти начало самого позднего.
Описание переменных:

date        object
user        int64
event_type  int64
parameter   object
dtype: object

Создадим DataFrame по подобию:

import pandas as pd
import numpy as np
from random import randint as r

day = lambda : "%02d" % r(1,30)
hour = lambda : "%02d" % r(0,23)
min_sec = lambda : "%02d" % r(0,59)
user = lambda : "%06d" % r(100000,999999)

rows_c=100000
df = pd.DataFrame({
    'date': ['2020-04-{}_{}:{}:{}'.format(day(),hour(),min_sec(),min_sec()) for _ in range(0,rows_c)],
    'user': ["%06d" % r(100000,999999) for _ in range(0,rows_c)],
    'event_type': [r(1,4) for _ in range(0,rows_c)],
    'parameter': [['unknown', 'text', 'picture'][r(0,2)] for _ in range(0,rows_c)]
})
df.date = df.date + ' ' + df.user
df

Вывод:

        date                        user    event_type  parameter
0       2020-04-08_16:12:07 395528  395528  2           text
1       2020-04-10_21:10:21 682091  682091  2           unknown
2       2020-04-30_15:06:42 738315  738315  3           picture
3       2020-04-01_20:09:04 723756  723756  2           picture
4       2020-04-20_09:04:02 859750  859750  4           unknown
... ... ... ... ...
99995   2020-04-05_01:45:29 801973  801973  2           picture
99996   2020-04-07_05:48:39 379318  379318  2           text
99997   2020-04-11_04:24:33 581294  581294  2           picture
99998   2020-04-13_13:17:48 807151  807151  4           text
99999   2020-04-24_10:34:03 362205  362205  2           text

100000 rows × 4 columns

Задача 1

Надо найти день, когда число уникальных пользователей, отправивших текстовое сообщение (
event_type=4,
parameter=text), было максимальным.

В первую очередь приведём колонку
date к формату
datetime. Затем делаем фильтр по
event_type и
parameter. Убираем дубликаты из
user, чтобы получить уникальных пользователей. Делаем
groupby по дням и выводим день в котором было больше всего этих пользователей.

df.date = df.date.str.replace(r'\s.*','', regex=True)
df.date = pd.to_datetime(df.date, format='%Y-%m-%d_%H:%M:%S')

filtered_df = df[(df.event_type == 4) & (df.parameter == 'text')]
filtered_df = filtered_df.drop_duplicates(subset=['user'])
filtered_df.groupby(df.date.dt.day).size().idxmax()

Вывод:

10

Задача 2

Также нужно определить 20-минутный интервал [time; time + 20 min), в течение которого произошло больше всего событий? Если таких интервалов несколько, нужно найти начало самого позднего.

Интервал нужно определить на отфильтрованной таблице? Далее код работает с неотфильтрованной, т.к. из задачи не ясно.

max_c = 0
for x in df.index:
    count = df.date[(df.date >= df.date.loc[x]) & (df.date < df.date.loc[x] + pd.Timedelta(20, "m"))].count()
    if count > max_c:
        ixs = [x]
        max_c = count
    elif count == max_c:
        ixs.append(x)
df.loc[ixs].date.idxmax()

Вывод:

76910

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

ix = df.loc[ixs].date.idxmax()
df[(df.date >= df.date.loc[ix]) & (df.date < df.date.loc[ix] + pd.Timedelta(20, "m"))]

Делать итератор, конечно, не очень хорошо, можно было бы сделать через:

df.index = df.date
gr = df.groupby([pd.Grouper(freq='20min')])

Но в подходе с итератором я больше уверен.


Как создать папку а в этой папке создать текстовый файл и записать туда текст? Python [закрыт]

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

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

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

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

у меня есть переменная с путём

filename = f'src/download/video_{random.randint(1, 99999)}', папки
scr/download есть, мне нужно создать папку
video_{random.randint(1, 99999)}, где
random.randint(1, 99999) это рандомные цифры что-бы папки не повторялись, и в этой папке(
video_{random.randint(1, 99999)}) нужно создать к примеру файл
name.txt и записать туда свой текст, я не знаю как мне это сделать. Помогите, пожалуйста

Это сделать можно вот так:
<code>
import os
import datetime

my_text = 'Hello world!!!'

# Рандомные цифры в названии не подойдут.
# Потому что они повторяются
path = f'src/download/video_{datetime.datetime.now().time()}'

# Создаем директорию
try:
    os.makedirs(path)
except FileExistsError:
    print('Директория уже существует')

# Создаем файл и записываем в него текст
with open(os.path.join(path,'name.txt'), 'w', encoding='utf-8') as f:
    f.write(my_text)
</code>


Как переключить музыку python
Как переключить или поставить на паузу трек на python, linux?

Ниже перевод
Вопрос
Вопрос на английском stackoverflow.
Я хочу ставить проигрываемую в фоне музыку на паузу и/или продолжать воспроизведение используя питон, нашёл такой вариант, который использует
pynput:

from pynput.keyboard import Controller, Key

c = Controller()
c.press(Key.media_play_pause)

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

subprocess.call(("playerctl", "play-pause"))

Однако, playerctl возможно не установлена в твоей системе, то надо сделать сдедующее:

sudo apt install playerctl,

pacman -Syu playerctl,

sudo dnf install playerctl or

sudo zypper install playerctl

(в зависимости от дистрибутива)
Таким образом нет необходимости в
pynput, вместо него
subprocess (
import subprocess). Если тебе не важны стиль и безопасность, ты можешь, конечно же, использовать
os.system("playerctl play-pause")


Преобразовать str в list без изменений [дубликат]

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

Как преобразовать строчное значение в список?

                                (3 ответа)

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

Я получаю такую строку
l = ['3:2', '1:1', '2:1'], как мне из неё сделать список?
Пытался сделать так:
list(l), но она разбивает каждый символ:

['[', "'", '3', ':', '2', "'", ',', ' ', "'", '1', ':', '1', "'", ',', ' ', "'", '2', ':', '1', "'", ']']

eval(l)

Но с eval надо быть осторожным, можно неприятные вещи словить.

Это очень мощная, но в то же время и очень опасная инструкция, особенно если строки, которые вы передаёте в eval, получены не из доверенного источника. Что будет, если строкой, которую мы решим скормить eval'у, окажется os.system('rm -rf /')?

Более безопасной опцией будет
ast ответ на английском stackoverflow.

import ast

l = "['3:2', '1:1', '2:1']"
ast.literal_eval(l)

Вывод:

['3:2', '1:1', '2:1']


Отличие функций pandas.io от pandas
Объясните пожалуйста отличие
pandas.io. от
pandas?
Например, чем отличается функция
pandas.io.sql.read_sql() от
pandas.read_sql(). Что в итоге лучше использовать и почему?

Смотрим исходники библиотеки
Pandas. В частности, файл
pandas/__init__.py:

from pandas.io.api import (
    ...
    # sql
    read_sql,
    ...
)

То есть на самом деле, когда вы обращаетесь к
pandas.read_sql, то обращение идёт к
pandas.io.api.read_sql. Хорошо, смотрим
pandas/io/api.py:

from pandas.io.sql import (
    read_sql,
    read_sql_query,
    read_sql_table,
)

То есть это на самом деле обращение к
pandas.io.sql.read_sql. А вот уже в
pandas/io/sql.py действительно лежит метод
read_sql:

def read_sql(
    sql,
    con,
...

Таким образом, нет никакой разницы, это обращение к одной и той же функции, только оформленное по-разному. Нет никакого смысла лазить вглубь субпакетов
pandas.io и т.п. все нужные функции обычно вынесены "наружу", в корень пакета
pandas и обращаться нужно обычно оттуда, как и написано в документации к
Pandas:

import pandas as pd

df = pd.read_sql(...)