Поиск различных чётных натуральных делителей чисел в определённом промежутке
Нужно написать программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [125 256; 125 330], числа, имеющие ровно шесть различных чётных натуральных делителей. Для каждого найденного числа записать эти шесть делителей в шесть соседних столбцов на экране с новой строки. Делители в строке должны следовать в порядке возрастания.
Например, в диапазоне [2; 48] ровно шесть чётных различных натуральных делителей имеют числа 24, 36 и 40, поэтому для этого диапазона вывод на экране должен содержать следующие значения:
2 4 6 8 12 24
2 4 6 12 18 36
2 4 8 10 20 40
То, как я попытался решить эту задачу:
<code>
a = 125256
b = 125330
for n in range(a, b+1):
    ds = []
    for d in range(2, n//2+1): #честно говоря, не до конца понимаю, какую функцию выполняет здесь n//2+1
        if n%d == 0:
            ds.append(d)
            if len(ds) > 6:
                break
    if len(ds) == 6:
        print(ds[0], ds[1], ds[2], ds[3], ds[4], ds[5])
#по-моему, 7-я строка должна выглядеть так: if n%d == 0 and d%2 == 0:
#но тогда на экран вообще ничего не выводится
</code>
Хотелось бы услышать от людей, которые в пайтоне разбираются, что я делаю не так.

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

a = 2 # 125256
b = 48 #125330
k = 0
for n in range(a, b+1, 2):
    ds = []
    for d in range(2, n//2 + 1, 2):
        if n%d == 0:
            ds.append(d)
            if len(ds) > 6:
                break
    ds.append(n)
    if len(ds) == 6:
        print(n, '-', ds[0], ds[1], ds[2], ds[3], ds[4], ds[5])

Вывод:

24 - 2 4 6 8 12 24
36 - 2 4 6 12 18 36
40 - 2 4 8 10 20 40

Пояснения:

Перебирать имеет смысл только чётные числа, у нечётных чисел не будет чётных делителей, поэтому шаг
2 в цикле по
n (сокращаем перебор в 2 раза)
Делители тоже имеет смысл перебирать только чётные - ведь таково условие, поэтому в цикле по
d я тоже поставил шаг
2 (сокращаем перебор в 2 раза)
Само число тоже считается своим делителем, судя по приведённому примеру, поэтому я его добавил в список вручную после окончания цикла. Можно это делать и до начала цикла, но тогда в списке числа получаются не по порядку, поэтому добавляю в конце, просто для красоты.
Перебор сделан до
n//2 + 1 потому, что если число чётное, значит оно делится на
2, делителей меньше чем
2 быть не может, значит перебор имеет смысл вести только до
n//2 (а само
n я добавляю потом отдельно),
+1 же тут из-за особенностей работы
range - конечное значение не включается в перебор, поэтому надо добавить
1 (итого - опять же сокращаем перебор ещё в 2 раза).

Результат для чисел из самого задания:

125262 - 2 6 18 13918 41754 125262
125288 - 2 4 8 31322 62644 125288
125298 - 2 6 18 13922 41766 125298


PyTelegramAPI передать callback_data без нажатия кнопки пользователем
Делаю бота, который должен автоматически присылать вопросы, которые уже забиты в обработчике и вызываются по нажатию кнопки.
Как я могу "генерировать" callback_data ,который дает нажатие кнопки? Нигде в документации не могу найти ничего подобного.
<code>
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
      if call.data == "ticket_1.1":
        bot.send_message(call.message.chat.id, 'Билет 1.1')

        keyboard = types.InlineKeyboardMarkup()
        button_1 = types.InlineKeyboardButton(text="  1⃣  ", callback_data = "1.1.1")
        button_2 = types.InlineKeyboardButton(text="  2⃣  ", callback_data = "1.1.2")

        keyboard.row(button_1, button_2)
        bot.send_message(call.message.chat.id, 'Ваш ответ:', reply_markup=keyboard)

</code>
Как я могу послать данные callback_data  "ticket_1.1" без нажатия кнопки?

Я тоже думал как можно возвращаться к определённому условию
call.data дабы не "мусорить" кнопками и у меня получилось так:

def test(message):
    if message.text.isdigit():
        bot.send_message(message.chat.id, 'Цифры')
    else:
        class XClass(object):
            def __init__(self):
                self.message = message  # либо call.message
                self.data = 'no'
        callback_inline(XClass())

Код для примера


Преобразование строки с заменой по условию

Упражнение на строки
ограничение по времени на тест - 2 seconds
ограничение по памяти на тест - 256 megabytes
ввод: стандартный ввод
вывод: стандартный вывод

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

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

Гласными буквами считаются буквы "A", "O", "Y", "E", "U", "I", а согласными —
все остальные.
На вход программе подается ровно одна строка, она
должна вернуть результат в виде одной строки, получившейся после
обработки.
Помогите Пете справиться с этим несложным заданием.
Входные данные Первая строка представляет собой входные данные для
Петиной программы. Эта строка состоит только из прописных и строчных
латинских букв и имеет длину от 1 до 100 включительно.
Выходные данные Выведите получившуюся строку. Гарантируется, что эта
строка не пуста.

Примеры
входные
tour
выходные
.t.r
входные
Codeforces
выходные
.c.d.f.r.c.s
входные
aBAcAba
выходные
.b.c.b

мой код:

t = []
n = str(input())
for i in n:
    t.append(i)
for i in t:
    if i.lower() == "a" or i.lower() == "o" or i.lower() == "y" or i.lower() == "e" or i.lower() == "u" or i.lower() == "i":
        t.remove(i)
    if i == "u" or i == "U":
        t.remove(i)
for i in t:
    i = i.lower()
print("." + (".".join([str(i) for i in t])))

Не работает программа, тупа не могу понять почему так

for i in t:
    if i.lower() == "a" or i.lower() == "o" or i.lower() == "y" or i.lower() == "e" or i.lower() == "u" or i.lower() == "i":
        t.remove(i)
    if i == "u" or i == "U":
        t.remove(i)
for i in t:
    i = i.lower()

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

text = input("Введите текст: ")

res = "." + ".".join([letter for letter in text.lower() if letter not in {'a', 'o', 'y', 'e', 'u', 'i'}])

print(*res, sep='')

правда тут не учитывается, что в слове все гласные могли быть - но это дело 1 проверки :)
Что надо:

удалить гласные

перевести согласные в нижний регистр

перед каждой согласной поставить точку

Но

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

поскольку остались только согласные - ставь точки вообще перед всеми буквами :)

А вот так код учитывает и то, что одни гласные в тексте были:

text = input("Введите текст: ")

res = filter(lambda letter: letter not in {'a', 'o', 'y', 'e', 'u', 'i'}, text.lower())

print('', *res, sep='.')


Найти индекс последнего по счету элемента в массиве, который является меньше среднее арифметическое всех элементов массива
<code>
a=[int(x) for x in input('Input array:').split()]
n=0
for i in range(0,len(a)):
    n+=1
    i+=i
    if (a[i])<i/n):
        print(a[i])
</code>
ошибка ,хз как исправить,помогите пожалуйста:)

«Первые будут последними и последние первыми.» ;-):

import statistics

numbers = [float(x) for x in input('Input array: ').split()]
numbers.reverse()

mean = statistics.mean(numbers) if numbers else 0      # любое число для пустого списка

for i, number in enumerate(numbers):
    if number < mean:
        print(len(numbers) - i - 1)
        break
else:
    print("No such number.")

Объяснение:
Функция
enumerate() занумерует обратную последовательность, когда такой индекс существует, выражением
len(numbers) - i - 1 он конвертируется на индекс оригинальной последовательности.
Таким образом достаточно найти только один подходящий элемент (команда
break).
Ветвь
else команды
break выполнится тогда и только тогда, когда цикл полностью исчерпался, т.е. когда не встретилась команда
break.


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

friends([("Ivan", "Maria"),
         ("Ella", "Ivan"),
         ("Ivan", "Oleg")]) == \
{"Ivan":{"Maria", "Ella", "Oleg"},
 "Ella":{"Ivan"},
 "Maria": {"Ivan"},
 "Oleg": {"Ivan"}}

Вот мой код:

def friends(pairs):
    result = dict()
    for pair in pairs:
        if pair[0] not in result:
            result[pair[0]] = []
        if pair[1] not in result:
            result[pair[1]] = []
        if pair[1] not in result[pair[0]]:
            result[pair[0]].append(pair[1])
        if pair[0] not in result[pair[1]]:
            result[pair[1]].append(pair[0])
    return result

res = friends([("Ivan", "Maria"), ("Ella", "Ivan"), ("Ivan", "Oleg")])
print(res)

Выводит:

{'Ivan': ['Maria', 'Ella', 'Oleg'], 'Maria': ['Ivan'], 'Ella': ['Ivan'], 'Oleg': ['Ivan']}

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

{'Ivan': {'Maria', 'Ella', 'Oleg'}, 'Maria': {'Ivan'}, 'Ella': {'Ivan'}, 'Oleg': {'Ivan'}}

как можно преобразовать?

@Danis сказал, что нужно множество, за что ему спасибо - тогда код такой:

res = dict()

for pair in friends:
    res[pair[0]] = {pair[1]} if pair[0] not in res else res[pair[0]] | {pair[1]}
    res[pair[1]] = {pair[0]} if pair[1] not in res else res[pair[1]] | {pair[0]}

А так не устраивает (по сути в лоб):

friends = [("Ivan", "Maria"),
         ("Ella", "Ivan"),
         ("Ivan", "Oleg")]

res = dict()

for pair in friends:
    if pair[0] in res:
        res[pair[0]].append(pair[1])
    else:
        res[pair[0]] = [pair[1]]

    if pair[1] in res:
        res[pair[1]].append(pair[0])
    else:
        res[pair[1]] = [pair[0]]

print(res)

или чуть покороче:

res = dict()

for pair in friends:
    if pair[0] not in res: res[pair[0]] = []
    res[pair[0]].append(pair[1])

    if pair[1] not in res: res[pair[1]] = []
    res[pair[1]].append(pair[0])

или еще чуть покороче:

res = dict()

for pair in friends:
    res[pair[0]] = [pair[1]] if pair[0] not in res else res[pair[0]] + [pair[1]]
    res[pair[1]] = [pair[0]] if pair[1] not in res else res[pair[1]] + [pair[0]]


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

A = np.ones((14, 32, 3, 3))

Пусть у нас имеется 4-мерный NumPy массив.
Можно ли применить функцию
np.ravel, или аналогичную ей, вдоль последних трех осей массива
А?
Tо есть, в итоге должна получиться матрица с размерами
(14, 32 * 3 * 3)).

можно воспользоваться методом
ndarray.reshape():

A = np.ones((14, 32, 3, 3))
res = A.reshape(-1, np.prod(A.shape[1:]))

результат:

res.shape
>>> (14, 288)


Как взять данные и показать на странице продукт?
Разрабатываю интернет магазин сайт, не могу показать на странице продукт (у меня product_detail.html) даты которые и меня на с Product_details модели, с других моделей могу отобразить даты, например с моделя Product_image и с Category без проблем беру даты. Вроде все этапы сделал но не могу отобразить даты. Прошу помочь.
Внизу мой urls.py:

from django.urls import path
from . import views
from .views import ProductListView
from django.conf.urls.static import static

urlpatterns = [
    path('', ProductListView.as_view(), name='amd-home'),
    path('product/<int:id>/', views.product_detail, name='product-detail'),
    path('about/', views.about, name='amd-about'),
]

Внизу мой models.py:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

class Category(models.Model):
    name = models.CharField(max_length=200)
    parent_id = models.IntegerField(default=0)
    description = models.TextField()
    image = models.ImageField(upload_to='uploads/')

    def __str__(self):
        return f'{self.name}'

class Brand(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=400)
    image = models.ImageField(upload_to='uploads/')

    def __str__(self):
        return f'{self.name}'

class Product(models.Model):
    title = models.CharField(max_length=200)
    image = models.ImageField(upload_to='uploads/', blank=True, null=True)
    sku = models.CharField(max_length=200)
    price = models.IntegerField(default=0)
    price_old = models.IntegerField(default=0)
    description = models.TextField()
    status = models.BooleanField(default=False)
    date_posted = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.title}, {self.description}'

class Product_image(models.Model):
    image = models.ImageField(upload_to='uploads/')
    product = models.ForeignKey(Product, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.product.title} image'

class Product_details(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True)
    size = models.CharField(max_length=50, blank=True, null=True, default=None)
    color = models.CharField(max_length=50, blank=True, null=True, default=None)
    video = models.CharField(max_length=200, blank=True, null=True, default=None)
    internal_storage = models.CharField(max_length=50, blank=True, null=True, default=None)
    ram = models.CharField(max_length=50, blank=True, null=True, default=None)
    production_year = models.CharField(max_length=50, blank=True, null=True, default=None)
    sim_count = models.CharField(max_length=50, blank=True, null=True, default=None)
    sim_type = models.CharField(max_length=50, blank=True, null=True, default=None)
    operation_system = models.CharField(max_length=100, blank=True, null=True, default=None)
    operation_system_version = models.CharField(max_length=100, blank=True, null=True, default=None)
    screen_size = models.CharField(max_length=50, blank=True, null=True, default=None)
    resolution = models.CharField(max_length=50, blank=True, null=True, default=None)
    back_camera = models.CharField(max_length=50, blank=True, null=True, default=None)
    front_camera = models.CharField(max_length=50, blank=True, null=True, default=None)
    battery = models.CharField(max_length=50, blank=True, null=True, default=None)
    weigth = models.CharField(max_length=50, blank=True, null=True, default=None)
    prosessor = models.CharField(max_length=50, blank=True, null=True, default=None)
    security = models.CharField(max_length=50, blank=True, null=True, default=None)
    guarantee = models.CharField(max_length=50, blank=True, null=True, default=None)
    operator_prefix = models.CharField(max_length=50, blank=True, null=True, default=None)
    wifi = models.BooleanField(blank=True, null=True, default=None)
    allow_3G = models.BooleanField(blank=True, null=True, default=None)
    allow_4G = models.BooleanField(blank=True, null=True, default=None)
    nfc = models.BooleanField(blank=True, null=True, default=None)
    gps = models.BooleanField(blank=True, null=True, default=None)
    eye_recognition = models.BooleanField(blank=True, null=True, default=None)
    waterproof = models.BooleanField(blank=True, null=True, default=None)
    faceID = models.BooleanField(blank=True, null=True, default=None)
    shockproof = models.BooleanField(blank=True, null=True, default=None)

    def __str__(self):
        return f'{self.product.title} details'

Внизу мой views.py:

from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView, DetailView
from django.http import HttpResponse
from .models import Product, Product_image, Product_details

class ProductListView(ListView):
    model = Product
    template_name = 'product/home.html'
    context_object_name = 'products'
    ordering = ['-date_posted']

def product_detail(request, id):
    product = Product.objects.get(pk=id)
    photos = Product_image.objects.filter(product=product)
    details = Product_details.objects.filter(product=product)
    context = {'product':product,'photos':photos, 'details':details,}
    return render(request, 'product/product_detail.html', context)

Внизу мой темплейт файл product_detail.html , очень большой файл поэтому только вставляю суда только тот элемент где обращаюсь к етему моделу. Обратите внимание {{ product.brand.name }} {{ product.title }} нормально видно в экране, но {{ details.ram }} / {{details.internal_storage}} не видны.

<h2>{{ product.brand.name }} {{ product.title }} {{ details.ram }} / {{details.internal_storage}}</h2>

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


Как вывести все последовательности переменных?
<code>
x = 2
y = 4
z = 12

print(x, y, z)
print(x, z, y)
print(y, x, z)
print(y, z, x)
print(z, x, y)
print(z, y, x)
</code>
Как автоматизировать этот процесc?

import itertools

x, y, z = 2, 4, 12

for num in itertools.permutations([x, y, z]):
    print(num)


Telegram бот не выводит кириллические символы
<code>
import telebot

bot = telebot.TeleBot('*токен*')

def tlist():
    tlist = ""
    with open(r"D:\Py\list.txt", "r") as file:
        for line in file:
            tlist += line
    return tlist

@bot.message_handler(content_types=['text'])
def get_text_messages(message):

    if message.text == "/list":
        bot.send_message(message.chat.id, tlist())

bot.polling(none_stop=True, interval=0)
</code>
Вместо "имя1 имя2 имя3", бот выводит "РёРјСЏ1 РёРјСЏ2 РёРјСЏ3".
Кодировка текстового файла UTF-8. Пробовал использовать str и format, та же ерунда.
Как можно решить проблему?

В строку
with open(r"D:\Py\list.txt", "r") as file: нужно добавить кодировку:

 with open(r"D:\Py\list.txt", "r", encoding="utf8") as file:

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


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

 AAA|BBB|CCC|
 ___|___|___|
 0.5|1.6|2.7|
 ___|___|___|
 0.7|2.6|3.7|

Хотел бы получить такой:

  AAA | BBB | CCC |
  ____|_____|_____|
  0.5 | 1.6 | 2.7 |
  ____|_____|_____|
  0.7 | 2.6 | 3.7 |

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

попробуйте так:
<code>
df = df.astype(str).apply(lambda col: ' ' + col + ' ')
</code>


Как преобразовать одномерный массив в двумерный?
Как преобразовать одномерный массив в двумерный так, чтобы в M[i] было только 2 элемента?
<code>
M = [0, 0, 0, 1, 1, 0, 1, 1] # начальное состояние массива

M = [                        # конечное состояние массива
    [0, 0],
    [0, 1],
    [1, 0],
    [1, 1]
]
</code>

M = [M[i:i + 2] for i in range(0, len(M), 2)]


Цикл крутится только один раз
проблема в том, что цикл "for line in file.readlines()": - обрывается после одной попытки, пробовал file.read .readline .readlines

import os
import sys
import uu
import zipfile
from pathlib import Path
def get_subs(file_name):
    start = 'Sub'
    end = 'End'
    file = open(file_name, 'rb')
    out = open('Subs.txt', 'w')
    flag = False
    itog = ""
    for line in file:
        string = line.decode('ISO-8859-1')
        if string == start:
            itog = itog + "\t" + line
            flag = True

        if srting == end:
            itog = itog + "\t" + line
            flag = False

        if flag == True:
            itog = itog + "\t" + line
            out.write(itog)

def macro():
    cwd = os.getcwd()

    #doc_path = sys.argv[1]
    doc_path = "doc_file_clear.doc"
    os.rename(doc_path, "doc_file_clear.zip")
    path = os.path.abspath("doc_file_clear.zip")
    zip_archieve = zipfile.ZipFile(path)
    counter = 1

    for file in zip_archieve.namelist():
        if Path(file).suffix == '.bin':
            zip_archieve.extract(file, cwd)
            os.rename(file, str(counter) + ".text.bin")
            flag = True
            counter = counter + 1

    if flag == True:
        print('GOOD!', counter - 1, '-text finded!')
    else:
        print("Can't find! File is Clear")
    zip_archieve.close()
    path_ = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'word')
    os.rmdir(path_)
    os.rename(path, "doc_file_clear.doc")

    _path_ = os.path.abspath(str(counter - 1) + ".text.bin")
    return _path_

get_subs(macro())

file.bin выглядит так:
одна строчка в нем состоит из (d0cf 11e0 a1b1 1ae1 0000 0000 0000 0000)

d0cf 11e0 a1b1 1ae1 0000 0000 0000 0000
0000 0000 0000 0000 3e00 0300 feff 0900
0600 0000 0000 0000 0000 0000 0100 0000
0100 0000 0000 0000 0050 a444 0200 0000
0100 0000 feff ffff 0000 0000 0000 0000
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
fdff ffff 4000 0000 feff ffff 0400 0000
0500 0000 4500 0000 0700 0000 1e00 0000
0900 0000 0a00 0000 0b00 0000 0c00 0000
0d00 0000 0e00 0000 0f00 0000 1000 0000
1100 0000 1200 0000 1300 0000 1400 0000
1500 0000 1600 0000 1700 0000 1800 0000
1900 0000 1a00 0000 1b00 0000 1c00 0000
1d00 0000 0600 0000 1f00 0000 2000 0000
2100 0000 2200 0000 2300 0000 2400 0000
2500 0000 2600 0000 2700 0000 2800 0000
2900 0000 2a00 0000 2b00 0000 2c00 0000
2d00 0000 2e00 0000 2f00 0000 3000 0000
3100 0000 3200 0000 3300 0000 3400 0000
3500 0000 3600 0000 3700 0000 3800 0000
3900 0000 3a00 0000 3b00 0000 3c00 0000
3d00 0000 3e00 0000 3f00 0000 feff ffff
6500 0000 4200 0000 4300 0000 4400 0000
feff ffff 6400 0000 4f00 0000 4800 0000
4900 0000 4a00 0000 4b00 0000 4c00 0000
4d00 0000 4e00 0000 4100 0000 5000 0000
5100 0000 5200 0000 5300 0000 5c00 0000
5500 0000 5600 0000 5700 0000 5800 0000
5900 0000 5a00 0000 5b00 0000 4600 0000
5d00 0000 5e00 0000 5f00 0000 6000 0000
6100 0000 6200 0000 6300 0000 feff ffff
7600 0000 feff ffff 6700 0000 6800 0000
6900 0000 6a00 0000 6b00 0000 6c00 0000
feff ffff 6e00 0000 6f00 0000 7000 0000
7100 0000 7200 0000 7300 0000 7400 0000
7500 0000 6600 0000 7700 0000 feff ffff
ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff

file.read() - Считывает весь файл в строку

file.readline()  - Считывает только одну строку

file.readlines() - Считывает весь файл в массив (список)
Что-то такое должно получиться:

import re

flag = False
with open('txt.txt', 'r', encoding = 'ISO-8859-1') as file:

    for string in file.readlines():

        itog = ''

        if re.search(r'\bSub\b', string):
            if not re.search(r'\bEnd\b', string):
                itog = itog + "\t" + string
            flag = True

        if re.search(r'\bEnd\b', string):
            itog = itog + "\t" + string
            flag = False
            print(itog)

        if flag == True:
            if not re.search(r'\bSub\b', string):
                itog = itog + "\t" + string
            print(itog)


keyboard.on_press_key() перестает вызывать функцию после компиляции в .exe
keyboard.on_press_key('f7', TranslateAll, suppress=True) при нажатии на F7 вызывает функцию
TranslateAll().
Алгоритм работы
TranslateAll():

Библиотека
pyperclip вытаскивает из буфера обмена текст
Библиотека
googletrans переводит текст

pyperclip вставляет обратно в б/о переведенный текст

Все отлично работает, однако, после компиляции в .exe, после ~10 вызовов функции,
keyboard.on_press_key() перестает реагировать на нажатия или же вызывать функцию. Причем это не сопровождается какими-либо сообщениями в консоли. Просто нажимаю F7 и все - никаких ошибок.
!!! Проблема появляется только при работе с переводчиком
googletrans, если отбросить его и оставить только работу с буфером обмена, то проблема уйдет!
Пробовал указывать код клавиши, вместо 'f7' - проблема осталась.
Я также пробовал заново назначать F7 в
keyboard.hook_key() при ошибке (оборачивал алгоритм в try-except), но это тоже ничего не дало.
Код: Здесь все работает как надо, но если скомпилировать (pyinstaller PythonCode.py), то можно увидеть описанную мной проблему.

from googletrans import Translator
import keyboard
import googletrans
import pyperclip

count = 0                         #счетчик срабатываний функции

def TranslateAll(event):
    global count
    #основной алгоритм
    translator = Translator()
    data = pyperclip.paste()
    result = translator.translate(data, dest='ru')
    pyperclip.copy(result.text)

    count += 1
    print(f'Срабатывание №{count}\n')

#привязка F7 к функции
keyboard.on_press_key('f7', TranslateAll, suppress=True)
keyboard.wait()

Готовый проблемный .exe-файл также можно скачать с моего гугл диска: PythonCode.exe
Также имеется видео с подробным обзором на проблему: видео

Проблема была в строке вызова функции
keyboard.on_press_key('f7', TranslateAll, suppress=True)
Значение параметра
suppress нужно было поменять с
True на
False.


Python количество значение символов в списке
У меня есть список с помощью len посчитал количество элементов в списке получил ответ 5 теперь мне нужно посчитать каждый из значений, как мне это сделать помогите пожалуйста я Python новичок)
ответ должно быть таким
ба = 2
ман = 3
пиёда =5
....
<code>
st="ман ба мактаб меравам пиёда"
arr=st.split()
print(len(arr))

</code>

Примените
len к каждому элементу списка. Проще всего это сделать с помощью спискового включения:

print(*[f'{s} = {len(s)}\n' for s in arr])

 ман = 3
 ба = 2
 мактаб = 6
 меравам = 7
 пиёда = 5

Ну или может более понятный вам будет вариант с обычным циклом
for:

for s in arr:
    print(f'{s} = {len(s)}')

P.S. Отметил ещё чётные цифры надписью по просьбе автора вопроса:

print(*[f'{s} = {len(s)} {"четное" if len(s) % 2 == 0 else ""}\n' for s in arr])

Вывод:

 ман = 3
 ба = 2 четное
 мактаб = 6 четное
 меравам = 7
 пиёда = 5


Проблемы с on_message Discord.py [дубликат]

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

Декораторы event и command в discord.py

                                (1 ответ)

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

И так, мой бот для Дискорда не выполняет команды. Проблема явно в
on_message, так как без этой функции он работает исправно.

@bot.event
async def on_message(message):
    if (message.content.startswith('rp!')):
        print("Command!") # Не обращайте внимание..
        pass
    else:
        print("Default message")
        input = db.show_from_DB(tablename="users", item="messages", member=f"{message.author.mention}") # переменная
        msg = int(str(input[-1])) + 1 # И на это тоже..
        db.update_value_in_DB(tablename="users",item="messages",value=f"{msg}", member=f"{message.author.mention}")

Код команды для которой нужен
on_message

@bot.command()
async def stats(ctx):
    try:
        member = ctx.message.author.mention
        player = db.show_from_DB(tablename="users",item="member",member=f"{str(member)}")
        lvl = db.show_from_DB(tablename="users",item="level",member=f"{str(member)}")
        msgs = db.show_from_DB(tablename="users",item="messages",member=f"{str(member)}")
        rate = db.show_from_DB(tablename="users",item="rate",member=f"{str(member)}")
        await ctx.send(f"Игрок: {player[-1]}\nУровень: {lvl[-1]}\nВсего сообщений: {msgs[-1]}\nРепутация: {rate[-1]}")
    except:
        db.insert_into_DB(isMany=False,tablename="users",fields=f"('{ctx.message.author.mention}', 0, 0, 0)")
        member = ctx.message.author.mention
        player = db.show_from_DB(tablename="users", item="member", member=f"{str(member)}")
        lvl = db.show_from_DB(tablename="users", item="level", member=f"{str(member)}")
        msgs = db.show_from_DB(tablename="users", item="messages", member=f"{str(member)}")
        rate = db.show_from_DB(tablename="users", item="rate", member=f"{str(member)}")
        await ctx.send(f"Игрок: {player[-1]}\nУровень: {lvl[-1]}\nВсего сообщений: {msgs[-1]}\nРепутация: {rate[-1]}")

Я понимаю что мой код - г.. Но тем не менее он иногда работает.
Не знаю что еще написать.. Надеюсь я все понятно изложил

С документации
<code>
@bot.event
async def on_message(message):
    await process_commands(message)
    if (message.content.startswith('rp!')):
        print("Command!") # Не обращайте внимание..
        pass
    else:
        print("Default message")
        input = db.show_from_DB(tablename="users", item="messages", member=f"{message.author.mention}") # переменная
        msg = int(str(input[-1])) + 1 # И на это тоже..
        db.update_value_in_DB(tablename="users",item="messages",value=f"{msg}", member=f"{message.author.mention}")
</code>


Как подсчитать медиану в разрезе недели и преобразовать дату? pandas python
Мне нужно осуществить действие с помощью библиотеки pandas python
У меня есть датафрейм:

     Date     |A_AAA      |A_BBB      |B_BBB|
    __________|___________|___________|______
    24.10.2020|5          |0.6        |17
    __________|___________|___________|______
    25.10.2020|6          |0.7        |20

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

     Year     |Week       |A_AAA |A_BBB|B_BBB|
    __________|___________|______|_____|______
    2020      |31         |срзнач|срзнач|срзнач
    __________|___________|______|______|______
    2020      |32         |срзнач|срзнач|срзнач

Не знаю, как. Подскажите плиз


beautifulsoup несколько значений в regular expression [дубликат]

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

Как выбрать либо то слово либо другое

                                (1 ответ)

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

При поиске тэгов с помощью регулярных выражений необходимо задать несколько значений
<code>
get_link = soup.find('a', text=re.compile('about us' or 'о компании').get('href')
</code>
Это работает, но находит только первое значение.
Подскажите, пожалуйста, как можно задать несколько значений для поиска в регулярных выражениях?

С помощью
|:

(about us|о компании)


Python Передача файлов через socket
Пытаюсь сделать передачу файла через socket. Сам код работает и файлы передаются, НО когда я пытаюсь передать крупный файл (например картинку), данные отдаются один раз и потом все завершается. В итоге та же картинка просто обрывается сверху, так как данные не передались до конца. Как можно это решить? Я понимаю, что нужен цикл, но как его добавить - вообще не понимаю
Код сервера

import socket
s = socket.socket()
host = socket.gethostname()
port = 8080
s.bind((host, port))
s.listen(1)
print(host)
print("waiting...")
conn, addr = s.accept()
print(addr, "connected")
filename = input("enter filename: ")
file = open(filename, "rb")
file_data = file.read(4096)
conn.send(file_data)
print("file sended")

Код клиента:

import socket
s = socket.socket()
host = input("enter host address of sender: ")
port = 8080
s.connect((host, port))
print("connected")
filename = input("enter incoming filename: ")
file = open(filename, "wb")
file_data = s.recv(4096)
file.write(file_data)
file.close()
print("file downloaded")

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

import socket
s = socket.socket()
host = socket.gethostname()
port = 8080
s.bind((host, port))
s.listen(1)
print(host)
print("waiting...")
conn, addr = s.accept()
print(addr, "connected")
filename = input("enter filename: ")
file = open(filename, "rb")
while True:
    file_data = file.read(4096)
    conn.send(file_data)
    if not file_data:
        break
conn.close()
print("file sended")

Код клиента:

import socket
s = socket.socket()
host = input("enter host address of sender: ")
port = 8080
s.connect((host, port))
print("connected")
filename = input("enter incoming filename: ")
file = open(filename, "wb")
while True:
    file_data = s.recv(4096)
    file.write(file_data)
    if not file_data:
        break
file.close()
print("file downloaded")

П.С. короткая запись

while file.write(s.recv(4096)): pass

sendfile на сервере, в виндовс выполнится через цикл с send, на юниксах через sendfile

conn.sendfile(file)

на клиенте нет функции  на высоком уровне, оставь пока recv, но можно размер буфера побольше поставить. Разберусь с offset на низком уровне - допишу пример.


Интерполяционный многочлен Гаусса
<code>
from math import factorial

def p_cal(p, n):
  temp = p
  for i in range(1, n):
    if(i % 2 == 1):
      temp * (p - i)
    else:
      temp * (p + i)
  return temp

x = [0.4, 0.7, 1.0, 1.3, 1.6, 1.9, 2.2]
n = len(x)
y = [[0 for i in range(n)] for j in range(n)]

for i in range(n):
    y[i][0] = x[i] ** 5

for i in range(1, n):
  for j in range(n - i):
    y[j][i] = round((y[j + 1][i - 1] - y[j][i - 1]), 4)

value = float(input('Enter х: '))
sum = y[int(n/2)][0]
p = (value - x[int(n/2)]) / (x[1] - x[0])

for i in range(1,n):
  sum += (p_cal(p, i) * y[int((n-i)/2)][i]) / factorial(i)

print("\nValue at", value, "is", round(sum, 4))
</code>
Почему у меня значение по первой интерполяционной формуле Гаусса вычисляется неверно?
Функция: y = x^5

def p_cal(p, n):
  temp = p
  for i in range(1, n):
    if(i % 2 == 1):
      temp * (p - i)
    else:
      temp * (p + i)
  return temp

у вас
temp не накапливается,
p_cal всегда возвращает
p
надо

temp *= (p - i)


Ошибка при попытке вывести ASCII код нескольких символов, введенных пользователем
Попросите пользователя ввести произвольную строку.
Выведите коды всех символов строки, введённой пользователем.
<code>
str_1 = input('Введите строку: ')
print(ord(str_1))
</code>
Здесь выводит только ASCII код одного символа а дальше выводит ошибку:

TypeError: ord() expected a character, but string of length 2 found

Нужно помочь - объяснить как вывести ASCII код нескольких символов, введенных пользователем!
Заранее спасибо.

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

for char in input('Введите строку: '):
    print(ord(char))

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

print(*[ord(char) for char in input('Введите строку: ')], sep='\n')

вот так покороче:

print(*map(ord, input('Введите строку: ')), sep='\n')


muxer на python
Как попростому упаковать
h264 в
mp4 контейнер для стрима в
html5?
Тащить целый
ffmpeg как-то не хочется, да ещё и источник и приемник будут асинхронными.

gst_app_sink_pull_sample блокирует...

Поставил
asyncio_glib, сигнал на выходе не выполняется... хотя
await должен тут отработать сигналы
asyncio_glib..

import asyncio
import asyncio_glib
asyncio.set_event_loop_policy(asyncio_glib.GLibEventLoopPolicy())
import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst
Gst.init(None)

...

src_v = Gst.ElementFactory.make("appsrc")
src_v.set_property('caps', Gst.Caps.from_string('video/h264'))

videoparse = Gst.ElementFactory.make('rawvideoparse')
mp4mux = Gst.ElementFactory.make("mp4mux", "mux")
sink = Gst.ElementFactory.make("appsink", "sink")
src_v.set_property("emit-signals", True)
sink.set_property("emit-signals", True)
pipeline = Gst.Pipeline()

pipeline.add(src_v)
pipeline.add(videoparse)
pipeline.add(mp4mux)
pipeline.add(sink)

src_v.link(videoparse)
videoparse.link(mp4mux)
mp4mux.link(sink)

def new_buffer(sink, userdata):
    print('new_buffer')
    sample = sink.emit("pull-sample")
    buf = sample.get_buffer()
    (result, mapinfo) = buf.map(Gst.MapFlags.READ)
    userdata.write(mapinfo.data)
    buf.unmap(mapinfo)
    return Gst.FlowReturn.OK

sink.connect("new-sample", new_buffer, of)
pipeline.set_state(Gst.State.PLAYING)

while True:
    data = await reader.read(32768)
    print(rotating(), end="\r", flush=True)
    if not data:
        src_v.emit("end-of-stream")
        break
    else:
        buf = Gst.Buffer.new_allocate(None, len(data), None)
        buf.fill(0, data)
        src_v.emit("push-buffer", buf)

Почему у вас вместо
h264parse стоит
rawvideoparse если видео
video/h264?
Как вариант - попробовать собрать цепочку в консоли с использованием

gst-launch-1.0 filesrc ! h264parse ! mp4mux ! fdsink и посмотреть будут ли падать буфера в консоль.
В коде удобнее использовать:

pipe = Gst.parse_launch('filesrc ! h264parse ! mp4mux ! fdsink name=sink')

sink = pipe.get_child_by_name('sink')

sink.connect(...)


pycharm не видит types в библиотеке telebot
Саму библиотеку telebot он видит а модуль types нет. Скорее всего из-за  обновления python 3.8.4 до 3.9, но информацию по этому поводу не смог найти.

Надо было всего лишь скачать библиотеку pyTelegramBotAPI


Двоичная арифметика python
У меня следующее задание: реализовать двоичную арифметику (сложение, вычитание, сравнение) на python без библиотек. Я реализовал сложение следующим образом:
<code>
number1 = str(input("Введите первое число в 2ой системе: "))
number2 = str(input("Введите второе число в 2ой системе: "))
intSum = int(number1, 2) + int(number2, 2)
result = bin(intSum)[2:]
print(result)
</code>
Загвоздка в том, что мне дана подсказка: "генерировать число с 7,8 разрядов и каждое число записывать в массивы А и В". Что мне нужно переделать? Я совсем не понимаю, чего от меня хотят в подсказке

вы не первый, кто сегодня хочет двоичную арифметику на питоне :)
на счет вопроса - вам же сказано - хранить число в массиве и работать с массивом чисел 0/1, а вы считили - строку перевели в число, а потом обратно в строку
нет уж - делайте все до конца как требуется
<code>
# получить бинарное число в виде массива чисел (бит)
num1 = [*map(int, input("Введите первое число в 2ой системе: "))]
num2 = [*map(int, input("Введите второе число в 2ой системе: "))]

# перевернуть числа для удобства выполнения операций
num1 = num1[::-1]
num2 = num2[::-1]

# дополнить числа нулями
size = max(len(num1), len(num2))

num1 += [0] * (size - len(num1))
num2 += [0] * (size - len(num2))

# сложить 2 числа
overflow = 0
res = []
for obj in zip(num1, num2):
    value = obj[0] + obj[1] + overflow
    overflow = value // 2
    res.append(value % 2)

# если флаг переполнения установлен - добавить бит в начало нового числа
if overflow == 1:
    res.append(1)

# перевернуть число назад
res = res[::-1]

print(''.join(map(str, res)))
</code>


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

st="ман ба мактаб меравам"
arr=st.split()
print(arr)
a=sorted(arr, key=len)
print(a)

использую этот код, хочу использовать If для сортировки по asc и desc, сделал таким образом но не работает помогите пожалуйста, я п Python новичок не судите строга)

st="ман ба мактаб меравам"
arr=st.split()
print(arr)
print('Как вы хотите сортировать?')
print(' [1] - ASC ')
print(' [2] - DESC ')
do=input('Выбрать номер действия: ')

if do == 1:
    a=sorted(arr, key=len)
    print(a)
if do == 2:
    pass

и как мне сортировать по убыванию?

у
sorted есть параметр
reverse его надо поставить
True

sorted(arr, key=len, reverse = True)

а также у вас в
do хранится строка а не число

do = int(input('Выбрать номер действия: '))


MySQLdb Обясните как работать с базами
Есть этот код, он по идеи ищет по базе ID того кто прислал сообщение но как мне возвращать не одну строчку с ID а всю строку со всема параметрами которые находятся там типа (id в базе, ID того кто написал, его баланс и тд), дальше как мне сделать изменение в базе например внести этому человеку на баланс игровую валюту?
<code>
import MySQLdb

db = MySQLdb.connect("<адресс базы>","<логин>","<пароль>","<имя базы>", charset='utf8')
cursor = db.cursor()
cursor.execute("SELECT vk_id FROM vk WHERE vk_id = Тут айди для поиска по базе")
row = cursor.fetchone()
print(row)
</code>

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

SELECT * FROM vk WHERE vk_id=id

Вернется скорее всего ассоциативный массив значений, где ключ название колонки (не помню как называется в Python, кортеж вроде).
Чтобы поменять что-то в БД SQL, используется команда UPDATE (названия полей взял от балды, так как не знаю какие конкретной у вас в таблице)

UPDATE vk SET vk_money=money WHERE vk_id=id

ЗЫ: И да, при передаче данных в строку запроса через execute используйте подставноку данных правильно, в стиле

cursor.execute("SELECT * FROM vk WHERE vk_id=%s", id)

Это убережет вас в будущем от некоторых проблем.


Можно воспользоваться функцией sklearn.preprocessing.minmax_scale():
<code>
from sklearn.preprocessing import minmax_scale

df = pd.read_csv(Path.home() / "Downloads/ppppppp.csv", index_col=0)
df["Disp_scaled"] = minmax_scale(df["Disp"], feature_range=(-1, 1))
</code>


Нужно перевести код из Pascal в Python 3 [закрыт]

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

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

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

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

<code>
    var
      n, k: integer;

    begin
      write('n = ');
      readln(n);
      k := trunc(exp(ln(n) / 3)); //целая часть от кубического корня
      if k * (k + 1) + (k + 2) = n then write('Можно: ', n, ' = ', k, ' * ', k + 1, ' * ', k + 2)
      else write('Нельзя');
      readln
    end.
</code>

Здесь принято писать с чем именно возникли трудности и по возможности предоставлять код, как результат ваших попыток решить проблему :)
Ваш код на Python 3:
<code>
from math import trunc, exp, log1p

n = int(input('n = '))
k =  trunc(exp(log1p(n) / 3))
if k * (k + 1) + (k + 2) == n:
    print(f'Можно: {n} = {k} * {k+1} * {k+2}')
else:
    print('Нельзя')
</code>


Как можно получить продолжительность видео?
У меня есть видео, которое мне нужно обрезать с помощью FFmpeg. Для этого мне нужно получить его полную длительность. Как можно это сделать?

Продолжительность видео хранится в метаданных файла.
Используйте утилиту ffprobe (часть пакета ffmpeg).
Примерно так будет выглядеть команда:
<code>
ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 some_file.mp4
</code>


Автоматическое добавление новой записи в models Django
Пытаюсь реализовать такой функционал.
Есть модель Books и модель Store

class Store(models.Model):
    store_name = models.CharField(max_length=255, blank=False, null=False)
    store_address = models.CharField(max_length=255, blank=False, null=False)

class Books(models.Model):
    book_name= models.CharField(max_length=255, blank=False, null=False)
    book_stored_on = models.ForeignKey(Store, blank=False, null=False, on_delete=models.DO_NOTHING)
    book_price = models.FloatField(blank=True, null=True)

Когда создаётся новая книга, допустим на одном store, я хочу что бы она создавалась и на другом store. Но, сначала, эта книга должна быть записана на первый store и только потом создалась во втором.
И при этом значение book_price для второго store менялось на противоположное значение.

def save(self, *args, **kwargs):
    # создание первой книги
    super().save(*args, **kwargs)

    # создание второй книги
    self.pk += 1
    if self.book_stored_on.id == 1:
        self.book_price *= -1
        self.book_stored_on.id == 2:
    elif self.book_stored_on.id == 2:
        self.book_price *= -1
        self.book_stored_on.id == 1:
    # создание второй книги
    super().save(*args, **kwargs)

    # процесс выборки и отправки данных
    records = 'some data'
    return prepare_model_data(data=records)

Проблема в том, что просто создаётся ещё одна книга на первом сторе, а не на втором. А даже если и создаётся на втором (при условии, что добавлена 1 к book.pk), значение book_price и book_store не изменяется.
в последней строчку не указан return потому, что после сохранения записи в бд, происходит выборка всех значений из бд и отправление их в отдельную функцию, которая их обрабатывает для другого функционала.
Так же есть вопрос касательно id книги. Будет ли правильно, при её создании к id добавить 1, что бы она была записана, а не перезаписана ?

Всё просто. Когда вы работаете с Django пытайтесь думать объектно, иначе зачем ещё использовать фреймворк ? :) Сей час вы меняете один и тот же экземпляр книги, а вам нужно создать ещё один и записать его в БД.
Далее псевдокод, для иллюстрации логики:
<code>
if self.book_stored_on.id == 1:
    new_id = 2
elif self.book_stored_on.id == 2:
    new_id = 1
new_book = Books(
    book_name = self.book_name,
    book_stored_on = new_id,
    book_price = - self.book_price # в задаче стоит поменять цену на противоположную
)
new_book.save()
</code>
P.S. Если вам нужно взять число по модулю используйте функцию abs()


PermissionError: [WinError 5] Отказано в доступе:"path/to/file.txt. Что делать?
<code>
def delete_1(list):
    g = list.curselection()
    try:
        print(list.get(g[0]))
        list.delete(g[0])
        file_path = r'text_files\\{}'.format(str(list.get(g[0])))
        os.remove(file_path)
    except IndexError:
        pass
</code>
Товарищи, столкнулся с проблемой удаления файла. При исполнении кода вылазит ошибка

PermissionError: [WinError 5] Отказано в доступе:
"path/to/example.txt".

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

Проблема была, как я понял, в постановке команд. Дело в том, что я сначала удаляю элемент, а потом пытаюсь его снова получить. То есть код в итоге должен выглядеть вот так:`
<code>
def delete_1(list):
    g = list.curselection()
    try:
        file_path = r'text_files\\' + list.get(g[0])
        list.delete(g[0])
        print(file_path)
        os.remove(file_path)
    except IndexError:
        pass`
</code>


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

class Class:
    def __init__(self, var):
        self.var = var

    def decorator(self, function):
        function()
        print(self.var+1)

    @decorator
    def fun(self):
        print('*Function*')

Python говорит:

    Traceback (most recent call last):
File "test2.py", line 1, in <module>
    class Class:
File "test2.py", line 10, in Class
    def fun(self):
TypeError: decorator() missing 1 required positional argument: 'function'

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

cl = Class(2)
cl.fun = cl.decorator(cl.fun)

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

Когда вы назначаете декоратор внутри класса, вы напрямую обращаетесь к "unbound" функции decorator. Никакого контекста, связанного с инстансом у неё ещё нет. Это не
Class.decorator и не
Class().decorator. Поэтому оборачиваемая функция в неё передаётся первым аргументом(попадает в self).
Именно поэтому интерпретатор сообщает о пропущенном параметре
function

Если вы хотите декорировать методы, то можно вынести декоратор из объявления класса:

def dec(fn):
    def f(self, *args, **kwargs):
        fn(self, *args, **kwargs)
        print(self.var)

    return f

class C:
    def __init__(self, var):
        self.var = var
    @dec
    def bar(self):
        print('bar')

c = C(42);
c.bar()

Хотя, с тем же успехом, можно внести функцию декоратора внутрь класса.
Вызываться она будет всё равно как статическая функция и будет торчать метод объекта, который нельзя вызывать(т.к. при вызове будет передан объект C в качестве fn):

class C:
    def __init__(self, var):
        self.var = var

    def _dec(fn):
        def f(self, *args, **kwargs):
            fn(self, *args, **kwargs)
            print(self.var)

        return f

    @_dec
    def bar(self):
        print('bar')

c = C(42);
c.bar()


Python. Использование супер конструктора. Как сделать так, чтобы при создании экземпляра класса требовалось ввести атрибуты дочернего и род. класса?
Имеется два класса (дочерний и родительский). В обоих определены конструкторы.
Как написать конструктор дочернего класса, чтобы при создании его экземпляра требовалось вводить как атрибуты дочернего, так и родительского? И возможно ли это вообще?
<code>
class Transport:
    def __init__(self, weight, fuelType, bodyColor, maxSpeed, engineCapacity, mileage, acelerationFrom0To100, enginePower):
        self.weight = weight
        self.fuelType = fuelType
        self.bodyColor = bodyColor
        self.maxSpeed = maxSpeed
        self.engineCapacity = engineCapacity
        self.mileage = mileage
        self.acelerationFrom0To100 = acelerationFrom0To100
        self.enginePower = enginePower

class PassengerCar(Transport):
    def __init__(self, countOfPassengerSeats, trunkVolume, interiorColor):
        Transport().__init__() # это не помогает....
        self.countOfPassengerSeats = countOfPassengerSeats
        self.trunkVolume = trunkVolume
        self.interiorColor = interiorColor
</code>

Реализуйте доступ к родительскому классу через super, а не через имя этого класса. Это, как минимум, удобнее. В примере ниже все значения атрибутов одноименны их названиям.
<code>
# Date: October 26th, 2020.
class Transport:
    def __init__(self, weight, fuelType, bodyColor, maxSpeed,
                    engineCapacity, mileage, acelerationFrom0To100,
                    enginePower):
        self.weight = weight
        self.fuelType = fuelType
        self.bodyColor = bodyColor
        self.maxSpeed = maxSpeed
        self.engineCapacity = engineCapacity
        self.mileage = mileage
        self.acelerationFrom0To100 = acelerationFrom0To100
        self.enginePower = enginePower

class PassengerCar(Transport):
    def __init__(self, countOfPassengerSeats, trunkVolume,
                    interiorColor, *args):
        super().__init__(*args)
        self.countOfPassengerSeats = countOfPassengerSeats
        self.trunkVolume = trunkVolume
        self.interiorColor = interiorColor

attributes=(
    "countOfPassengerSeats", "trunkVolume", "interiorColor",
    "weight", "fuelType", "bodyColor", "maxSpeed", "engineCapacity",
    "mileage", "acelerationFrom0To100", "enginePower")
obj=PassengerCar(*attributes)

for attribute in dir(obj):
    if attribute in attributes:
        print(f"<attribute '{attribute}': '{getattr(obj, attribute)}'>")
</code>


Удаление одинаковых элементов списка в цикле
Например есть список
S = [1, 5, 5, 1, 1, 7]. Во время цикла программа вычисляет повторяющиеся элементы, выводит их на экран, и затем должна удалить их из списка. Я пробовал так:

S = [1, 5, 5, 1, 1, 7]
S.sort()
i = 0
for i in S:
    a = S.count(i)
    if a > 1:
        print(i,end=' ')
        S.remove(i)
    i += 1

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

Проблема в том, что у вас перебор списка и удаление из него идут в одном месте.

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

items = [1, 5, 5, 1, 1, 7]
items = list(set(items))
print(items)
# [1, 5, 7]

Либо удаляйте, но в обратном порядке:

items = [1, 5, 5, 1, 1, 7]

for i in reversed(items):
    if items.count(i) > 1:
        items.remove(i)

print(items)
# [5, 1, 7]

Кст, вместо
reversed можно использовать
list, тогда будет создана копия списка и это тоже будет работать, т.к. удаление будет из исходного списка, а перебор у копии списка:

for i in list(items)
# или
for i in items[::-1]


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

Лирическое отступление: обычно под асинхронным поиском, особенно при упоминании асинхронного бэкэнд-фреймворка вроде aiohttp, подразумевается некий соответствующий алгоритм, который выполняется параллельно в СУБД. Асинхронность же на клиентской стороне реализовать значительно проще, даже Flask с этим спокойно справится; в зависимости от RPC, конечно. Вам просто надо кидать запросы с фронтэнда на сервер, и желательно немного оптимизировать, чтобы не убить сервер.
Вариант 1, велосипед
Сделайте на клиентской стороне поле для ввода, изменения которого отслеживаются кодом (для сайтов это будет JavaScript) и отправляются на сервер как поисковая строка.
Здесь важно продумать оптимизации, например:

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

Вполне вероятно, что для этого есть готовые библиотечки, облегчающие жизнь, хотя бы для клиентской стороны, их вдумчивое использование ускорит разработку и вероятно повысит её качество.
Вариант 2, сторонние сервисы
Есть различные сервисы, которые помогают решать проблему поиска по сайту. В простейшем виде можно попробовать прикрутить Google-поиск, из вариантов мощнее есть специализированные SaaS, использующиеся для создания почковых строк на сайтах с крупными базам знаний или онлайн-ретейла. Примеры: Searchanise, Algolia.


Как создать алгоритм матчинга анкет, немного похожий на Леонардо Дай Винчик и Tinder
Пишу бота для Telegram на Python (библиотека aiogram с asyncio), функционал которого чем-то схож с Леонардо Дай Винчик или Tinder. Пользователь начинает поиск и ему поочередно выдаются анкеты из БД. Он может либо "лайкнуть" анкету, либо "дизлайкнуть". Соответственно, когда симпатия взаимна, обоим пользователям отправляется контакт для связи (и так далее).
Модели в БД выглядят следующим образом:
Модель пользователя:

class User(BaseModel):
    id = PrimaryKeyField()  # Постоянный Telegram ID
    mention = CharField(unique=True, null=True)  # Упоминание пользователя в виде @diplomente :)
    phone = CharField(null=True)  # TG - Contact

    name = CharField(null=False)  # По-умолчанию предлагается имя Telegram профиля, но пользователя может сменить
    age = IntegerField()  # Возраст в цифрах
    city = CharField(default="Душанбе")
    photo = IntegerField()  # ID фотографии профиля. Значение только храниться в БД.

    gender = CharField(max_length=1)  # M - Male, F - Female
    search_gender = CharField(max_length=1)  # M - Male, F - Male, B - Both
    description = CharField()  # Описание профиля, информация о себе и цели поиска

Модель симпатий:

class Mutuality(BaseModel):
    first = ForeignKeyField(User)
    second = ForeignKeyField(User)
    status = BooleanField(default=0)  # 0 - дизлайк, 1 - симпатия
    # Когда отправляется симпатия, создается запись в БД, где first - тот, кто отправил симпатию, second - тот, кому она
    # направлена.

Теперь столкнулся со сложностями при реализации:

Как реализовать алгоритм поиска следующей анкеты?
Как избежать дубликатов (повторные отображения анкет, к примеру, ранее друг друга "дизлайкнувших" или друг друга "лайкнувших" и так далее)?

И какие у вас будут советы и рекомендации? Спасибо!

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


Переменная не изменяет свое значение после выхода из метода
Есть метод, в котором проверяется истинность пути и изменение значения переменной.
Проблема с которой я столкнулся:
Переменная checkTypeBool после выполнения метода содержит в себе значение False, хотя путь существует.
Вопрос: как мне изменить значение переменной в методе, что бы после завершения выполнения метода в переменой содержалось True?
<code>
pathDesktop = "C:\\Users\\batth\\Desktop"
pathTrash = "H:\\Trash"
#Должна изменяться в зависимости от того существует ли путь
checkTypeBool = False

#Только для красивого вывода в консоль
tableInfoPath = PrettyTable(["Dekstop Path"])

def checkPath(path, checkTypeBool):
    #Проверка на существования пути
    if os.path.exists(path):
        tableInfoPath.add_row([pathDesktop + " : Path exists"])
        #Изменяем значение переменной, на true, если путь существует
        checkTypeBool = True
        print(tableInfoPath)
    else:
        tableInfoPath.add_row([pathDekstop + " : Path not found"])

checkPath(pathDesktop, False)
#В итоге получаем, что checkTypeBool = False, хотя я ожидаю True
print(checkTypeBool)
</code>

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

checkTypeBool = False

#Только для красивого вывода в консоль
tableInfoPath = PrettyTable(["Dekstop Path"])

def checkPath(path):
    global checkTypeBool
    #Проверка на существования пути
    if os.path.exists(path):
        tableInfoPath.add_row([pathDesktop + " : Path exists"])
        #Изменяем значение переменной, на true, если путь существует
        checkTypeBool = True
        print(tableInfoPath)
    else:
        tableInfoPath.add_row([pathDekstop + " : Path not found"])

checkPath(pathDesktop)
#В итоге получаем, что checkTypeBool = False, хотя я ожидаю True
print(checkTypeBool)

Кст, глобальные переменные не рекомендуются -- они усложняют логику программ. Лучше верните значение из функции:

#Только для красивого вывода в консоль
tableInfoPath = PrettyTable(["Dekstop Path"])

def checkPath(path) -> bool:
    #Проверка на существования пути
    if os.path.exists(path):
        tableInfoPath.add_row([pathDesktop + " : Path exists"])
        print(tableInfoPath)
        return True

    tableInfoPath.add_row([pathDekstop + " : Path not found"])
    return False

checkTypeBool = checkPath(pathDesktop)
print(checkTypeBool)


Добавление элемента из одного списка в другой
Есть такой код, и мне нужно чтобы в "product_bag" можно было добавить не любой элемент, а только тот, который находится в первом списке "shop", как сделать?
<code>
shop = ["Молоко", "Хлеб", "Масло", "Кефир", "Сахар", "Огурец", "Помидор", "Капуста", "Пельмени", "Яблоки"]
print("Сейчас в магазине такие продукты: ")
print(shop)

print("Что будете приобретать?")
product_bag = []
product_bag.append(input())
print("В вашей сумке теперь лежит:", product_bag)
</code>

Просто помещаете ввод в переменную и потом проверяете, есть ли этот продукт в списке:
<code>
new_product = input()
if new_product in shop:
    product_bag.append(new_product)
    print("В вашей сумке теперь лежит:", product_bag)
else:
    print("Такой продукт не найден в магазине!")
</code>


Если граф ациклический, то количество путей из узла X в узел Y есть сумма количества путей из Х во все узлы, из которых есть дуга в Y. Рекурсивно повторяем для каждого из этих узлов.


Подобрать регулярное выражение python
У меня есть список cd команд. Мне нужно выбрать только правильные из них использую re python.
Пример:

echo %cd% #False
cd C:\\User\\data 1\\data
cd C:\\User lldo #False
cd ../directory #True
cd C:\\ #True
text cd C:\\ #False
....

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

(.*)(cd \w*)(.*)

UPD
Там где есть комментарий #True, команда правильная. Там где #False, неправильная. В винде как и в остальных системах есть команда cd. cd принимает один аргумент - путь. Если мы введём такую text cd C: или такую cd C: text команду, то мы получим ошибку. Мне нужно проверить, является ли строка валидной командой cd.

Спасибо

Непонятно, какая задача у ТСа. Первое, что приходит на ум при таком расплывчатом описании:
<code>
import shlex  # Модуль для лексического анализа простого синтаксиса, подобного unix shell

cmds = (  # Команды для проверки
    r'echo %cd%', #False
    r'cd C:\\User lldo', #False
    r'cd ../directory', #True
    r'cd C:\\', #True
    r'text cd C:\\' #False
)

for cmd in cmds:
    tokens = shlex.split(cmd)  # Разбиваем команду на unix-токены

    # Выводим команду и результат проверки на то, что эта команда состоит только из двух токенов и первый токен cd
    print(f'{cmd} #{len(tokens) == 2 and tokens[0] == "cd"}')
</code>


Алгоритм для расчета путей
Есть n пунктов. Между ними n - 1 путей.
Несколько последовательных путей объединяются в магистрали. Необходимо выбрать главный пункт, чтобы к нему можно было добраться  с любого пункта через как можно меньшее количество магистралей. Я создал цикл в котором n - 1 строк с путями превращаются в массивы и складываются в другой массив(вложенные массивы). Помогите, пожалуйста. Заранее благодарен за внимание оказанную помощь!
Входные данные:

n
n - 1 строк в которых указаны пути

Например
n = 5

1. 2 3
2. 1 2
3. 4 1
4. 1 5

P.S.Вот код:

arr = []
n = int(input())
k = n - 1
for i in range(0, k):
    a = input()
    b = [a]
    arr.append(b)

P.P.S.Можно только алгоритм, без кода.

Связный (надо полагать) граф из n узлов и n-1 рёбер есть дерево.
Первым делом проверяем степени всех узлов (количество смежных узлов, оно же количество рёбер из данного узла). Если степени только 1 и 2 - дерево линейное, и подойдёт любая вершина.
Иначе удаляем все узлы со степенью 2, соединяя смежные им. Таким образом, остаётся дерево с "магистралями".
Теперь ищем центр дерева. Для этого поэтапно: находим все вершины со степенью 1 (листья);
удаляем их. Снова находим, снова удаляем. Повторяем пока не останется одна или две вершины - это и есть центр. Вот некая реализация данного этапа.


Как создать n количество строк для ввода данных? [закрыт]

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

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

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

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

Возник вопрос: Дается число n. Нужно создать n строк для ввода данных пользователем с сохранением этих данных. Как это можно реализовать?

n = 3
x = []

for i in range(n):
    x.append(input('inp: '))

for i in x:
    print(i)


Реализация инерции и модель сопротивления шара
Условие задачи:
Реализуйте систему разноразмерных частиц, имеющих одинаковую вертикальную скорость. При прохождении границы сред частицами должны испытывать сопротивление.
Реализуйте более физически достоверную модель сопротивления, зависящего от размера частицы.
Добавьте учёт инерции частиц в зависимости от их массы.
Вопрос:
Как можно реализовать правильно модель сопротивления (у меня реализовано это умножением радиуса частицы на коэффициент 0.2 и по сути взято из головы), такая же проблема и с инерцией частиц. Движение частицы задано в функциях move_ball, iter_1, iter_2, iter_3, iter_stop.
Код:
<code>
import tkinter as tk

root = tk.Tk()
root.title("Силы Сопротивления")
width = 600
height = 600
c = tk.Canvas(root, width=width, height=height, bg="black")
c.pack()
c.create_rectangle(0, height//2, width+2, height+2, fill='grey')

class Ball:
    def __init__(self, c, x1, y1, x2, y2, radius, color="white"):
        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2
        self.radius = radius
        self.c = c
        # resistance можно придумать что-нибудь интереснее
        self.resistance = radius*0.2
        self.ball = c.create_oval(self.x1, self.y1, self.x2, self.y2, fill=color, outline='white', width=2)

    def move_ball(self):

        if c.coords(self.ball)[3] < 300:
            c.move(self.ball, 0, 9)
            c.after(1000//60, self.move_ball)
        elif 300 <= c.coords(self.ball)[3] < 600:
            c.move(self.ball, 0, self.resistance)
            c.after(1000//60, self.move_ball)
        elif c.coords(self.ball)[3] >= 600:
            c.after(1000//60, self.iter_1)

    def iter_1(self):
        if c.coords(self.ball)[3] >= 585:
            c.move(self.ball, 0, -self.resistance)
            c.after(1000//60, self.iter_1)
        elif c.coords(self.ball)[3] <= 600:
            c.after(1000//60, self.iter_2)

    def iter_2(self):
        if c.coords(self.ball)[3] < 600:
            c.move(self.ball, 0, 0.4*self.resistance)
            c.after(1000//60, self.iter_2)
        else:
            c.after(1000//60, self.iter_3)

    def iter_3(self):
        if c.coords(self.ball)[3] >= 595:
            c.move(self.ball, 0, 0.2*-self.resistance)
            c.after(1000//60, self.iter_3)
        elif c.coords(self.ball)[3] <= 600:
            c.after(1000//60, self.iter_stop)

    def iter_stop(self):
        if c.coords(self.ball)[3] <= 600:
            c.move(self.ball, 0, 0.5)
            c.after(1000//60, self.iter_stop)

# Создание частиц
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
r1 = 20
ball1 = Ball(c, 100 - r1, 120 - r1, 100 + r1, 120 + r1, r1, color="#a0a0a0")
ball1.move_ball()

r2 = 30
ball2 = Ball(c, 200 - r2, 120 - r2, 200 + r2, 120 + r2, r2, color="#a0a0a0")
ball2.move_ball()

r3 = 10
ball2 = Ball(c, 300 - r3, 120 - r3, 300 + r3, 120 + r3, r3, color="#a0a0a0")
ball2.move_ball()

r4 = 35
ball2 = Ball(c, 400 - r4, 120 - r4, 400 + r4, 120 + r4, r4, color="#a0a0a0")
ball2.move_ball()

r4 = 15
ball2 = Ball(c, 530 - r4, 120 - r4, 530 + r4, 120 + r4, r4, color="#a0a0a0")
ball2.move_ball()
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

root.mainloop()
</code>

Получившийся код:
<code>
import tkinter as tk

root = tk.Tk()
root.title("Силы Сопротивления")
width = 600
height = 600
c = tk.Canvas(root, width=width, height=height, bg="black")
c.pack()
c.create_rectangle(0, height//2, width+2, height+2, fill='grey')

class Ball:

    def __init__(self, c, x1, y1, x2, y2, radius, mass, color="white"):

        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2
        self.radius = radius
        self.c = c

        self.v = 4
        self.F_str = 0.015 * self.v * radius
        self.mass = mass
        self.Acceleration = (self.F_str / mass) * 50
        self.ball = c.create_oval(self.x1 - self.radius, self.y1 - self.radius, self.x2 +
                                  self.radius, self.y2 + self.radius, fill=color, outline='white', width=2)

    def move_ball(self):
        if c.coords(self.ball)[3] < height//2:
            c.move(self.ball, 0, self.v)
            c.after(1000//60, self.move_ball)
        elif height//2 <= c.coords(self.ball)[3] + self.F_str < height:
            c.move(self.ball, 0, self.F_str)
            c.after(1000//60, self.move_ball)
        else:
            c.move(self.ball, 0, height + 1 - c.coords(self.ball)[3])
            c.after(1000//60, self.iter_1)

    def iter_1(self):
        if c.coords(self.ball)[3] - self.Acceleration >= height - self.mass*0.2:
            c.move(self.ball, 0, -self.Acceleration)
            c.after(1000//60, self.iter_1)
        elif c.coords(self.ball)[3] <= height:
            c.after(1000//60, self.iter_2)

    def iter_2(self):
        if c.coords(self.ball)[3] + self.Acceleration < height:
            c.move(self.ball, 0, self.Acceleration)
            c.after(1000//60, self.iter_2)
        else:
            c.move(self.ball, 0, height + 1 - c.coords(self.ball)[3])
            c.after(1000//60, self.iter_3)

    def iter_3(self):
        if c.coords(self.ball)[3] - self.Acceleration >= height - self.mass*0.1:
            c.move(self.ball, 0, -self.Acceleration)
            c.after(1000//60, self.iter_3)
        else:
            c.after(1000//60, self.iter_stop)

    def iter_stop(self):
        if c.coords(self.ball)[3] + self.Acceleration < height:
            c.move(self.ball, 0, self.Acceleration)
            c.after(1000//60, self.iter_stop)

        else:
            # Конечная координата частицы равна height + 1
            c.move(self.ball, 0, height + 1 - c.coords(self.ball)[3])

def esc(event):
    root.destroy()

root.bind('<Escape>', esc)

# Создание частиц
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
r1 = 40
mass1 = 60
ball1 = Ball(c, 100, 20, 100,
             20, r1, mass1, color="#a0a0a0")
ball1.move_ball()

r2 = 25
mass2 = 50
ball2 = Ball(c, 200, 20, 200,
             20, r2, mass2, color="#a0a0a0")
ball2.move_ball()

r3 = 20
mass3 = 40
ball3 = Ball(c, 300, 20, 300,
             20, r3, mass3, color="#a0a0a0")
ball3.move_ball()

r4 = 36
mass4 = 75
ball4 = Ball(c, 400, 20, 400,
             20, r4, mass4, color="#a0a0a0")
ball4.move_ball()

r5 = 15
mass5 = 10
ball5 = Ball(c, 510, 20, 510,
             20, r5, mass5, color="#a0a0a0")
ball5.move_ball()

r6 = 25
mass6 = 30
ball6 = Ball(c, 570, 20, 570,
             20, r6, mass6, color="#a0a0a0")
ball6.move_ball()
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

root.mainloop()
</code>


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

6/20/2000   0
6/21/2000   0
6/22/2000   0
6/23/2000   400
6/26/2000   200
6/27/2000   2200
6/28/2000   500
6/29/2000   0
6/30/2000   12100

Первое число - 400, тогда заполняем все нули до него значением 400:

6/20/2000   400
6/21/2000   400
6/22/2000   400
6/23/2000   400
6/26/2000   200
6/27/2000   2200
6/28/2000   500
6/29/2000   0
6/30/2000   12100

Наверное, можно как-то и проще, но я не умею:

import pandas as pd

# создаём датафрейм с примером данных
df = pd.DataFrame({'data': [0,0,0,2,34,0,3,4,5,0]})
# заполняем NA начало данных, пока идут нули
df.loc[df.data.cumsum() == 0, 'data'] = pd.NA
# заполнение NA проходом "назад"
df['data'] = df['data'].bfill()
df

Вывод:

    data
0   2
1   2
2   2
3   2
4   34
5   0
6   3
7   4
8   5
9   0


Конвертация смещённой изометрической карты в 2Д массив
У меня есть изометрическая шахматная карта, на которой я хочу реализовать перемещение юнитов.
my map
У меня готова карта перемещений, которая генерирует возможные ходы на 8 направлений, но она работает с 2D-массивом.
Мне нужно перевести смещённую изометрическую карту в 2-D пространство для дальнейших преобразований.
Нужна помощь либо с преобразованием и взаимодействием с моей функцией поиска пути, либо любые другие варианты.
Вот графический пример расположения карты и массива: у меня не алмазная карта, а смещённая.
img1 img2
Результат выполнения:
[-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0]
[-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0]
[-1.0, -1.0, -1.0, -1.0, -1.0, 0.0, -1.0, -1.0, -1.0, -1.0]
[-1.0, -1.0, -1.0, 0.0, 0.5, 1.0, 0.5, 0.0, -1.0, -1.0]
[-1.0, -1.0, -1.0, 0.5, 1.5, 2.0, 1.5, 0.5, -1.0, -1.0]
[-1.0, -1.0, 0.0, 1.0, 2.0, 3.0, 2.0, 1.0, 0.0, -1.0]
[-1.0, -1.0, -1.0, 0.5, 1.5, 2.0, 1.5, 0.5, -1.0, -1.0]
[-1.0, -1.0, -1.0, 0.0, 0.5, 1.0, 0.5, 0.0, -1.0, -1.0]
[-1.0, -1.0, -1.0, -1.0, -1.0, 0.0, -1.0, -1.0, -1.0, -1.0]
[-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0]
Код программы:
<code>
h = 10
w = 10
rm = [[-1.00 for k in range(w)] for g in range(h)]

def generate_move_map(x, y, moves=3):

    if rm[x][y] < float(moves):
        rm[x][y] = float(moves)
        for _x in range(-1, 2):  # Проходит циклом вокруг центра
            for _y in range(-1, 2):
                if (_x, _y) != (0, 0):
                    nX = _x + x
                    nY = _y + y
                    if 0 <= nX < w and 0 <= nY < h:  # w = 10, h = 10
                        if abs(_x) + abs(_y) == 2:
                            move_weight = 1.5
                        else:
                            move_weight = 1
                        t = moves - move_weight * pm[nX][nY]
                        if t >= 0:
                            generate_move_map(nX, nY, t)
                _y += 1
            _x += 1

generate_move_map(5, 5)

for f in rm:
    print(f)
</code>

Нашёл такой способ поиска возможных путей к нужной точке:
<code>
from collections import deque

import config  # Мой файл с настройками

def screenToLinear(scrx, scry):
    linx = scrx - scry // 2
    liny = -scrx - (scry + 1) // 2
    return linx, liny

def linearToScreen(linx, liny):
    rotx = (linx - liny) // 2
    roty = (-linx - liny)
    return rotx, roty

class PathNode:
    def __init__(self):
        self.value = 0
        self.prev = None
        self.cost = None

    def __str__(self):
        return '{:3}'.format(self.value)

fwidth = 25
fheight = 50

pathField = [[PathNode() for _ in range(fheight)] for _ in range(fwidth)]

def inField(x, y):
    return 0 <= x < fwidth and 0 <= y < fheight

def clearPathField():
    for x in range(fwidth):
        for y in range(fheight):
            pathField[x][y].value = 0
            pathField[x][y].prev = None

sideStepCost = 10
cornerStepCost = 15

def sidesOf(x, y):
    if y % 2 == 0:
        return [(x - 1, y - 1), (x - 1, y + 1), (x, y - 1), (x, y + 1)]
    else:
        return [(x, y - 1), (x, y + 1), (x + 1, y - 1), (x + 1, y + 1)]

def cornersOf(x, y):
    return [(x - 1, y), (x + 1, y), (x, y - 2), (x, y + 2)]

def updatePathFieldNode(cx, cy, pending, costField):
    baseValue = pathField[cx][cy].value
    for x, y in sidesOf(cx, cy):
        if inField(x, y):
            newValue = baseValue - sideStepCost - costField[x][y]
            if newValue > pathField[x][y].value:
                pathField[x][y].value = newValue
                pathField[x][y].prev = (cx, cy)
                pathField[x][y].cost = sideStepCost
                pending.append((x, y))
    for x, y in cornersOf(cx, cy):
        if inField(x, y):
            newValue = baseValue - cornerStepCost - costField[x][y]
            if newValue > pathField[x][y].value:
                pathField[x][y].value = newValue
                pathField[x][y].prev = (cx, cy)
                pathField[x][y].cost = cornerStepCost
                pending.append((x, y))

def generatePathField(initx, inity, initValue, costField):
    clearPathField()
    pending = deque()
    if inField(initx, inity):
        pathField[initx][inity].value = initValue
        pending.append((initx, inity))
    while len(pending) != 0:
        (x, y) = pending.popleft()
        updatePathFieldNode(x, y, pending, costField)

def buildPathTo(x, y, cost):
    path = []
    current = (x, y)
    while current is not None:
        path.insert(0, [current, cost])
        cx, cy = current
        current = pathField[cx][cy].prev
    # print(path)
    return path

def create_move_map(posX, posY, points, map):
    costField = refresh_cost_list()
    for tile in map.objects_list:
        costField[tile.column_index][tile.row_index] = float('inf')
    for unit in config.current_player.map_units:  # Запретить движение на места других юнитов
        costField[unit.coords[0]][unit.coords[1]] = float('inf')
    generatePathField(posX, posY, points, costField)
    moves_list = []
    for x in range(fwidth):
        for y in range(fheight):
            if pathField[x][y].value != 0:
                moves_list.append(buildPathTo(x, y, pathField[x][y].cost))
    return moves_list

def refresh_cost_list():
    return [[0 for _ in range(fheight)] for _ in range(fwidth)]
</code>


Как переименовать все файлы в папке в порядке возрастания, по дате их создания?
Есть папка с файлами. Нужно переименовать все файлы в порядке возрастания, по дате их создания. Есть код, но он переименовывает название файлов в зависимость от их размера, что не подходит:
<code>
import os

i = 0
path = "/user/files"
for fileName in os.listdir(path):
    myDest = "video_" + str(i) + ".mp4"
    mySource = path + fileName
    myDest = path + myDest
    os.rename(mySource, myDest)
    i += 1
</code>

from pathlib import Path

fn_pattern = "video_{num:03d}.mp4"

p = Path("/tmp/test")
for i, f in enumerate(sorted(p.glob("*"), key=lambda x: x.stat().st_ctime)):
    # print(f.with_name(fn_pattern.format(num=i)), f.stat().st_ctime)
    f.rename(f.with_name(fn_pattern.format(num=i)))


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

I called him, you know, 5 times this morning and like, he never answered.

Пример вывода: 1
Пробую так:

import numpy as np

n = "I called him, you know, 5 times this morning and like, he never answered."
text = str.split(n)
y = np.array(text)
x = np.count_nonzero(y == "you" and "know")
print(x)

import re

text = """I called him, you know, 5 times this morning and like, he never answered.
You know him, right?
What about 'you knowledge' or 'babayou know' - are you guys going to count them as well? ;)
"""

entries = re.findall(r"\byou know\b", text.lower())

res = len(entries) if entries else 0

print(res)

результат

2


Как собрать в список последние элементы списка списков сгрупировав их по другим элементам?
Есть список со списками, максимальное количество элементов в списке 3:

inp = [
    ['A1', 'B1', 'A1'],
    ['A1', 'B1', 'A2'],
    ['A1', 'B1', 'A3'],
    ['A1', 'B2', 'A4'],
    ['A1', 'B2', 'A5'],
    ['A2', 'B1', 'A6'],
    ['A2', 'B1', 'A7']
]

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

out = [
    ['A1', 'B1', ['A1', 'A2', 'A3']],
    ['A1', 'B2', ['A4', 'A5']],
    ['A2', 'B1', ['A6', 'A7']]
]

Не понимаю, как это можно сделать?

Вариант 1 - используем itertools.groupby(...):

from itertools import groupby

inp = [
    ['A1', 'B1', 'A1'],
    ['A1', 'B1', 'A2'],
    ['A1', 'B1', 'A3'],
    ['A1', 'B2', 'A4'],
    ['A1', 'B2', 'A5'],
    ['A2', 'B1', 'A6'],
    ['A2', 'B1', 'A7']
]

res = [[k[0], k[1], [t[2] for t in c]]
        for k,c in groupby(sorted(inp), key=lambda x: (x[0], x[1]))]

print(res)

результат

[['A1', 'B1', ['A1', 'A2', 'A3']],
 ['A1', 'B2', ['A4', 'A5']],
 ['A2', 'B1', ['A6', 'A7']]]

Вариант 2 - используем модуль Pandas:

import pandas as pd  # pip install pandas

df = pd.DataFrame(inp)
res = df.groupby([0,1])[2].apply(list).reset_index().to_numpy().tolist()


Как установить ожидание нажатия клавиши без цикла while True? Python
Приложение на Python работает в свернутом режиме, ожидая нажатия определенных клавиш. При нажатии, происходит выполнение соответствующего кода. Все отлично работает, но проблема в том, что программа должна быть постоянно запущена и свернута в трее, ожидая нажатия кнопки в цикле
while True:
Это сильно грузит систему.
Как можно сохранить логику работы программы, избавившись от цикла?
Код:

import keyboard

while True:
     if keyboard.is_pressed('F7'):
          #Действия, при нажатии на кнопку F7

     if keyboard.is_pressed('F5'):
          #Действия, при нажатии на кнопку F5

#И так далее

А поставить хук, который будет вызывать нужную функцию при нажатии нужной кнопки вас устроит?
<code>
keyboard.hook_key(key, callback, suppress=False)
</code>


Как получить информацию от пользователя в телеграмм боте?
хочу получить информацию от пользователя в телеграмм боте, что-то типа
<code>
a = input()
</code>
как реализовать такое в боте при помощи pytelegrambotapi?

<code>
@bot.message_handler(commands=['start'])
def start(message):
    msg = bot.send_message(message.chat.id, 'Отправьте мне сообщение')
    bot.register_next_step_handler(msg, start_2)

def start_2(message):
    print('id пользователя', message.chat.id)
    print('имя пользователя', message.from_user.first_name)
    print('фамилия пользователя', message.from_user.last_name)
    print('никнейм пользователя', message.from_user.username)
    print('сообщение пользователя', message.text)
</code>
Один из вариантов.


Как скачать конкретного профиля фото профиля через Telethon?
Есть массив данных об конкретном пользователе, где:
0,
1,
2 - это порядок.

0 - User(id=424322805
1 - is_self=False
2 - contact=True
3 - mutual_contact=False
4 - deleted=False
5 - bot=False
6 - bot_chat_history=False
7 - bot_nochats=False
8 - verified=False
9 - restricted=False
10 - min=False
11 - bot_inline_geo=False
12 - support=False
13 - scam=False
14 - access_hash=2832310685690367355
15 - first_name='Наскаанттка'
16 - last_name=None
17 - username='Anaк3уaGrigorovich'
18 - phone='332426211410'
19 - photo=UserProfilePhoto(photo_id=182543423285424308
20 - photo_small=FileLocationToBeDeprecated(volume_id=257435025
21 - local_id=392782)
22 - photo_big=FileLocationToBeDeprecated(volume_id=2542425
23 - local_id=3932484)
24 - dc_id=2
25 - has_video=False)
26 - status=UserStatusOffline(was_online=datetime.datetime(2020
27 - 10
28 - 22
29 - 12
30 - 39
31 - 43
32 - tzinfo=datetime.timezone.utc))
33 - bot_info_version=None
34 - restriction_reason=[]
35 - bot_inline_placeholder=None
36 - lang_code=None

Как скачать фотографию профиля в нормальной размере и малом размере?

Для скачивания используйте метод download_profile_photo, а для получения превью указывайте параметр
download_big=False.
Пример:

# pip install telethon
from telethon.sync import TelegramClient, events

from config import API_ID, API_HASH

with TelegramClient('my', API_ID, API_HASH) as client:
    print('Picture big:', client.download_profile_photo('me'))
    print('Picture small:', client.download_profile_photo('me', download_big=False))

PS.
Можно в сам download_profile_photo передавать название файла через параметр
file, например:

client.download_profile_photo('me', 'img.jpg')

# Или:
client.download_profile_photo('me', file='img.jpg')


Как посчитать количество комбинаций карт?

Из хорошо перетасованной малой колоды карт (от семерок до тузов, 4 масти, всего 32 карты) вам выдают 6 карт подряд. Какое количество комбинаций выданные карты в сумме дают 50 очков? Считайте, что валет – это 11 очков, дама – 12 очков, король – 13 очков, туз – 14 очков. Число очков для остальных карт совпадает с их номиналом.
Как это можно реализовать на python с помощью модуля itertools?

Не знаю правильно ли посчитал, но так:

from itertools import combinations

cards = list(range(7, 15)) * 4
print(len(list(filter(lambda x: sum(x) == 50, combinations(cards, 6)))))
# 2698

И ещё один, совсем функциональный вариант в качестве развлечения - без лямбды и равно, но с двумя лишними библиотеками. Результат тот же.

from itertools import combinations
from operator import eq
from functools import partial

cards = list(range(7, 15)) * 4
print(sum(map(partial(eq, 50), map(sum, combinations(cards, 6)))))
# 2698

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


Как удалить строки с определенным значением в столбце?
Необходимо удалить все строки со значениями в определенном столбце содержащем вещественные числа, которые удовлетворяют условию - "Все числа которые больше 300.0".
Я создал переменную, но не знаю, как удалить в DataFrame.
<code>
to_drop = [i for i in train.Fare if i > 300.0]
</code>
Как решить данную задачу?

Кажется, что будет легче провести обратную операцию: создать новый датафрейм из старого с теми строками, где числа из столбца Fare будут меньше или равны 300. Пример кода:
<code>
df = df[df.Fare <= 300]
</code>


Как сделать циклический запрос на python по двум переменным
У меня есть запрос

body = {
    "method": "AccountManagement",
    "token": token[1],
    "locale": "ru",
    "param": {
        "Action": "Get"
    },
    "SelectionCriteria": {
        "Logins": [
            login[1]
        ]
    }
}

Переменные, которые вставляются в запрос

token = ["токен1", "токен2"]
login = ["логин1", "логин2"]

Функция отправки запроса и получения результата

def yaBalance():
    while True:
        try:
            req = requests.post(config.ReportsURL4, body)
            req.encoding = 'utf-8'  # Принудительная обработка ответа в кодировке "UTF-8"
            if req.status_code == 400:
                info = ("Параметры запроса указаны неверно или достигнут лимит отчетов в очереди")
                break
            elif req.status_code == 200:
                r = req.json()
                info = (r)
                break
        except:
            info = ("Произошла непредвиденная ошибка")
            break
    return info

Получаю результат через запуск функции yaBalance.
Как мне сделать так чтобы получат результат по всем переменным?
Чтобы в запрос вставлялся сначала токен1, логин1 -> отправка, получение результата, потом подстановка в запрос токен2, логин2 -> отправка, получение результата и тд.

а такое решение не устроит?
<code>
def prepareRequest(token, login):
    return {
        "method": "AccountManagement",
        "token": token,
        "locale": "ru",
        "param": {
            "Action": "Get"
        },
        "SelectionCriteria": {
            "Logins": [
                login
            ]
        }
    }

def yaBalance():
    token = ["токен1", "токен2"]
    login = ["логин1", "логин2"]

    for obj in zip(token, login):
        request = prepareRequest(obj[0], obj[1])
        # код с работой сформированного запроса

yaBalance()
</code>


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

Ввести с клавиатуры строку и определить является ли она полиндромом. Учесть что символы знаков припинания и разделения текста не учитываются при поиске полиндрома, учитываются только буквы и цифры. Причем ручной выбор символов будет низко оценен!

str_1 = input()

print(f" {str_1} is Polindrom" if str_1 == str_1[::-1] else f" {str_1} is NOTT Polindrom")
Условий вроде никаких нет кроме того что ручной выбор символов будет низко оценен
Кони, топот, инок,
Но не речь, а черен он.
Идем, молод, долом меди.
Чин зван мечем навзничь.
Голод, чем меч долог?
Пал, а норов худ и дух ворона лап.
А что? Я лав? Воля отча!
Яд, яд, дядя!
Иди, иди!
Мороз в узел, лезу взором
Солов зов, воз волос.
Колесо. Жалко поклаж. Оселок.
Сани, плот и воз, зов и толп и нас.
Горд дох, ход дрог.
И лежу. — Ужели?
Зол, гол лог лоз.
И к вам и трем с смерти мавки.

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

line = "Горд дох, ход дрог.\nИ лежу. — Ужели?"

import re
line = re.sub('[!@#$\n-.,]', '', line)

проверка на палиндром после преобразований делается так:

print("палиндром" if line == line[::-1] else "не палиндром")

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

line = line.upper()

P.S.
полный код:

import re

# удалить символы
line = re.sub('[!@#$\n-.,]', '', line)

# перевести строку в верхний регистр (чтобы все буквы были одинаковыми и не было ситуации с буквами "A"/"a"
line = line.upper()

# проверить строку на палиндром
print("палиндром" if line == line[::-1] else "не палиндром")

чтобы не перечислять запрещённые символы
[!@#$\n-.,], лучше написать регулярку по удалению всех символов кроме букв -
[a-я,А-Я]
P.P.S.
непонятное условие "ручной выбор символов будет низко оценен"
потому что иначе можно использовать метод
replace для удаления ненужных символов:

line = line.replace('!', '')
line = line.replace('-', '')

и т.д.


Как найти линейно зависимые векторы в матрице?
Нужно найти линейно зависимые векторы в матрице произвольного размера. В примере такими векторами есть второй и четвертый.
<code>
import numpy as np

matrix = np.array([
    [1, 0, 1, 1, 1, 0],
    [0, 0, 0, 1, 0, 0],
    [1, 0, 0, 0, 0, 1],
    [0, 0, 0, 1, 0, 0]
    ])
</code>
Пробовал банальным перебором, но получилось очень громоздко и криво, поэтому даже не стал дописывать. Надеюсь, есть способ проще.
Еще пытался использовать np.linalg.eig, но не могу разобраться как ее правильно использовать.

По идее, надо смотреть матрицу корреляции, которую даёт
np.corrcoef, но как её правильно интерпретировать я сходу не соображу. Хотя и вижу единички не на диагонали:

print(np.corrcoef(matrix))

Вывод:

[[ 1.          0.31622777 -0.25        0.31622777]
 [ 0.31622777  1.         -0.31622777  1.        ]
 [-0.25       -0.31622777  1.         -0.31622777]
 [ 0.31622777  1.         -0.31622777  1.        ]]

Подумал ещё, сочинил вот такого монстра:

print(np.nonzero(np.isclose(np.abs(np.corrcoef(matrix) - np.eye(matrix.shape[0])), 1.)))

Пошагово:

corrcoef - берём матрицу корреляции
вычитаем
eye - убираем единицы с диагонали (корреляция векторов с самими собой нас не интересует)

abs - берём абсолютное значение коэффициентов корреляции (отрицательная корреляция - тоже корреляция)

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

nonzero - получаем индексы найденных линейно коррелирующих векторов

На выходе:

(array([1, 3]), array([3, 1]))

Интерпретировать можно так (учитывая, что индексация в Питоне идёт с 0, т.е. в вашем случае имеем векторы под индексом 0, 1, 2, 3): вектор 1 линейно коррелирует с вектором 3; и наоборот: вектор 3 линейно коррелирует с вектором 1.


Как подсчитать период(мощность) генератора псевдослучайных чисел – random?
Как подсчитать период(мощность) генератора псевдослучайных чисел – random? Выдается ошибка памяти.
<code>
import random
mass = []

def py_random():
    mass.append(random.random())
    for i in range(1, 100000000):
        mass.append(random.random())
        if mass[i] == mass[0]:
            return i
print(py_random())
</code>

def py_random():
    n = random.random()
    i = 0
    while True:
        n0 = random.random()
        if n0 == n: return i
        i += 1


Как найти наименьший множитель в python?

if __name__ == '__main__':
    a = int(input())
    b = int(input())

    i = 1
    j = 1

    for i in range(2, 10000):
        if i != 0:
            if a / i == 0 and b / i == 0:
                print(i)
                break

    for j in range(2, 10000):
        if j / a == 0 and j / b == 0:
            print(j)
            break

мне нужно найти наибольшее натуральное число, на которое
a и
b делится без остатка и наименьшее натуральное число, которое делится на
a и
b без остатка

Наибольший общий делитель:

def bcs(a, b):
    while a!= 0 and b!= 0:
        if a>b:
            a%=b
        else:
            b%=a
    print(a+b)

Наименьшее общее кратное:

def lcm(a, b):
    m = a * b
    while a != 0 and b != 0:
        if a > b:
            a %= b
        else:
            b %= a
    print(m // (a + b))


Помогите оптимизировать рабочий код. Python
Нужно найти максимальное произведение двух чисел в списке. Числа могут быть и отрицательные. Код рабочий, но тестирующая программа выдаёт Time Limit Exceeded. Как можно его оптимизировать? Интересно можно ли преобразовать имеющихся 2 for в list comprehension, ибо у меня за 3 часа это сделать так и не получилось.
<code>
def composition():
    s = [int(i) for i in input().split()]
    lists = []
    total = 0
    for i in range(len(s)):
        for j in range(len(s)):
            if s[i] * s[j] > total and i != j:
                total = s[i] * s[j]
                lists.append(s[i])
                lists.append(s[j])
    a = lists[-1]
    b = lists[-2]
    if a < b:
        return a, b
    return b, a
print(*composition())
</code>

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

data = sorted([*map(int, input().split())])

print(data[0], data[1]) if data[0] * data[1] > data[-1] * data[-2] else print(data[-1], data[-2])

более короткое решение:

data = sorted([*map(int, input().split())])

print(*max(data[:2], data[-2:], key=lambda obj: obj[0] * obj[1]))


Как сохранять текстовые файлы Python в определённую папку?
<code>
users = {}
filename = 'phonenumbers.txt'
flag = 1

while flag:
    message = input("Enter kommand: ")

    try:
        if message.lower().strip() == 'wr':
            user_name = input("Enter name and surname: ")
            user_phone = input("Enter user's phone: ")
            users[user_name] = user_phone

            with open(filename, 'a') as f_object:
                for key, value in users.items():
                    f_object.write(key + ': ' + value + '\n')

        elif message == 'pr':
            f = open(filename)
            while True:
                line = f.readline()
                if len(line) == 0: # Нулевая длина обозначает конец файла (EOF)
                    print("File is empty")
                    break
                print(line, end='')

        elif message == 'cl':
             with open(filename, "w"):
                pass

        elif message == 'exit':
            flag = False
    except FileNotFoundError:
        msg = "Sorry, the file " + filename + " does not exlist."
        print(msg)
</code>
Начал изучать Python по книге Abyteofpython там была задача сделать телефонную книгу, решил дополнить её так, что бы он сохранял текстовый документ в определённую папку. Может какие библиотеки есть для этого?

<code>
file = 'dir1/dir2/file.txt'
with open(file, 'w') as file:
    file.write()
</code>
Вся магия, просто указываете полный путь до папки.


if и else в python
Не понимаю как сделать, чтобы писалась ошибка, когда выбрали цифру меньше 1 или больше 10, поставил if перепробовал все значения, ничего не работает...
<code>
mobile_phone_list = ["","realme XT", "Iphone 11", "Honor 20", "Samsung A51", "Iphone 6", "Xiaomi Redmi Note 8", "Honor 9 Lite", "Samsung A21", "Iphone XR", "realme X"]

print("Cписок моделей телефонов:", mobile_phone_list)

len(mobile_phone_list)-1

for i in mobile_phone_list:
    len(mobile_phone_list)-1
print("Всего моделей телефонов:",len(mobile_phone_list)-1)

print("Вам достался телефон в подарок, введите любую цифру от 1 до 10: ")

print(mobile_phone_list[int(input())])
if mobile_phone_list == "0":
    print("Ошибка. Введите любую цифру от 1 до 10.")

print("Поздравляем, вы получили этот телефон абсолютно бесплатно!", )
</code>

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

index = int(input())
print(mobile_phone_list[index])
if index == 0:
    print("Ошибка. Введите любую цифру от 1 до 10.")

Также обрати внимание, что запись
len(mobile_phone_list)-1 не делает ничего, так как результат никуда не записывается.


Отфильтровать по датам все CSV файлы из одной папки и сохранить отфильтрованные в другую папку
Как сделать, чтобы перебрать файлы из папки
folder_1 в
folder_2. В
folder_1 есть CSV файлы, в которых по дате от меньшей к большей находятся значения.
Как обрезать лишние даты в файле и оставить только например с 2005.01.01 по 2014.10.01?
Это цель перебора, закинуть во вторую папку обрезанные файлы.

import pandas as pd
import pandas_datareader.data as wb

from pathlib import Path
import shutil

p = Path(r"D:/folder_1")
res = Path(r"D:/folder_2")

for f in p.glob("*.csv"):
    df = pd.read_csv(f)

Создайте функцию, которая будет читать CSV в DataFrame, фильтровать данные по датам и записывать результат в указанную директорию. После этого мы можем воспользоваться
Path.glob("*.csv"), чтобы обработать этой функцией все файлы в исходной директории:

import pandas as pd
from pathlib import Path

src = Path.home() / "Downloads/DropMeFiles_jLSNp"
tgt = Path.home() / "Downloads/DropMeFiles_jLSNp/result"

def do_the_job(file, dt_from, dt_to, tgt_dir=tgt, **kwargs):
    df = pd.read_csv(file, **kwargs)
    df = df.query(f"@dt_from <= index <= @dt_to").dropna(how="all")
    if not df.empty:
        df.to_csv(tgt_dir / file.name)

_ = [do_the_job(f, "2005-01-01", "2014-10-01",
                index_col=0, parse_dates=True)
     for f in src.glob("*.csv")]


Фиксированные значения в models django
Пытаюсь сделать модель, которая бы смогла бы при деплое на сервер, сохранить список который я задал.
Но при этом, что бы у пользователя, была возможность добавлять туда свои значения. А так же, что бы пользователь не мог изменить мой заданный список.
models.py

from django.db import models

PRIORITY_CHOICES = ((1, 'High'),
                    (2, 'Medium'),
                    (3, 'Low'))

class MyModel(models.Model):
    priority = models.IntegerField(choices=PRIORITY_CHOICES)

view.py

class MyModelCreate(generics.CreateAPIView):
    authentication_classes = [SessionAuthentication, BasicAuthentication]
    permission_classes = [IsAuthenticated]
    serializer_class = MyModelSerializer

serializer.py

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = [
            'priority',
        ]

В drf всё отображается корректно , но ввести свой вариант нельзя. Это нужно создавать ещё одну модель, и через неё переопределять MyModel ?

Если читать документацию, по Django относительно параметра choices, там есть такой замечательный абзац:

Note that choices can be any sequence object – not necessarily a list
or tuple. This lets you construct choices dynamically. But if you find
yourself hacking choices to be dynamic, you’re probably better off
using a proper database table with a ForeignKey. choices is meant for
static data that doesn’t change much, if ever.

Если пересказать суть:
Значение параметра
choices может быть любым объектом последовательности, не обязательно
list или
tuple (самому не приходилось разбираться, поди, речь про генераторы или о чем-то таком, что делает чувак из enSO). Однако, скорее всего, такой путь будет признан грязным хаком и лучше использовать надлежащим образом внешний ключ.
choices был задуман только для данных, которые изменяются не чаще, чем никогда.
Как грамотный путь будет выглядеть в контексте примера кода из вопроса:

from django.db import models

class Priority(models.Model):
    # Таблицу экземпляров этой модели надо предзаполнить, это можно сделать в файле миграции
    # Придется предусмотреть логику, чтобы предзаполненные элементы нельзя было изменять/удалять кому ни попадя
    level = models.IntegerField()  # 1,2,3...
    name = models.IntegerField()  # High, Medium, Low...

class MyModel(models.Model):
    priority = models.ForeignKey(Priority, on_delete=models.CASCADE)