Ввода массива в несколько строк [закрыт]

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

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

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

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

Пользователь изначально вводит размер массива
На основе этого я создаю нулевую матрицу.

line, column = input().split()
matrix = np.zeros((int(line), int(column)), dtype=int)

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

user input 7 2 8 9 5
user input 5 6 2 1 3

import numpy as np

line, column = input().split()
matrix = np.zeros((int(line), int(column)), dtype=int)

for i in range(int(line)):
    for (j, el) in enumerate(input().split()):
        matrix[i][j] = el

print(matrix)


2 списка делители [закрыт]

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

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

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

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

Реализовать функцию которая создаст новый список из элементов первого списка, взятых по одному разу, таких, для которых во втором списке есть делители данного числа (числа, отличные по модулю от самого числа, а также 0 и 1)
Например
<code>
({ 7, 12, 0, 8, -21, 145, 100, 17 }, { 4, 3, 0, -1, -8, 29, 7 })
→ { 12, 8, -21, 145, 100 }
</code>

first = [int(i[:-1]) for i in input().split()]
second = [int(i[:-1]) for i in input().split()]

ans = []

for i in first:
    for j in second:
        if i != 0 and j != 0 and abs(j) != 1 and i % j == 0 and abs(i) != abs(j):
            ans.append(i)
            break

print(ans)


Что и зачем класс Variable PyTorch?
Читая неплохую статью о PyTorch
обнаружил такое:

x = Variable(torch.ones(2, 2) * 2, requires_grad=True)

В статье не говорилось, но без предваряющего кода:

import torch
from torch.autograd import Variable

Оно не работало.  Я не понял зачем этот класс нужен и в чем его отличие от Tensor.
Вот что говорит help():

help(Variable)
Help on class Variable in module torch.autograd.variable:

class Variable(torch._C._LegacyVariableBase)
 |  # mypy doesn't understand torch._six.with_metaclass
 |
 |  Method resolution order:
 |      Variable
 |      torch._C._LegacyVariableBase
 |      builtins.object
 |
 |  Data descriptors defined here:
 |
 |  __dict__
 |      dictionary for instance variables (if defined)
 |
 |  __weakref__
 |      list of weak references to the object (if defined)
 |
 |  ----------------------------------------------------------------------
 |  Static methods inherited from torch._C._LegacyVariableBase:
 |
 |  __new__(*args, **kwargs) from builtins.type
 |      Create and return a new object.  See help(type) for accurate signature.

Ну легче не стало...
Вот код с использованием Variable:

import torch

from torch.autograd import Variable
x = Variable(torch.ones(2, 2) * 2, requires_grad=True)

z = 2 * (x * x) + 5 * x
z.backward(torch.ones(2, 2))
print(x.grad)
tensor([[13., 13.],
        [13., 13.]])

Variable это надстройка над
Tensor, которая позволяет подсчитывать градиенты для обратного распространения ошибки.
Из указанной в вопросе ссылки:

Автоматическое дифференцирование в PyTorch

В библиотеках глубокого обучения есть механизмы вычисления градиента ошибки и обратного распространения ошибки через вычислительный граф. Этот механизм, называемый автоградиентом в PyTorch, легко доступен и интуитивно понятен. Переменный класс — главный компонент автоградиентной системы в PyTorch. Переменный класс обертывает тензор и позволяет автоматически вычислять градиент на тензоре при вызове функции
.backward(). Объект содержит данные из тензора, градиент тензора (единожды посчитанный по отношению к некоторому другому значению, потеря) и содержит также ссылку на любую функцию, созданную переменной (если это функция созданная пользователем, ссылка будет пустой).

Очевидно кто-то перевел
Variable как
Переменный класс. ;)
P.S. здесь можно найти ответы на этот вопрос на английском
P.P.S. лучше стараться читать туториалы в оригинале, тогда не будет возникать "проблем перевода", как выше.


Объединение ячеек по условию с помощью pandas python3
Помогите пожалуйста в решении проблемы.
Существует таблица примерно такого вида:

clmn1
clmn2
clmn3

11111
ooooo
11

11111
ppppp
11

22222
nnnnn
22

33333
hhhhh
33

33333
jjjjj
33

33333
bbbbb
33

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

clmn1
clmn2
clmn3

11111
oooooppppp
11

22222
nnnnn
22

33333
hhhhhjjjjjbbbbb
33

Программа должна по уникальным id из первого столбца сложить текст из второго столбца.

res = df.groupby("clmn1").agg({"clmn2":"sum","clmn3":"first"}).reset_index()

res:

   clmn1            clmn2  clmn3
0  11111       oooooppppp     11
1  22222            nnnnn     22
2  33333  hhhhhjjjjjbbbbb     33


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

from collections import OrderedDict
# Использую данное упорядочивание, чтобы при выводе результата сопоставления не терялась последоваительнгость open_pass.
# Читал, что dict умеет запоминать порядок вставки, но пока не смог разобраться.
open_pass = list('Password') # вдальнейшем будет так list(input('Enter open part of password: '))
secure = {'!Q':'a', '_>':'b', ':3':'c', 'N9':'d', '0.':'e', '=}':'f', '@#':'g', '](':'h', 'ay':'i', 'V*':'j',
          '$%':'k', '&j':'l', '+-':'m', 'k#':'n', '3,':'o', '[<':'p', '.,':'q', 'aP':'r', 'Bf':'s', 'I;':'t',
          'S6':'u', '_':'v', 'C;':'w', 'ns':'x', 'R|':'y', ')o':'z', '&z':'A', '%h':'B', '$)-':'C', 'B;':'D', 'lK':'E',
          'lJ':'F', '||':'G', 'ld':'H', '()':'I', '}{':'J', '+=_':'K', '__0':'L', '&^%':'M', '><?':'N', 'hsj':'O',
          '|][':'P', 'm<':'Q', 'klH':'R', '(!*':'S', 'mH':'T', 'ad':'U', 'kj':'V', ')as':'W', '/.L':'X', 'zdf':'Y',
          ']|p':'Z', 'zja':'1', 'okk':'2', '@34':'3', 'l}|':'4', 'xn':'5', 'zsf':'6', '89L':'7', '#4':'8', 'lL':'9',
          'Opk':'0'} # словарь в котором приводятся соответствия символов к шифруемым значениям
reversed_dict = {x: y for y, x in secure.items()} #реверс словаря для шифровки
result = OrderedDict()
for a in open_pass:
    result[a] = reversed_dict[a]
print(result)

В результате получаю:

OrderedDict([('P', '|]['), ('a', '!Q'), ('s', 'Bf'), ('w', 'C;'), ('o', '3,'), ('r', 'aP'), ('d', 'N9')])

Как видно в результате 's' выводится 1 раз, а в шифруемом пароле идет подряд 2 раза. Вопрос, как сделать, чтобы выводились все символы из шифруемого пароля при условии, что они повторяются?
Спасибо большое за уделенное время. Извините за глупые вопросы.

Словарь - это всегда словарь. Что просто
dict, что
OrderedDict - это всё-равно словарь. А в словаре ключ не может повторяться.
Пишите результат в список (список - это упорядоченная структура, где элементы могут повторяться). Не совсем понимаю, что вы хотите на выходе, но вот максимально близко к вашему выводу и со всеми символами:

result = [(a, reversed_dict[a]) for a in open_pass]
print(result)

Вывод:

[('P', '|]['), ('a', '!Q'), ('s', 'Bf'), ('s', 'Bf'), ('w', 'C;'), ('o', '3,'), ('r', 'aP'), ('d', 'N9')]

Просто закодированная строка, без ключей словаря, а также раскодирование:

result = ''.join([reversed_dict[a] for a in open_pass])
print(result)

restore = ""
buff = ""
for ch in result:
    buff += ch
    if buff in secure:
        restore += secure[buff]
        buff = ""
print(restore)

Вывод:

|][!QBfBfC;3,aPN9
Password


как изменить тип данных числа в Python
Тип числа 1/3 - это 'float'.
Как перевести число из одного типа в другой (float16, float32, float64)?

import numpy as np
a = np.array([1/3], dtype=np.float64)
b = a.astype(np.float32)
c = a.astype(np.float16)

print(type(a[0]))
print(type(b[0]))
print(type(c[0]))


Не удаётся найти "libc.so.6" при запуске Python скрипта в Termux на Android
Я обфусцировала свой
python скрипт с помощью pyarmor. Для запуска скрипта нужна библиотека
_pytransform.dll, при запуске через
termux на
Android —
_pytransform.os. Я получила платформу на
Android с помощью
distutils.util.get_platform() —
linux-aarch64. На сайте с разными сборками этой библиотеки скачала Armv8 64-bit. При запуске обфусцированного скрипта теперь выводится ошибка
dlopen failed library libc.so.6 not found. Как исправить данную ошибку?

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

pyarmor download android.aarch64 # или имя другой платформы

Тогда нужная библиотека появится в
~/.pyarmor/.
Или сразу обфусцировать под конкретную платформу (docs):

pyarmor obfuscate --platform android.aarch64 ...


Объединение столбцов с суммированием значений в ячейках по одинаковому значению столбца
Есть два датайрейма А и В.
А:

P1 P2 P3
12 57 aa
23 23 bb
31 23 cc
46 12 dd

B:

P1 P4  P3
23 NaN bb
56 23  aa
63 34  aa
10 29  cc

Нужно объединить их по столбцу P3 так, чтобы в самом столбце Р3 не было дублирующихся значений. В случае, если в датафреймах А и В есть строка с одним и тем же значением в столбце Р3, то значения в других столбцах с одинаковым названием должны суммироваться. Я использую код:

C = pd.concat([A, B], sort = True)

он дает результат

P1 P2  P3 P4
12 57  aa NaN
23 23  bb NaN
31 23  cc NaN
46 12  dd NaN
23 NaN bb NaN
56 NaN aa 23
63 NaN aa 34
10 NaN cc 29

Желаемый результат:

P1  P2  P3 P4
131 57  aa 57
46  23  bb NaN
41  23  cc 29
46  12  dd NaN

Попробуйте сделать так:

res = pd.concat([df1, df2]).groupby("P3").sum(min_count=1).reset_index()
# min_count в аггрегаторе нужен, чтобы NaN возвращались как NaN, иначевы вместо них
# получите нули.

res:

   P3   P1    P2    P4
0  aa  131  57.0  57.0
1  bb   46  23.0   NaN
2  cc   41  23.0  29.0
3  dd   46  12.0   NaN

Можно еще сделать то же самое с приведением типов:

res = pd.concat([df1, df2]).groupby("P3").sum(min_count=1).reset_index().convert_dtypes()

res:

   P3   P1  P2    P4
0  aa  131  57    57
1  bb   46  23  <NA>
2  cc   41  23    29
3  dd   46  12  <NA>

если добавить

res = res.reindex(sorted(res.columns), axis=1)

то получите исходную сортировку фрейма лексиграфически по именам колонок:

    P1  P2  P3    P4
0  131  57  aa    57
1   46  23  bb  <NA>
2   41  23  cc    29
3   46  12  dd  <NA>


Как отбросить символы в тексте, состоящим из 2000 и более символов, до этих 2000 символов на Python?
Я пытаюсь сделать дискорд бота википедию, который получает запрос и выдаёт ответ исходя из представленной информации. Проблема заключается в том, что некоторые ответы из википедии состоят из количества символов, которое недопустимо в дискорде.
Для запросов из википедии использую вот такой код:

a = wikipedia.summary(input("Введите запрос: "))

А для отбрасывания символов использовал:

print('.'.join(a.split('.')[:-1]))

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

Обрезать до 2000 символов, потом обрезать до последней точки (убрать последнее незаконченное предложение), или оставить как есть (если точка не нашлась):
<code>
# "qwer. tyui. yui".rpartition('.') -> ("qwer. tyui", ".", " yui")
# "qwer tyui yui".rpartition('.') -> ("", "", "qwer tyui yui")
left, dot, right = text[:2000].rpartition('.')
text = left + dot if left else right  # вернуть left + dot, если в left что-то есть, иначе вернуть right
print(text)
</code>


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

@contexlib.contextmanager
def process_started(process: mylib.Process) -> XXX: # ?
    process.start()

    try:
        yield XXX # ?
    except BaseException as e:
        raise e # reraise any exception
    finally:
        process.finish()

То есть ему не надо возвращать какое-то значение, должен использоваться так:

with process_started(process):
    do_background_stuff()

Что в таком случае надо указывать вместо
XXX? Какой возвращаемый тип и значение у
yield?

Ничего не возвращайте. В аннотации укажите
None.
yield поддерживает такой синтаксис (который не отличается от
yield None):

import contextlib

@contextlib.contextmanager
def f():
    print('before')
    yield
    print('after')

with f():
    print('within')

$ python yield.py
before
within
after


Удаление столбцов в переборе python
Изучаю python для ИИ
Я хочу научиться работать с большими данными. Есть данные о пользователях - таблица из n столбцов, которые обрабатываются через логическую регрессию.
Столбцы имеют различные типы, которые я заранее преобразованию.
Мне нужна помощь в придумывании алгоритма откидывания менее значимых столбцов для анализа данных.
То есть придумать метод для перебора всех возможных откидывания столбцов (всех вариантов исключений), чтобы в первом случае убрали лишь первый, во втором второй, а в n третий и пятый
Если есть статьи, которые я пропустил или уже готовые решения, то всегда рад самостоятельно изучить

Почитайте для начала какие варианты отбора фич предлагает популярная библиотека
scikit-learn: Feature selection
На самом деле это довольно широкая и неоднозначная тема. Отбор фич может хорошо себя показать на одних данных (тренировочных) и плохо на других (тестовых). А может при небольшой потере в качестве значительно ускорить анализ данных. А может даже и наоборот улучшить качество. Случаи разные бывают.
В продвинутых алгоритмах машинного обучения вроде
Random Forest или
XGBoost есть встроенные мерилки полезности фич, можно ими воспользоваться для отбора фич.
И есть ещё
permutation importance, с помощью которой тоже можно отбирать фичи, но по моему опыту она тоже штука неоднозначная, всё надо пробовать на конкретных данных.
А ещё есть такие библиотеки для автоматизированного отбора фич, как Boruta и BoostARoota. У второй библиотеки, кстати, хорошо расписано, как она собственно отбирает фичи, это полезно почитать.


Принт не выводит результаты. Python
Я решаю задачку, и хочу вот посмотреть как она отрабатывает, но принт ничего не выводит. Пробовал просто через запятую joke склеивать и ide жаловалась. Сделал через формат: не жалуется, но не выводит.
КОД И ЗАДАНИЕ:

"""
5. Реализовать функцию get_jokes(), возвращающую n шуток, сформированных из трех случайных слов, взятых из трёх списков:
nouns = ["автомобиль", "лес", "огонь", "город", "дом"]
adverbs = ["сегодня", "вчера", "завтра", "позавчера", "ночью"]
adjectives = ["веселый", "яркий", "зеленый", "утопичный", "мягкий"]
        Например:
# >>> get_jokes(2)
["лес завтра зеленый", "город вчера веселый"]

Документировать код функции.
Сможете ли вы добавить еще один аргумент — флаг,
разрешающий или запрещающий повторы слов в шутках (когда каждое слово можно использовать только в одной шутке)?
Сможете ли вы сделать аргументы именованными?

"""

    from random import choice

    nouns = ["автомобиль", "лес", "огонь", "город", "дом"]
    adverbs = ["сегодня", "вчера", "завтра", "позавчера", "ночью"]
    adjectives = ["веселый", "яркий", "зеленый", "утопичный", "мягкий"]
    list_1 = []

    def get_jokes(n, flag = False):
        for i in range(n):
            random_index = choice(nouns)
            random_index_1 = choice(adverbs)
            random_index_2 = choice(adjectives)
            joke = "{} {} {}".format(random_index, random_index_1, random_index_2)
            print(joke)
            print(random_index)
            list_2 = []
            if flag == True:
                list_2 = joke.split()
                for i in range(len(nouns)):
                   for fun in list_2:
                       if nouns[i] == fun:
                           nouns.pop(i)

            print(nouns)

    get_jokes(3)

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

def get_jokes(n, flag=False):
    jokes = []

    for _ in range(n):
        noun = choice(nouns)
        adverb = choice(adverbs)
        adjective = choice(adjectives)

        if flag:
            # или удаляйте выбранные слова из списка слов (плохой вариант, но если из копий, то - ок)
            # или создавайте списки использованных слов и проверяйте, не было ли еще такого (может быть медленно на коротких списках)
            # или составьте новую шутку и проверьте, нет ли ее в уже созданных (тоже может быть медленно)
            # или перемешайте копии исходных списков и берите слова поочередно (лучший, на мой взгляд, вариант)
            pass

        jokes.append(f'{noun} {adverb} {adjective}')

    return jokes

Я бы на вашем месте перепробовал бы всевозможные варианты уникализации;)

>>> print(get_jokes(3))
['город вчера яркий', 'дом сегодня утопичный', 'город ночью яркий']


Создание пустого массива NumPy и постепенное его заполнение
На данный момент программа постепенно записывает в пустой список большой объём данных. Делает примерно так:

import time

# Создаю пустые списки
z_gyro_row = []
collect_time_row = []
START_TIME = time.time()

# В цикле по определённому условию считываю данные с датчика
# И постепенно заполняю пустые списки
while flag:
            collect_time = time.time() - START_TIME  # Фиксируем отрезок времени
            collect_time_row.append(collect_time)  # Запись времени в список
            z_gyro_32 = gyro_out32(z_gyro_32)  # Считываю значение с датчика
            z_gyro_row.append(z_gyro_32)  # Запись значений в список

На один из моих вопросов, мне посоветовали для большого объёма данных использовать массивы NumPy. Сейчас я это попытался сделать, но как я понимаю их невозможно так же как и списки постепенно заполнять данными с помощью команды .append.
Попытался так, но не вышло:

import numpy as np

my_array = np.array([], 'float64')
np.append(my_array, 10)

Возможно только преобразовать list в numpy.ndarray. В связи с этим возникает вопрос как оптимально использовать массивы NumPy, чтобы тратить как можно меньше времени и ресурсов на запись/хранение/обработку данных?

Если данных не очень много (не миллионы значений), то вам вообще не имеет смысла мучиться с
Numpy. Я потестил ради интереса, создал пустой список из добавил к нему по одному 1 000 000 (миллион) элементов. На это у питона ушло 100 миллисекунд.
Если такая скорость для вас мала, то тогда нужно выделять массив
Numpy, например, с помощью
np.empty заведомо большего размера, чем вам может понадобится, и заполнять его, обращаясь к элементам по индексу. Но это не так удобно, как работать со списком.
А ещё в питоне есть разные виды очередей, например, очень удобная
collections.deque, которую можно читать и писать с обоих концов. Если вы то пишете в список, то читаете из него вперемешку, то использовать очередь ещё проще и удобнее, чем список. Опять же на примере миллиона элементов создание очереди путём добавления элементов с конца и с начала по очереди, а потом полное опустошение очереди опять же забиранием элементов с конца и с начала по очереди заняло чуть больше тех же 100 миллисекунд. Очень рекомендую очередь - весьма удобная коллекция.


Как реализовать "Читать далее" в Django?
Как реализовать "Читать далее" в Djnago? Допустим у меня есть огромный текст. Для среза слов есть фильтр truncatewords,знаю. Но если кто-то захочет прочитать далее,а текст слишком большой - нужна кнопка или ссылка которая покажет весь текст,но как это сделать я не понимаю. Подскажите пожалуйста!
View отвечающий за вывод статьи на сайте(НЕ СТАТЕЙ,а именно отдельной статьи)
<code>
class Post(View):
    def get(self,request,post_id):
        try:
            post = News.objects.get(id__iexact=post_id)
            comments = post.comment_set.all()
        except News.DoesNotExist:
            return render(request,'blog/DoesNotExist.html')
        except Http404:
            raise HttpResponse('Такого поста нет')
        return render(request,'blog/post.html',context={'post':post,'comments':comments})
</code>

Добавьте во view, которое ответственно за показ страницы с текстом параметр
showFullText. Если параметр не передан, то считайте, что он
False и тогда делайте обрезание текста. В ссылке генерируйте URL на это же view з
showFullText=true.
Если параметра
showFullText==true то view должно показывать полный текст.
Это может выглядеть так:

def get(self,request,post_id):
        try:
            # если пареметр не передали то считаем что нужно обрезать
            showFullText = bool(request.GET.get('showFullText', 'False'))
            post = News.objects.get(id__iexact=post_id)
            comments = post.comment_set.all()
        except News.DoesNotExist:
            return render(request,'blog/DoesNotExist.html')
        except Http404:
            raise HttpResponse('Такого поста нет')
        return render(request,'blog/post.html',
                 context={
                    'post':post,
                    'showFullText':showFullText,
                    'comments':comments})

В шаблоне будет как-то так:

{% if showFullText %}
   post.text
{% else %}
   {{ post.text|truncatechars:100 }}
{% endif %}

Ссылку нужно генерировать используя тег url так то так:

<a href="{% url 'post_url_name' post.id %}?showFullText=true">View full text</a>

Вместо
post_url_name нужно указать имя, которое для view использовано в urlconf


Как получить дату и время в начале каждой строки?
У меня есть текстовый файл, а внутри прописаны разные строки.
Например:
<code>
2020-10-31 0:01:02 some text
2020-10-31 1:01:02 second line
2020-11-21 11:01:02 another line
</code>
Как мне получить дату и время каждой строки?

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

lines = [
    '2020-10-31 0:01:02 some text',
    '2020-10-31 1:01:02 second line',
    '2020-11-21 11:01:02 another line'
]

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

for l in lines:
    parts = l.split()
    print(' '.join((parts[0], parts[1].zfill(8))))

выведет:

2020-10-31 00:01:02
2020-10-31 01:01:02
2020-11-21 11:01:02

строку можно преобразовать в
datetime:

from datetime import datetime

date_string = "2020-11-21 11:01:02"
print(datetime.fromisoformat(date_string))
2020-11-21 11:01:02


Как в цикле for корректно принимать типы строка или список?
Есть цикл для обработки файлов:

for filename in filenames:

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

f i l e . t x t

list(filenames) даёт разбиение
f i l e . t x t

[filenames] строку превращает в список без разбиения
['file.txt']
А вот список
[filenames] превращает в список в списке
[['file1.txt', 'file2.txt']], что нарушает цикл.
Понятно, что можно один файл передавать в виде списка как
['file.txt'] и не париться.
Однако, для других подобных задач хочется понять, когда нельзя повлиять на ввод значений.
Какие есть способы переводить строку в список без посимвольного разбиения?

воспользуйтесь встроенной функцией isinstance():
<code>
if isinstance(filenames, str):
    filenames = [filenames]

for filename in filenames:
    ...
</code>


преобразование sys.argv в (*args, **kwargs)
Как правильно преобразовать аргументы командной строки в (*args, **kwargs) с помощью sys.argv?
Есть некоторая функция:

def test(*a, **b):
    return print(a), print(b)

test('arg1', 'arg2', 'arg3', first='1', two='2', three='3')

Результат (все логично):

('arg1', 'arg2', 'arg3')
{'first': '1', 'two': '2', 'three': '3'}

Если попытаться передать те же аргументы через командную строку:

python3.8 code.py 'arg1', 'arg2', 'arg3', first='1', two='2', three='3'

и видоизменить саму функцию:

import sys

def test(*a, **b):
    return print(a), print(b)

test(' '.join(sys.argv[1:]))

python3.8 args_.py 'arg1', 'arg2', 'arg3', first='1', two='2', three='3'
('arg1, arg2, arg3, first=1, two=2, three=3',)
{}

Стандартного решения для такого варианта нет. Обычно используют различные библиотеки для разбора аргументов командной строки от стандартного argparse до click, например. Но там используется другой формат примерно такого вида:

python3 code.py arg1 arg2 arg3 --first=1 --two=2 --three=3

Обзор различных библиотек для разбора параметров командной строки можно почитать в этой статье: Сравнение популярных CLI-библиотек для Python: click, cement, fire и другие
Простое "наколеночное" решение для вашего формата:

import sys
import ast

def test(*args, **kwargs):
    print(args)
    print(kwargs)

print(sys.argv[1:])
args = []
kwargs = {}
for item in sys.argv[1:]:
    item = item.rstrip(',')
    if item:  # Пустой элемент, например если была одиночная запятая
        try:
            args.append(ast.literal_eval(item))
        except (ValueError, SyntaxError):
            if "=" not in item:
                args.append(item)
            else:
                key, value = item.split("=", maxsplit=1)
                try:
                    kwargs[key] = ast.literal_eval(value)
                except ValueError:
                    kwargs[key] = value

test(*args, **kwargs)

Вывод:

$ python3 test_args.py 'arg1', 'arg2', 'arg3', first='1', two=2, three='3'
['arg1,', 'arg2,', 'arg3,', 'first=1,', 'two=2,', 'three=3']
('arg1', 'arg2', 'arg3')
{'first': 1, 'two': 2, 'three': 3}

Все кавычки при при передаче через командную строку потерялись, поэтому числа в кавычках стали просто числами. Если нужно передавать именно строки, можно упростить код убрав попытки конвертации при помощи
ast.literal_eval (все параметры будут считаться строками):

import sys

def test(*args, **kwargs):
    print(args)
    print(kwargs)

print(sys.argv[1:])
args = []
kwargs = {}
for item in sys.argv[1:]:
    item = item.rstrip(',')
    if item:  # Пустой элемент, например если была одиночная запятая
        if "=" not in item:
            args.append(item)
        else:
            key, value = item.split("=", maxsplit=1)
            kwargs[key] = value

test(*args, **kwargs)

Вывод будет такой:

$ python3 test_args.py 'arg1', 'arg2', 'arg3', first='1', two=2, three='3'
['arg1,', 'arg2,', 'arg3,', 'first=1,', 'two=2,', 'three=3']
('arg1', 'arg2', 'arg3')
{'first': '1', 'two': '2', 'three': '3'}


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

a = int(input())
print(a ** 2)

Пользователь вводит:
"ten" вместо
"10". Появляется ошибка
"ValueError: invalid literal for int() with base 10: 'ten'"
Но что если я хочу написать программу, в которой на вход можно получить и строку, и число? То есть если пользователь ввел
"ten" вместо
"10", то программа выведет не ошибку, а сообщение
"Введите цифру".
Или если немного изменить задание: пользователь вводит число, программа выводит это число в квадрате. Но если пользователь ввел строку вместо числа, то программа выведет эту строку, умноженную на 2 (
a * 2, вместо
a ** 2). То есть программа выведет не ошибку, а
"tenten". Это возможно?
Как это реализовать?

ValueError это тип объекта, который называется "исключение". Программа бросает исключения, когда что-нибудь идет не так. Чтобы реагировать на них в собственном коде, придумали try/except.

raw_input = input()
try:
    number = int(raw_input)  # Если ввели не число, выполнение прервется здесь ...
    print(number**2)
except ValueError:  # (реакцию настроили только на ошибки определенного типа)
    # ... и тогда прыгнет сюда
    print(raw_input * 2)

В интернете можно найти много полезной информации по запросу "исключения python".


ftlib ошибка WinError 10060
Использую ftlib в Python, чтобы реализовать FTP протокол у себя в программе. Программа должна кидать файлы с хоста на гостевую ОС в VirtualBox. При попытке передачи выдает ошибку TimeoutError: [WinError 10060] Попытка установить соединение была безуспешной, т.к. от другого
компьютера за требуемое время не получен нужный отклик. В чем может быть проблема?

# Отправка файла
def send():
 if ent_dir.get() == '':
   print(ftp.pwd())
   ftp.cwd('/home/helga/Desktop')
   print(file_name)
   file_ = open(file_name, 'rb')
   ftp.storbinary('STOR ' + '/' + ent_file.get(), file_)
   ftp.quit()
 else:
    # ftp.cwd(ent_dir.get())
    print(file_name)
    file_ = open(file_name, 'rb')
    ftp.storbinary('STOR ' + '/' + ent_file.get(), file_)
    ftp.quit()

# Подключение к серверу
   def connect():
global ftp
if ent_file.get() != '':
    ftp = FTP('192.168.0.102', timeout=200)
    ftp.login('helga', '123')
    send()
else:
    Tk.messagebox.showerror('Ошибка', 'Выберите файл!')

Это то, что я получил в следствии ipconfig /all в консоли

C:\Users\Shepard>ipconfig /all

Настройка протокола IP для Windows
Имя компьютера  . . . . . . . . . : vice
Основной DNS-суффикс  . . . . . . :
Тип узла. . . . . . . . . . . . . : Гибридный
IP-маршрутизация включена . . . . : Нет
WINS-прокси включен . . . . . . . : Нет

Адаптер Ethernet Ethernet:

Состояние среды. . . . . . . . : Среда передачи недоступна.
DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : Intel(R) Ethernet Connection (4) I219-LM
Физический адрес. . . . . . . . . : 8C-04-BA-39-6E-A7
DHCP включен. . . . . . . . . . . : Да
Автонастройка включена. . . . . . : Да

Адаптер Ethernet VirtualBox Host-Only Network:

DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : VirtualBox Host-Only Ethernet Adapter
Физический адрес. . . . . . . . . : 0A-00-27-00-00-07
DHCP включен. . . . . . . . . . . : Нет
Автонастройка включена. . . . . . : Да
Локальный IPv6-адрес канала . . . : fe80::c1bc:8e69:4f48:4a06%7(Основной)
IPv4-адрес. . . . . . . . . . . . : 192.168.56.1(Основной)
Маска подсети . . . . . . . . . . : 255.255.255.0
Основной шлюз. . . . . . . . . :
IAID DHCPv6 . . . . . . . . . . . : 722075687
DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-25-3F-1E-CC-8C-04-BA-39-6E-A7
DNS-серверы. . . . . . . . . . . : fec0:0:0:ffff::1%1
                                    fec0:0:0:ffff::2%1
                                    fec0:0:0:ffff::3%1
NetBios через TCP/IP. . . . . . . . : Включен

Адаптер беспроводной локальной сети Подключение по локальной сети* 1:

Состояние среды. . . . . . . . : Среда передачи недоступна.
DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : Microsoft Wi-Fi Direct Virtual Adapter
Физический адрес. . . . . . . . . : 5C-87-9C-CC-73-F7
DHCP включен. . . . . . . . . . . : Да
Автонастройка включена. . . . . . : Да

Адаптер беспроводной локальной сети Подключение по локальной сети* 10:

Состояние среды. . . . . . . . : Среда передачи недоступна.
DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : Microsoft Wi-Fi Direct Virtual Adapter #2
Физический адрес. . . . . . . . . : 5E-87-9C-CC-73-F6
DHCP включен. . . . . . . . . . . : Да
Автонастройка включена. . . . . . : Да

Адаптер Ethernet VMware Network Adapter VMnet1:

DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet1
Физический адрес. . . . . . . . . : 00-50-56-C0-00-01
DHCP включен. . . . . . . . . . . : Нет
Автонастройка включена. . . . . . : Да
Локальный IPv6-адрес канала . . . : fe80::590c:3e88:389b:97c8%20(Основной)
IPv4-адрес. . . . . . . . . . . . : 192.168.159.1(Основной)
Маска подсети . . . . . . . . . . : 255.255.255.0
Основной шлюз. . . . . . . . . :
IAID DHCPv6 . . . . . . . . . . . : 687886422
DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-25-3F-1E-CC-8C-04-BA-39-6E-A7
DNS-серверы. . . . . . . . . . . : fec0:0:0:ffff::1%1
                                   fec0:0:0:ffff::2%1
                                   fec0:0:0:ffff::3%1
NetBios через TCP/IP. . . . . . . . : Включен

Адаптер Ethernet VMware Network Adapter VMnet8:

DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet8
Физический адрес. . . . . . . . . : 00-50-56-C0-00-08
DHCP включен. . . . . . . . . . . : Нет
Автонастройка включена. . . . . . : Да
Локальный IPv6-адрес канала . . . : fe80::f99d:1020:cebc:3092%10(Основной)
IPv4-адрес. . . . . . . . . . . . : 192.168.137.1(Основной)
Маска подсети . . . . . . . . . . : 255.255.255.0
Основной шлюз. . . . . . . . . :
IAID DHCPv6 . . . . . . . . . . . : 704663638
DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-25-3F-1E-CC-8C-04-BA-39-6E-A7
DNS-серверы. . . . . . . . . . . : fec0:0:0:ffff::1%1
                                   fec0:0:0:ffff::2%1
                                   fec0:0:0:ffff::3%1
NetBios через TCP/IP. . . . . . . . : Включен

Адаптер беспроводной локальной сети Беспроводная сеть:

DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : Intel(R) Dual Band Wireless-AC 8265
Физический адрес. . . . . . . . . : 5C-87-9C-CC-73-F6
DHCP включен. . . . . . . . . . . : Да
Автонастройка включена. . . . . . : Да
Локальный IPv6-адрес канала . . . : fe80::e8e0:3965:b31c:9561%14(Основной)
IPv4-адрес. . . . . . . . . . . . : 192.168.0.100(Основной)
Маска подсети . . . . . . . . . . : 255.255.255.0
Аренда получена. . . . . . . . . . : 28 февраля 2021 г. 19:01:53
Срок аренды истекает. . . . . . . . . . : 3 марта 2021 г. 15:09:09
Основной шлюз. . . . . . . . . : 192.168.0.1
DHCP-сервер. . . . . . . . . . . : 192.168.0.1
IAID DHCPv6 . . . . . . . . . . . : 224167836
DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-25-3F-1E-CC-8C-04-BA-39-6E-A7
DNS-серверы. . . . . . . . . . . : 192.168.0.1
                                    0.0.0.0
NetBios через TCP/IP. . . . . . . . : Включен

Адаптер Ethernet Сетевое подключение Bluetooth:

Состояние среды. . . . . . . . : Среда передачи недоступна.
DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : Bluetooth Device (Personal Area Network)
Физический адрес. . . . . . . . . : 5C-87-9C-CC-73-FA
DHCP включен. . . . . . . . . . . : Да
Автонастройка включена. . . . . . : Да

что я получаю в консоли, когда пытаюсь пинговать с хоста и с виртуалки

Host -> Linux (Virtual Box)

C:\Users\Shepard>ping 192.168.0.101
Обмен пакетами с 192.168.0.101 по с 32 байтами данных:
Ответ от 192.168.0.101: число байт=32 время=1мс TTL=64
Ответ от 192.168.0.101: число байт=32 время<1мс TTL=64
Ответ от 192.168.0.101: число байт=32 время<1мс TTL=64
Ответ от 192.168.0.101: число байт=32 время<1мс TTL=64
Статистика Ping для 192.168.0.101:
Пакетов: отправлено = 4, получено = 4, потеряно = 0
(0% потерь)
Приблизительное время приема-передачи в мс:
Минимальное = 0мсек, Максимальное = 1 мсек, Среднее = 0 мсек

Linux (Virtual Box) -> Host

ping 192.168.0.100
PING 192.168.0.100 (192.168.0.100) 56(84) bytes of data.
64 bytes from 192.168.0.100: icmp_seq=1 ttl=128 time=0.635 ms
64 bytes from 192.168.0.100: icmp_seq=1 ttl=128 time=0.708 ms
64 bytes from 192.168.0.100: icmp_seq=1 ttl=128 time=0.695 ms
...

Проблема решена! На гостевой ОС (Linux) был включен файрвол. Его нужно отключить и тогда все будет работать.
<code>
sudo ufw status
Status: active
sudo ufw disable
sudo ufw status
Status: inactive
</code>


Как сделать полученное значение из базы данных жирным (pytelegrambotapi)
Возможности телеграма позволяют задать стили текста через разметку html или markdown.
То есть например:

bot.send_message(message.from_user.id, '*bold*',parse_mode='markdown')

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

bot.send_message(message.from_user.id, db.get_subscriptions2(message.from_user.id), parse_mode='markdown')

data = db.get_subscriptions2(message.from_user.id)
bot.send_message(message.from_user.id, f'*{data}*', parse_mode='markdown')


Как с помощью selenium закрывать окна?
С помощью selenium открываю страницу, на ней есть другие страницы, по которым требуется перейти и собрать информацию, но на эти другие страницы не даны ссылки, потому приходится с помощью .click() переходить по ним, с этим все ок, но они открываются в новом окне, как можно после сбора информации закрывать каждое такое окно. driver.quit(), driver.close() закрывают весь драйвер, а мне нужно закрывать только появляющееся новое окно, далее переходить к другому и т.д. иначе их наоткрывается очень много... Спасибо.

Получить все окна -> list:

windows = driver.window_handles

Получить текущее окно -> str:

window = driver.current_window_handle

Переключение на окно:

driver.switch_to_window(window)

Закрыть окно:

driver.close()

Если у вас только одно окно, то браузер закроется, eсли вы хотите закрыть все окна вместе с браузером
driver.quit()


Как правильно сделать аннотацию *args, **kwargs и self
Как правильно сделать аннотацию аргументов
*args,
**kwargs и
self?
И надо ли делать их вообще, или всем и так понятно?

Для
self аннотация не нужна (и так очевидно, что тип
self - это класс, в котором объявлен метод).
Для
*args и
**kwargs указывайте тип передаваемых значений, пример:

def function(*args: int, **kwargs: int):
    pass

function(1, 2, '3', a=1, b='asdasd')

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

anno.py:8: error: Argument 3 to "function" has incompatible type "str"; expected "int"
anno.py:8: error: Argument "b" to "function" has incompatible type "str"; expected "int"
Found 2 errors in 1 file (checked 1 source file)

Документация: PEP 484, раздел "Arbitrary argument lists and default argument values"


Анализ и выборка уникальных сообщений
Просьба подсказать, как можно реализовать выборку по уникальным значениям, имея DF с текстовыми сообщениями.
Текст сообщений может содержать от 4 до 200+ символов, текстовые сообщение по типу: "Ваш ID 12345", "your ID 23432" или аналогичного характера, как на рус. так и на английском языке. Соответственно df с данными сообщениями может содержать от 100к до нескольки миллионов строк, где строка соответствует сообщению, необходимо проанализировать и получить по несколько уникальных примеров сообщений. Соответсвенно уникальными будут считаться, "Ваш ID xxxx", "your ID xxxx",. Соответсвенно DF может содержать различные шаблоны которые заранее не известны.
Входные данные:

---------------------
9089 | your ID 9897
9089 | is code 67567
9089 | code 90878
9089 | is code 67567
9089 | code 90878
8789 | code 78yh45
6078 | your ID is 908r78
7843 | Ваш ID 909r5

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

--------------------
9089 | your ID xxxx
9089 | is code xxxx
9089 | code xxxx
6078 | your ID is хххх
7843 | Ваш ID хххх
8789 | code ххххх

да, мне нужно получить уникальные сообщения которые будут отличаться только числами ID

<code>
In [389]: df
Out[389]:
     ID                msg
0  9089       your ID 9897
1  9089      is code 67567
2  9089         code 90878
3  9089      is code 67567
4  9089         code 90878
5  8789        code 78yh45
6  6078  your ID is 908r78
7  7843       Ваш ID 909r5

In [390]: res = df["msg"].str.replace(r"\d[\da-z]{2,}", "XXXX").drop_duplicates()

In [391]: res
Out[391]:
0       your ID XXXX
1       is code XXXX
2          code XXXX
6    your ID is XXXX
7        Ваш ID XXXX
Name: msg, dtype: object
</code>


Почему то PEP8 ругается на недостаток аргумента word
В общем использую pymorphy2, а именно функцию согласования склонения слова и числительного, но оно почему-то ворчит. Возможно, конечно, тупая ошибка, но я не знаю...
Приложил скрин, чтобы было и так понятно, где он спотыкается.
3 строка

import pymorphy2
morph = pymorphy2.MorphAnalyzer
bottle = morph.parse('бутылка')
for i in range(100, 0, -1):
    print(f'''В холодильнике {i} {bottle.make_agree_with_number(i).word} кваса.
Возьмем одну и выпьем.
Осталось {i - 1} {bottle.make_agree_with_number(i - 1).word} кваса.''')

Ошибка:

            bottle = morph.parse('бутылка')
TypeError: parse() missing 1 required positional argument: 'word'

У вас не создан объект
MorphAnalyzer, т.е. вы у класса вызываете
parse, а ему для таких финтов нужно 2 параметра
self и
word
Просто создайте
MorphAnalyzer:

morph = pymorphy2.MorphAnalyzer()
#                             ^^^^


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

mas = ['1. Химия', '2. Индивидуальный проект', '3. Математика', '4. История', '5. Основы безопасности жизнедеятельности', '6. Методика решения математических задач повышенной сложности (внеурочная деятельность)',
'7. Родной (русский) язык', '1. Классный час и ПДД', '2. Физика', '3. Русский язык', '4. Литература', '5. Математика', '6. Математика', '7. Английский язык', '8. Информатика', '1. Математика', '2. Английский язык',
 '3. Информатика', '4. История', '5. Практическое черчение', '6. Говорим и пишем правильно (внеурочная деятельность)', '7. Обществознание', '8. Астрономия', '1. Физика', '2. Английский язык', '3. Информатика',
 '4. Математика', '5. Математика', '6. Литература', '7. Физическая культура', '8. Физическая культура', '1. Физика', '2. Физика', '3. Литература', '4. Обществознание', '5. Практикум по физике', '6. Информатика']

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

[
    ['1. Химия', '2. Индивидуальный проект', '3. Математика', '4. История', '5. Основы безопасности жизнедеятельности', '6. Методика решения математических задач повышенной сложности (внеурочная деятельность)', '7. Родной (русский) язык'],
    ['1. Классный час и ПДД', '2. Физика', '3. Русский язык', '4. Литература', '5. Математика', '6. Математика', '7. Английский язык', '8. Информатика']
]

Возможно ли это реализовать?

черновой, но рабочий вариант:

num_last = 0
day = []
new_mas = []

for m in mas:
    num = int(m.split('.')[0])

    if num > num_last:
        day.append(m)
    else:
        new_mas.append(day)
        day = [m]

    num_last = num

new_mas.append(day)

в
new_mas:

[
    ['1. Химия', '2. Индивидуальный проект', '3. Математика', '4. История', '5. Основы безопасности жизнедеятельности', '6. Методика решения математических задач повышенной сложности (внеурочная деятельность)', '7. Родной (русский) язык'],
    ['1. Классный час и ПДД', '2. Физика', '3. Русский язык', '4. Литература', '5. Математика', '6. Математика', '7. Английский язык', '8. Информатика'],
    ['1. Математика', '2. Английский язык', '3. Информатика', '4. История', '5. Практическое черчение', '6. Говорим и пишем правильно (внеурочная деятельность)', '7. Обществознание', '8. Астрономия'],
    ['1. Физика', '2. Английский язык', '3. Информатика', '4. Математика', '5. Математика', '6. Литература', '7. Физическая культура', '8. Физическая культура'],
    ['1. Физика', '2. Физика', '3. Литература', '4. Обществознание', '5. Практикум по физике', '6. Информатика']
]


Вывод по нажатию мыши
Есть код, который рисует поле, помогите, как сделать так, что бы при нажатие на одну из клеток, выводило её координаты, а если нажималось, не на поле, выводило-"Мимо". Например нажав на самую левую верхнюю клетку, выводило - 0, 0
<code>
import pygame

def main():
    pygame.init()
    size = 550, 550
    screen = pygame.display.set_mode(size)
    pygame.display.set_caption('Инициализация игры')
    board = Board(5, 7)
    board.set_view(15, 15, 70)
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        screen.fill((0, 0, 0))
        board.render(screen)
        pygame.display.flip()
    pygame.quit()

class Board:
    # создание поля
    def __init__(self, width, height):
        self.width = width
        self.height = height
        self.board = [[0] * width for _ in range(height)]
        # значения по умолчанию
        self.left = 10
        self.top = 10
        self.cell_size = 30

    # настройка внешнего вида
    def set_view(self, left, top, cell_size):
        self.left = left
        self.top = top
        self.cell_size = cell_size

    def render(self, screen):
        for y in range(self.height):
            for x in range(self.width):
                pygame.draw.rect(screen, pygame.Color(255, 255, 255),
                                 (x * self.cell_size + self.left,
                                  y * self.cell_size + self.top, self.cell_size, self.cell_size), 1)

if __name__ == '__main__':
    main()
</code>

Получить координаты можно путём получения координат курсора мыши и делением их на высоту и ширину клетки, а затем вывести на экран
<code>
## Вне цикла
font = pygame.font.SysFont('название шрифта', размер шрифта)

## В главном игровом цикле
## Получение координат мыши
mpos = pygame.mouse.get_pos()
## Нажал ли юзер на мышь?
mpressed = pygame.mouse.get_pressed()
if mpressed[0]: ## Левая кнопка мыши
    raw_x = mpos[0] // board.cell_size
    raw_y = mpos[1] // board.cell_size
    if raw_x > board.width - 1 or raw_y > board.height - 1:
        text_surface = font.render("Мимо", True, (кортеж RGB))
    else:
        text_surface = font.render(str(raw_x) + ";" + str(raw_y), True, (кортеж RGB))

screen.blit(text_surface, (кортеж координат))

</code>


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

print(hello world)

Возможно ли задать данным переменным такие значения, чтобы данный код выполнился? Условно, как-то заменить hello на знак "-" и получить выражение "-world". Или интерпретатор питона в принципе не признает такой возможности и запрещает, чтобы две пользовательские переменные стояли подряд без разделителей?
Шаблон для такой программы:

hello = expression1
world = expression2
print(hello world)

Выражение внутри print не должно меняться. Нельзя туда писать + или что-то вроде этого.
В C++ данное извращение можно сделать, например, с помощью #define:

#define hello -
int world = 5;
cout << hello world << endl; //-5

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


Как получить текст, находящийся внутри HTML тега Python
Мне нужно получить то, что находится внутри HTML тега. С помощью requests я получаю код страницы, а с помощью bs4 весь класс вместе с тегом. Но мне надо получить только содержимое тега. Пытался использовать регулярные выражения, но в содержимом может содержаться английский. Вот фрагмент с тем, что я использую:

soup = BeautifulSoup(dd.text, 'html.parser')
a = soup.find_all("div", class_="flex-grow-1")

Вот то, что я получаю:

<div class="flex-grow-1">   Some text... </div>
А вот, что хочу:

Some text...
Возможно ли это реализовать?

Вариант №1:

soup = BeautifulSoup(dd.text, 'html.parser')
a = soup.find_all("div", class_="flex-grow-1")
value = a[0].getText()

Вариант №2:

soup = BeautifulSoup(dd.text, 'html.parser')
a = soup.find_all("div", class_="flex-grow-1")
value = a[0].text


Как ввести столбик данных [закрыт]

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

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

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

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

Как ввести столбик данных, если заранее не известно из скольких строк состоит столбик.
Пример входных данных:

1
9
2
5

вывести элементы списка, пронумеровав строки:

words = input().split()
for i, word in enumerate(words, 1):
    print(f'{i}. {word}')

если ввод:

qwe rty ui op asdfghjkl zxc vb nm

то распечатает:

1. qwe
2. rty
3. ui
4. op
5. asdfghjkl
6. zxc
7. vb
8. nm


Как удалить файлы на ftp из одной папки которых нет в другой?
Пусть:
<code>
ftp.cwd(‘../‘)
ftp.cwd(‘Folder1’)
files1 = ftp.nlst()

ftp.cwd(‘../‘)
ftp.cwd(‘Folder2)
files2 = ftp.nlst()
</code>
Нужно удалить элементы из списка files1 которых нет в списке files2

Не могу проверить именно работу в ftp но логику можно реализовать примерно так:
<code>
# Пусть `f1` и тд это имена файлов
files1 = ["f1", "f2", "f3", "f4"]
files2 = ["f1", "f2", "f5", "f6"]
del_list=[] # Список файлов на удаление
for i in files1:
    if i not in files2:
        del_list.append(i)

# Удаляем файлы.
for i in del_list:
    ftp.delete(i)
</code>
Единственное что стоит учитывать какие пути будут в списках относительные или абсолютные. Чтобы не получилось что Вы путаетесь удалить файлы которых никогда и не было или не в той директории.
P.S. Или предоставьте пример того что у Вас получается в списках файлов.


добавление записи в json с помощью python
Понимаю, что вопрос простой, но не пойму как дописать в json. Есть json:

{
  "name": "Вася",
  "phone": "123456789"
}

и код:

import json

name = input("Имя: ")
phone = input("Телефон: ")

def create_json():
    json_data = {
        "name": name,
        "phone": phone,
    }
    with open('db.json', 'w') as file:
        file.write(json.dumps(json_data, indent=2, ensure_ascii=False))

# create_json()

def add_to_json():
    json_data = {
        "name": name,
        "phone": phone,
    }
    data = json.load(open("db.json"))
    data.append(json_data)
    with open("db.json", "w") as file:
        json.dump(data, file, indent=2, ensure_ascii=False)

add_to_json()

Вылезает ошибка:

AttributeError: 'dict' object has no attribute 'append'

Нужно добавить запись, что бы json имел такой вид:

{
  "name": "Вася",
  "phone": "123456789"
},
{
  "name": "Вася",
  "phone": "123456789"
}

Надо было добавить
[] при создании
json файла, итоговый код:

import json

name = input("Имя: ")
phone = input("Телефон: ")

def create_json():
    json_data = [{
        "name": name,
        "phone": phone,
    }
    ]
    with open('db.json', 'w') as file:
        file.write(json.dumps(json_data, indent=2, ensure_ascii=False))

# create_json()

def add_to_json():
    json_data = {
        "name": name,
        "phone": phone,
    }
    data = json.load(open("db.json"))
    data.append(json_data)
    with open("db.json", "w") as file:
        json.dump(data, file, indent=2, ensure_ascii=False)

add_to_json()


Найти повторяющиеся значения списка
Задание следующее:

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

Вот мое решение:

s = [int(i) for i in input().split()]
s.sort()
cnt = 1
l = len(s)

for i in range(l-2):
    if s[i] == s[i + 1] and s[i + 1] != s[i + 2]:
        cnt += 1
        if cnt > 1:
            print(s[i], end=" ")
            cnt = 1

Программа работает на примере
"4 8 0 3 4 2 0 3", выводит
"0 3 4". Если ввести одно число, то тоже работает (то есть ничего не выводит, так и должно быть).
Но если ввести
"1 1 2 2 3 3", то выводит
"1 2", хотя должно быть "1 2 3". Или если ввести
"1 1 1 1 1 2 2 2", то выводит
"1", хотя должно быть
"1 2".
Объясните, пожалуйста, что не так?
PS
set и
count желательно не использовать, так как задача обучающая, и до этого еще не дошли.

Простой вариант исправления - добавляем также проверку на достижение конца строки (оценивается раньше использования индекса!)
<code>
for i in range(l-1):
    if i == l-2 or s[i + 1] != s[i + 2]:
        if s[i] == s[i + 1]:
            print(s[i], end=" ")
</code>


Как исправить функции?
Я сделала следующий код

def del_ds():
    doc = input("Введите номер полки: ")
    a = list(directories.values())
    if doc in a:
            print ("На полке есть документы, удалите их перед удалением полки. Текущий перечень полок: ", list(directories.keys()))
    else:
        del(directories[doc])
        print ("Полка удалена. Текущий перечень полок:", list(directories.keys()))
    return

Сами полки в словаре:

directories = {
    '1': ['2207 876234', '11-2'],
    '2': ['10006'],
    '3': []
}

Ключи - это полки 1,2,3. Документы - это значения этих полок. Необходимо, чтобы при наличии в ключе значения полка не удалялась. Сейчас она удаляется в любом случае, независимо от наличия значений в ней. Как мне записать проверку наличия значения в ключе и если, есть пара ключ-значение, полка не удалялась бы?

Достаточно надо взять список документов с полки
directories[doc]
И поместить его в условие, которое проверит пустой ли список:

if directories[doc]:
    # Если список не пустой, мы попадем сюда и не позволим удалить полку
else:
    # Окажемся здесь, если в списке ничего нет, и сможем успешно удалить полку

Перед всем еще стоит проверить:

if doc not in directories:
    # Если ввели несуществующий номер полки, окажемся здесь и сообщим об этом
else:
    # Тут мы уже уверены, что directories[doc] существует и мы не получим ошибку
    # Можно продолжать работу


os.path.abspath не понял принцип работы
Хочу разрезать видео используя ffmpeg tools и python. Но первому нужно передать полный путь до файла для коррекной работы. Соответсвенно использую модуль os и abspath
Структура проекта такая:

...
Documents
---video_divider
------venv
------video_divider.py
------videos
---------video.mp4

Что бы получить полный (абсолютный путь) до файла video.mp4 использую

    for filename in tqdm(list_of_filenames):
        video_path = os.path.abspath(f"/{folder_name}/{filename}")

Какой результат я получаю:

C:\videos\video.mp4
Какой результат я планирую получить

C:\ .... Documents\video_divider\videos\video.mp4
Знаю что abspath не работает если скрипт запущен не из той же папки что и файл путь до которого я определяю, но если я в папке проекта открываю питон через консоль - все работает. В чем может быть проблема? Как можно по-другому получить этот абсолютный путь. Может быть дело в виртуальном окружении?

Слеш
/ в начале строки указывает, что абсолютный путь нужен от корня диска текущей активной директории, поэтому путь стал
C:\videos\video.mp4
Если путь нужен от текущей папки, то просто уберите
/:

    video_path = os.path.abspath(f"{folder_name}/{filename}")


Индекс строки, которая содержит минимальное значение
Используется Python, Имеется dataframe, в нем с помощью функции min нахожу минимальное значение
df['col1'].min(). Минимальное значение может содержаться в нескольких строках.
Подскажите, как узнать индекс строки, которая содержит минимальное значение.

Большое спасибо.
Пример кода для поиска индекса минимального значения

import pandas as pd

df = pd.DataFrame({
 'restaurant_id': [101,102,103,104,105,106,107],
 'address': ['A','B','C','D', 'E', 'F', 'G'],
 'city': ['London','London','London','Oxford','Oxford', 'Durham', 'Durham'],
 'sales': [10,500,48,12,21,10,14],
 'my': [1,-1,48,-12.0,21,16,12]
})

print(df[df['city']=='Durham'][['sales','my']].idxmin())

результатом будет индексы минимальных значений строк если 'city' == 'Durham'

sales    5 #значение 10
my       6 #значение 12
dtype: int64


Заполнение столбца датафрейма строковыми данными из другого столбца, а не списком
Есть датасет.
В нем необходимо в столбце 'body' слова, начинающиеся с символа "#", записать с столбец 'rubric' строкой. Если этих слов несколько, то они должны быть разделены запятой.
Я использую разные коды, например:

import pandas as pd
import re

df = pd.read_csv('SB.csv', encoding = 'utf-16')

df['rubric'] = df['body'].apply(lambda x: re.findall('#\w+', x))
df.head()

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

[#В_закладки_Skillbox, #Skillbox_дизайн]

Код

def rubric(x):
    all_tag = re.findall('#\w+', x)
    for tag in all_tag:
        return tag

df['rubric'] = df['body'].apply(lambda x: rubric(x))
df.head(19)

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

[#В_закладки_Skillbox]

Желаемый результат:

#В_закладки_Skillbox, #Skillbox_дизайн

Используйте

df['rubric'] = df['body'].str.findall(r'#\w+').str.join(', ')

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

df['rubric'] = df['body'].str.findall(r'(?<!\S)#\w+').str.join(', ') # после пробелов
df['rubric'] = df['body'].str.findall(r'\B#\w+').str.join(', ') # после пунктуации и пробелов

Если в хэштегах есть дефисы, используйте

df['rubric'] = df['body'].str.findall(r'#[\w-]+').str.join(', ')

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

import pandas as pd
df = pd.DataFrame({'body':['Some #word #here', 'Текст #вася_пупкин, #zmej-gorynych,#baba-yaga', 'Wiadomość od #łajdak123']})
df['rubric'] = df['body'].str.findall(r'#[\w-]+').str.join(', ')
df['rubric']
#  0                                #word, #here
#  1    #вася_пупкин, #zmej-gorynych, #baba-yaga
#  2                                  #łajdak123


Нейросеть. Как правильно указывать метки?
Сложилась такая ситуация, что чем дольше я разбираюсь с нейросетью, тем меньше я понимаю что происходит...
Поэтому я решил начать с самого начала. У меня есть несколько вопросов, но начну я с самого первого.
У меня есть набор данных. Каждую строку данных я отношу к одной из 3-х категорий (0-1-2).
Вопрос, как правильно добавить метки для обучения сети:
<code>
это должен быть один выходной нейрон: [или 0, или 1, или 2]

это должно быть три нейрона: или [1,0,0], или [0,1,0], или [0,0,1]

или как-то по другому
</code>
Данные состоят из числовых значений, которые я нормализую, привожу в диапозон от 0 до 1.

Согласно википедии, которая хоть и не самый полезный источник, но все-таки весьма достоверный для не специалиста: "Топология такой сети характеризуется тем, что количество нейронов в выходном слое, как правило, равно количеству определяемых классов."
Разумеется, существуют исключения, как например, бинарная классификация, в которой обычно используется один нейрон на выходном слое, или классификация на категории вида "мало"-"нормально"-"много", где категории связаны между собой каким-то конкретным возрастающим признаком (который может быть и не обозначен во входных данных), но второй случай ближе к регрессии.
Также стоит отметить, что в случае использования трех (или любого другого количества) нейронов в зависимости от активационной функции нейронного слоя вы можете получать не только выходные вектора [1, 0, 0], [0, 1, 0], [0, 0, 1], но и, к примеру, [0.7, 0.2, 0.1], где эти числа обычно обозначают вероятность того, что входной объект относится к конкретной категории.
Обозначение же лейбла зависит от метода потерь. Для задач классификации наиболее часто используется CategoricalCrossentropy и его собрат SparseCategoricalCrossentropy. Для использование первого метода вам нужно применить One-Hot кодирование меток (все численные метки переводятся в бинарные вектора, например 2 -> [0, 0, 1], 1 -> [0, 1, 0]). А для использования второго вы можете (и должны) использовать обычные числа в качестве классов.


список в словарь, python [закрыт]

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

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

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

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

возникли трудности с преобразованием списка в словарь. Нужно из простого списка составить словарь с ключами 0,1,2,...

вот это наверное самый короткий и простой способ:
<code>
arr = ['one', 'two', 'three']

res = dict(enumerate(arr))

print(res)
</code>


Получение вложений из чата vk api python
Проблeма зaключается в слeдующем, мне надо для одной функции получать вложeния из чaта, пытaлся сдeлать тaк:

рrint(vk_session.method('messages.getHistоryAttаchments',
                                      {'peer_id': str(2000000000 + chat_id),
                                       'media_type': 'photo', 'count': '1'}))

Выводит

{'itеms': []}

В общем, оказалось что тот способ который я думал делать - херь собачья. Вложения из чата надо получать при поступлении сообщений
<code>
if 'photo' in event.object.message['attachments'][0]:
    pics[chat_id].append(event.object.message['attachments'][0]['photo']['sizes'][-1]['url'])
</code>


Добавить отмену действия в tkinter
Не так давно начал работать в tkinter. Хочу реализовать отмену действия при рисовании на canvas'e (на подобие undo/redo).Подскажите, какие-либо готовые реализации для этой GUI.
<code>
import tkinter as tk
import tkinter.messagebox as mb
from PIL import Image, ImageDraw
import numpy as np
import matplotlib.pyplot as plt

def change_color():
    root['bg'] = "black"

class ImageGenerator:
    def __init__(self, parent, posx, posy, width, height,*kwargs):
        self.parent = parent
        self.posx = posx
        self.posy = posy
        self.width =  width
        self.height = height
        self.sizex = 400
        self.sizey = 400
        self.b1 = "up"
        self.xold = None
        self.yold = None
        self.x_current = posx
        self.y_current = posy
        self.drawing_area=tk.Canvas(self.parent,
                                    width=self.width * 0.85,
                                    height=self.height * 0.93)
        self.drawing_area.place(x=self.posx, y=self.posy)
        self.drawing_area.bind("<Motion>", self.motion)
        self.drawing_area.bind("<ButtonPress-1>", self.b1down)
        self.drawing_area.bind("<ButtonRelease-1>", self.b1up)
        self.drawing_area.bind("<Control-z>", self.undo)

        self.button_fill = tk.Button(self.parent,
                                    text="Fill",
                                    width=10,
                                    bg='white',
                                     command=self.flood_fill)
        self.button_fill.place(x=self.width*0.88, y=70)

        self.button_clear = tk.Button(self.parent,
                                     text="Clear",
                                     width=10,bg='white',
                                     command=self.clear)
        self.button_clear.place(x=self.width*0.88, y=100)

        self.button_select_target = tk.Button(self.parent,
                                             text="Select Target",
                                             width=10,bg='white',
                                             command=self.select_target)
        self.button_select_target.place(x=self.width*0.88, y=40)

        self.button_line = tk.Button(self.parent,
                                    text="Line",
                                    width=10,bg='white',
                                    command=self.line)
        self.button_line.place(x=self.width*0.88, y=10)

        self.button_back = tk.Button(self.parent,
                                    text="back",
                                    width=5,bg='white',
                                    command=self.undo)
        self.button_back.place(x=self.width*0.875, y=self.height*0.90)

        self.button_next = tk.Button(self.parent,
                                     text="next",
                                     width=5, bg='white',
                                     command=self.line)
        self.button_next.place(x=self.width*0.94, y=self.height*0.90)

        self.image = Image.new("RGB",
                              (self.width, self.height),
                              (255, 255, 255))
        self.draw=ImageDraw.Draw(self.image)

    def undo(self):
        pass

    def show_warning(self, msg):
        mb.showwarning("Предупреждение", msg)
        self.line()

    def line(self):
        self.drawing_area.place(x=self.posx, y=self.posy)
        self.drawing_area.bind("<Motion>", self.motion)
        self.drawing_area.bind("<ButtonPress-1>", self.b1down)
        self.drawing_area.bind("<ButtonRelease-1>", self.b1up)

    def fill(self, img_gray, start_coords, fill_value):

        xsize, ysize = img_gray.shape
        orig_value = img_gray[start_coords[0], start_coords[1]]

        stack = set(((start_coords[0], start_coords[1]),))

        if fill_value == orig_value:
            self.show_warning("Вы попали маркером в границу контура")
            return False

        while stack:
            x, y = stack.pop()

            if img_gray[x, y] == orig_value:
                img_gray[x, y] = fill_value
                if x > 0:
                    stack.add((x - 1, y))
                    self.drawing_area.create_line(x-1,
                                                    y,
                                                    x-1,
                                                    y,
                                                    width=3,
                                                    fill='black')

                if x < (xsize - 1):
                    stack.add((x + 1, y))
                if y > 0:
                    stack.add((x, y - 1))
                if y < (ysize - 1):
                    stack.add((x, y + 1))

                if x == (xsize - 1) or y == (ysize - 1):
                    self.show_warning("Выбранный контур не замкнут")
                    return False
        return True

    def rgb2gray(self, rgb):
        return np.dot(rgb[..., :3], [0.299, 0.587, 0.114])

    def flood_fill(self):
        color = 0
        img_gray = self.rgb2gray(np.uint8(self.image))

        flag_fill = self.fill(img_gray,
                             (self.y_current, self.x_current),
                             color)

        im = np.asarray(img_gray)
        self.image = Image.fromarray(np.uint8(im))
        # self.draw=ImageDraw.Draw(self.image)
        # background_label = tk.Label(self.drawing_area, image=self.image)
        # background_label.place(x=700, y=400, relwidth=1, relheight=1)
        # self.drawing_area.pack()
        if flag_fill:
            plt.imshow(img_gray, 'gray')
            plt.show()

    def select_target(self):
        self.drawing_area.bind("<ButtonPress-1>", self.point)

    def clear(self):
        self.drawing_area.delete("all")
        self.image = Image.new("RGB",
                              (self.width, self.height),
                              (255, 255, 255))
        self.draw=ImageDraw.Draw(self.image)
        self.line()

    def b1down(self,event):
        self.b1 = "down"

    def b1up(self,event):
        self.b1 = "up"
        self.xold = None
        self.yold = None

    def motion(self,event):
        if self.b1 == "down":
            if self.xold is not None and self.yold is not None:
                create_line = event.widget.create_line(self.xold,
                                         self.yold,
                                         event.x,
                                         event.y,
                                         smooth='true',
                                         width=3,
                                         fill='black')

                self.draw.line(((self.xold,self.yold),(event.x,event.y)),(0,0,0),width=3)
        self.xold = event.x
        self.yold = event.y

    def point(self, event):
        x, y = event.x, event.y
        self.x_current = x
        self.y_current = y
        radius = 2
        x_max = x + radius
        x_min = x - radius
        y_max = y + radius
        y_min = y - radius

        circle = self.drawing_area.create_oval(x_max,
                                               y_max,
                                               x_min,
                                               y_min,
                                               fill="black")

if __name__ == "__main__":
    root=tk.Tk()
    width = 700
    height = 400
    pos_x = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2 - width/2
    pos_y = (root.winfo_screenheight() - root.winfo_reqheight()) / 2 - height/2
    root.wm_geometry("%dx%d+%d+%d" % (width, height, pos_x, pos_y))
    root.config(bg='white')
    ImageGenerator(root, 10, 10, width, height)
    change_color()
    root.mainloop()
</code>

import tkinter as tk
import tkinter.messagebox as mb
from PIL import Image, ImageDraw
import numpy as np
import matplotlib.pyplot as plt

from undoredo import History

def change_color():
    root['bg'] = "black"

class ImageGenerator:
    def __init__(self, parent, posx, posy, width, height, *kwargs):
        self.parent = parent
        self.posx = posx
        self.posy = posy
        self.width =  width
        self.height = height
        self.sizex = 400
        self.sizey = 400
        self.b1 = "up"
        self.xold = None
        self.yold = None
        self.x_current = posx
        self.y_current = posy
        self.flag = True
        self.history = []
        self.list_point = []
        self.list_line = []
        self.lines = []
        self.ff = []
        self.last_line = []
        self.bb = []
        self.drawing_area=tk.Canvas(self.parent,
                                    width=self.width * 0.85,
                                    height=self.height * 0.93)
        self.drawing_area.place(x=self.posx, y=self.posy)
        self.drawing_area.bind("<Motion>", self.motion)
        self.drawing_area.bind("<ButtonPress-1>", self.b1down)
        self.drawing_area.bind("<ButtonRelease-1>", self.b1up)
        self.drawing_area.bind("<Control-z>", self.undo)

        self.button_fill = tk.Button(self.parent,
                                    text="Fill",
                                    width=10,
                                    bg='white',
                                     command=self.flood_fill)
        self.button_fill.place(x=self.width*0.88, y=70)

        self.button_clear = tk.Button(self.parent,
                                     text="Clear",
                                     width=10,bg='white',
                                     command=self.clear)
        self.button_clear.place(x=self.width*0.88, y=100)

        self.button_select_target = tk.Button(self.parent,
                                             text="Select Target",
                                             width=10,bg='white',
                                             command=self.select_target)
        self.button_select_target.place(x=self.width*0.88, y=40)

        self.button_line = tk.Button(self.parent,
                                    text="Line",
                                    width=10,bg='white',
                                    command=self.line)
        self.button_line.place(x=self.width*0.88, y=10)

        self.button_back = tk.Button(self.parent,
                                    text="back",
                                    width=5,bg='white',
                                    command=self.undo)
        self.button_back.place(x=self.width*0.875, y=self.height*0.90)

        self.button_next = tk.Button(self.parent,
                                     text="next",
                                     width=5, bg='white',
                                     command=self.redo)
        self.button_next.place(x=self.width*0.94, y=self.height*0.90)

        self.image = Image.new("RGB",
                              (self.width, self.height),
                              (255, 255, 255))
        self.draw=ImageDraw.Draw(self.image)

    def undo(self):
        if len(History.history(self)) != 0:
            dict_point = History.history(self).pop()
            History.points(self, dict_point["history"])
            self.drawing_area.delete(dict_point["circle"])

        elif len(History.show_lines(self)) != 0:
            # self.drawing_area.delete(dict_point1['line'])
            last_ln = self.last_line.pop(0)
            self.bb.append(last_ln)
            for el in range(last_ln, 0, -1):
                try:
                    dict_point1 = History.show_lines(self).pop()
                    History.lines(self, dict_point1["history"])
                    self.drawing_area.delete(el)
                except IndexError:
                    pass

    def redo(self):
        if len(History.show_points(self)) != 0:
            dict_point = History.show_points(self).pop()
            circle = self.drawing_area.create_oval(dict_point[0],
                                                   dict_point[1],
                                                   dict_point[2],
                                                   dict_point[3],
                                                   fill=dict_point[4])
        elif len(History.lines_show(self)) != 0:
            dict_point1 = History.lines_show(self)
            i=0
            vv = self.bb.pop(0)
            for el in dict_point1:
                if i == vv:
                    break
                else:
                    create_line = self.drawing_area.create_line(el[0],
                                                                el[1],
                                                                el[2],
                                                                el[3],
                                                                smooth='true',
                                                                width=3,
                                                                fill='black')
                    self.draw.line(((el[0], el[1]), (el[2], el[3])), el[4], width=el[5])
        History.show_lines(self).clear()

    def show_warning(self, msg):
        mb.showwarning("Предупреждение", msg)
        self.line()

    def line(self):
        self.drawing_area.place(x=self.posx, y=self.posy)
        self.drawing_area.bind("<Motion>", self.motion)
        self.drawing_area.bind("<ButtonPress-1>", self.b1down)
        self.drawing_area.bind("<ButtonRelease-1>", self.b1up)

    def fill(self, img_gray, start_coords, fill_value):

        xsize, ysize = img_gray.shape
        orig_value = img_gray[start_coords[0], start_coords[1]]

        stack = set(((start_coords[0], start_coords[1]),))

        if fill_value == orig_value:
            self.show_warning("Вы попали маркером в границу контура")
            return False

        while stack:
            x, y = stack.pop()

            if img_gray[x, y] == orig_value:
                img_gray[x, y] = fill_value
                if x > 0:
                    stack.add((x - 1, y))
                    self.drawing_area.create_line(x-1,
                                                    y,
                                                    x-1,
                                                    y,
                                                    width=3,
                                                    fill='black')

                if x < (xsize - 1):
                    stack.add((x + 1, y))
                if y > 0:
                    stack.add((x, y - 1))
                if y < (ysize - 1):
                    stack.add((x, y + 1))

                if x == (xsize - 1) or y == (ysize - 1):
                    self.show_warning("Выбранный контур не замкнут")
                    return False
        return True

    def rgb2gray(self, rgb):
        return np.dot(rgb[..., :3], [0.299, 0.587, 0.114])

    def flood_fill(self):
        color = 0
        img_gray = self.rgb2gray(np.uint8(self.image))

        flag_fill = self.fill(img_gray,
                             (self.y_current, self.x_current),
                             color)

        im = np.asarray(img_gray)
        self.image = Image.fromarray(np.uint8(im))
        # self.draw=ImageDraw.Draw(self.image)
        if flag_fill:
            plt.imshow(img_gray, 'gray')
            plt.show()

    def select_target(self):
        self.drawing_area.bind("<ButtonPress-1>", self.point)

    def clear(self):
        self.drawing_area.delete("all")
        self.image = Image.new("RGB",
                              (self.width, self.height),
                              (255, 255, 255))
        self.draw=ImageDraw.Draw(self.image)
        self.line()

    def b1down(self,event):
        self.b1 = "down"
        self.flag = True

    def b1up(self,event):
        self.b1 = "up"
        self.xold = None
        self.yold = None
        self.flag = False
        try:
            self.last_line.append(self.ff[-1])
        except IndexError:
            pass

    def motion(self,event):
        if self.b1 == "down":
            if self.xold is not None and self.yold is not None:
                create_line = event.widget.create_line(self.xold,
                                         self.yold,
                                         event.x,
                                         event.y,
                                         smooth='true',
                                         width=3,
                                         fill='black')

                self.draw.line(((self.xold,self.yold),(event.x,event.y)),(0,0,0),width=3)
                # self.history.append(create_line)
                dict_line = {"line":create_line, "history":[self.xold, self.yold, event.x, event.y, (0,0,0), 3]}
                History.register_lines(self, dict_line)
                self.ff.append(create_line)

        self.xold = event.x
        self.yold = event.y

    def point(self, event):
        x, y = event.x, event.y
        self.x_current = x
        self.y_current = y
        radius = 2
        x_max = x + radius
        x_min = x - radius
        y_max = y + radius
        y_min = y - radius

        circle = self.drawing_area.create_oval(x_max,
                                               y_max,
                                               x_min,
                                               y_min,
                                               fill="black")
        dict_history_point = {"circle": circle, "history": [x_max, y_max, x_min, y_min, "black"]}
        History.register(self, dict_history_point)

if __name__ == "__main__":
    root=tk.Tk()
    width = 700
    height = 400
    pos_x = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2 - width/2
    pos_y = (root.winfo_screenheight() - root.winfo_reqheight()) / 2 - height/2
    root.wm_geometry("%dx%d+%d+%d" % (width, height, pos_x, pos_y))
    root.config(bg='white')
    ImageGenerator(root, 10, 10, width, height)
    change_color()
    root.mainloop()

Файл undoredo

class History:
    def __init__(self):
        self.history = []
        self.list_line = []
        self.list_point = []
        self.lines = []

    def history(self):
        return self.history

    def register(self, command):
        self.history.append(command)

    def register_lines(self, line):
        self.list_line.append(line)

    def lines(self, line):
        self.lines.append(line)

    def lines_show(self):
        return self.lines

    def show_lines(self):
        return self.list_line

    def points(self, point):
        self.list_point.append(point)

    def show_points(self):
        return self.list_point


Регулярное выражение для возврата слов по условию в виде списков
Есть текст вида

продолжаем делиться техническими характеристиками публикаций в
facebook сегодня подготовили для вас гайд по рекламным форматам
смотрите в карточках #tag_1 #tag_2

код
<code>
import re
text = 'продолжаем делиться техническими характеристиками публикаций в facebook сегодня подготовили для вас гайд по рекламным форматам смотрите в карточках #tag_1 #tag_2, а еще #tag_14'
tag2 = re.findall('#tag_.?', text)
print(tag2)
</code>
возвращает список из трёх элементов:

['#tag_1', '#tag_2', '#tag_1']

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

['#tag_1'], ['#tag_2'], ['#tag_14']

тогда вот так
<code>
import re
s = []
text = 'продолжаем делиться техническими характеристиками публикаций в facebook сегодня подготовили для вас гайд по рекламным форматам смотрите в карточках #tag_1 #tag_2, а еще #tag_14'
s.extend([i] for i in re.findall('#tag_\d+', text))
print(s)
</code>


Python Рекурсия
Есть задача:
Кузнечик прыгает по столбикам, расположенным на одной линии на равных расстояниях друг от друга. Столбики имеют порядковые номера от 1 до n
слева направо. В начале Кузнечик сидит на столбике с номером 1. Он может прыгнуть на следующий столбик или сразу на второй столбик, считая от текущего.
Найдите количество способов, которыми Кузнечик может добраться до столбика с номером n. Учитывайте, что Кузнечик не может прыгать назад.
Внимание! Данная задача должна решаться рекурсией. Вы не можете использовать циклы
Тесты:
<code>
входные данные
3
выходные данные
2

входные данные
4
выходные данные
3

входные данные
45
выходные данные
1134903170
</code>
Как это решить рекурсией а не циклами???

Cкорее всего, требуется использование "ленивого" ДП: вы пишете самое глупое решение через рекурсию: f(n) = f(n - 1) + f(n - 2), f(1) = 1, f(2) = 1 и добавляете внешний массив dp[MAXN+1], в который записываете ответы для каждого рассчитанного на данный момент n.
Без использования дополнительной памяти, можно просто переписать цикл в рекурсию, но это уже извращение.
<code>
def f(n):
    global dp
    if dp[n] != -1:
        return dp[n]
    dp[n] = f(n - 1) + f(n - 2)
    return dp[n]

dp = [-1] * 46
dp[0], dp[1] = 0, 1
</code>


Заменить числа списка в цикле for
Есть небольшой тестовый код, который делает проверку значений в списке. Если значение не удовлетворяет условие, то оно будет заменено на эталонное значение. Чтобы записать новые значение мне приходится создавать новый пустой список в начале и записывать всё в него. Можно как-нибудь перезаписывать число в исходном списке без создания new_step_time_row? И какие могут быть рекомендации, чтобы сделать код лаконичнее?
<code>
dec_rate = 0
# Количество считанных значений в секунду
values_per_second = 4250 / (dec_rate + 1)
# Эталонное время между каждым новым значением
reference_time = 1 / values_per_second
# Доверительный интервал
сonfidence_interval_up = reference_time * 1.5
сonfidence_interval_down = reference_time * 0.5

step_time_row = [0.00023529, 0.00036, 0.00038, 0.00023458456,
                 0.00021529, 0.00019529, 0.00010529, 0.00009529,
                 0.00028529, 0.00036529, 0.00029529, 0.00021529]

new_step_time_row = []

# Цикл, который проверяет входит ли время в допустимые пределы.
# Если не входит, то заменяется эталонным временем.
for number in step_time_row:
    if number > сonfidence_interval_up or number < сonfidence_interval_down:
        number = reference_time
    new_step_time_row.append(number)

print(new_step_time_row)
</code>

Если главное требование именно лаконичность кода, а за одно и скорость при больших наборах данных, то я бы сделал вообще в  одну строку, через numpy (и никаких циклов):
<code>
step_time_row=np.array(step_time_row)
step_time_row[(step_time_row > сonfidence_interval_up) | (step_time_row< сonfidence_interval_down)] = reference_time
</code>


Выбрать значние из списка
Есть список
l = [10,20,10,10,1,5,10,2,2,5,5]
Для того чтобы получить последнее зачение из
l надо написать
l[-1] = 5
А как получить максимальное (или минимальное) значение например за последних 5 значений из списка? (это будет 10 для максимального). При этом оставить возможность, что если все же набрать не 5 последних значений, а 1, то макс-мин значение будет последним, тоесть 5.
Пример:

Для l = [10,20,10,10,1,5,10,2,2,5,5]

l макс 5 = 10
l мин 7 = 1
l мин 1 = 5

Просто выбери количество символов котрые хочешь отобразить с конца. а потом с помощью функций  min(), max() сможешь получить значение.
<code>
l = [10,20,10,10,1,5,10,2,2,5,5]
b = l[-5:] # Отобразить последние 5 символов
print(max(b))
</code>


помогите найти проблему. Script не работает никаких ошибок не выдает
<code>
#!/usr/bin/env python3
import subprocess
import netifaces
import re
import random
import time

def change_mac(interface, new_mac):
    subprocess.call(["ifconfig", interface, "down"])
    subprocess.call(["ifconfig", interface, "hw", "ether", new_mac])
    subprocess.call(["ifconfig", interface, "up"])

def get_current_mac(interface):
    ifconfig_result = subprocess.check_output(["ifconfig", interface])
    mac_address_search_result = re.search(r"\w\w:\w\w:\w\w:\w\w:\w\w:\w\w", str(ifconfig_result))
    if mac_address_search_result:
       return mac_address_search_result.group(0)
    else:
       print("[-] Could not read MAC address.")

def get_random_mac_address():
    characters = "0123456789abcdef"
    random_mac_address = "00"
    for i in range(5):
        random.choice(characters)
    return random_mac_address

print("[+] Searching for Network Interfaces[+]")
interface_list =    netifaces.interfaces()
interface_list.remove("lo")
print("[+] Please    choose interface to change MAC address[+]") print(interface_list)

interface = input("interface > ")
print("[+] How are you going to change MAC address?")
print("[+] 1.    Randomly \n[+] 2. Custom")
change_type = input("==>")

if change_type == 1:
    get_random_mac_address()
    new_mac = random_mac_address
    interface_mac = get_current_mac(interface)
    print("[+] MAC address for ", interface, str(interface_mac))
    change_mac(interface, new_mac)

    current_mac = get_current_mac(interface)
    if current_mac == new_mac:
        print("[+] MAC address randomly changed to ", current_mac)

if change_type == 2:
    new_mac = input("new MAC > ")
    interface_mac = get_current_mac(interface)
    print("[+] MAC address for ", interface, str(interface_mac))
    change_mac(interface, new_mac)
    current_mac = get_current_mac(interface)

    if current_mac == new_mac:
        print("[+] MAC address was successfully changed to ", current_mac)
    else:
        print("[-] MAC address did not changed!")

if change_type < "1":
    print("[-] Type 1 or 2 for select!")

if change_type > "2":
    print("[-] Type 1 or 2 for select!")
</code>

1
у вас то change_type == 1, то change_type < "1", вы получаете change_type = input("==>") как строку, так и сравнивайте со строкой; get_random_mac_address() присвойте переменной; сами-то знаете, как оно должно работать? ;) – Jack_oS вчера
1
Вы вызываете функцию get_random_mac_address(), но не присваиваете ее значение в переменную. То что она возвращает random_mac_address, не означает что в следующей строке "new_mac = random_mac_address" вы можете этим значением оперировать. – alex just вчера


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

3. Написать функцию thesaurus(),
принимающую в качестве аргументов имена сотрудников и возвращающую словарь,
в котором ключи — первые буквы имен, а значения — списки, содержащие имена,
начинающиеся с соответствующей буквы.

Например:
# >>> >>> thesaurus("Иван", "Мария", "Петр", "Илья")
{
    "И": ["Иван", "Илья"],
    "М": ["Мария"], "П": ["Петр"]
}
Подумайте: полезен ли будет вам оператор распаковки?
Сможете ли вы вернуть отсортированный по ключам словарь?

def thesaurus(*names):
    list_name = [*names]
    dictionary = {}
    list_name_1 = []
    for name in list_name:
        name.capitalize()
        char = name[0]
        dict_1 = {char : name}
        dictionary.update(dict_1)

    return dictionary

print(thesaurus("Майа", "Дарси", 'Макс'))

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

попробуйте так:
<code>
from collections import defaultdict

def thesaurus(*names):
    res = defaultdict(list)
    for x in names:
        res[x[0]].append(x)
    return dict(res)
</code>


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

import pandas as pd
import re
from pymorphy2 import MorphAnalyzer

df = pd.read_csv('Example.csv', encoding = 'utf-16')

#Удалим из текста разрывы строк \r\n, приведя содержимое столбца с типу строки
df['tokenize'] = df['body'].str.replace('\r\n','')
df.tokenize.head()

m = MorphAnalyzer()

# убираем все небуквенные символы
regex = re.compile("[А-Яа-яA-z]+")

def words_only(text, regex=regex):
    try:
        return regex.findall(row.lower())
    except:
        return []

print(*words_only(df.tokenize[0]))

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

сегодня и завтра подключайтесь к бесплатной онлайн конференции welcome
to gamedev которую при инфоподдержке организует google
совместно с игровыми студиями кефир belka games nexters десять
специалистов из разных направлений разработка геймдизайн арт аналитика
и маркетинг расскажут как попасть в геймдев с чего начинать и почему
делать игры здорово подключайтесь если хотите работать в игровой
индустрии начало в по московскому времени https vk cc bysuvu

А как создать новый столбец фрейма данных и в нем проделать такую операцию для содержимого столбца
body каждой строки?

for row in df.tokenize:
    df['words_only'] = words_only(df.tokenize(row))

дает ошибку.

df["body_norm"] = (df["body"]
                   .str.replace("\r\n", " ")
                   .str.lower()
                   .str.replace(r"[^a-zа-я\s]", ""))

результат:

In [347]: df["body_norm"]
Out[347]:
0      сегодня и завтра подключайтесь к бесплатной он...
1      привет на этой неделе познакомимся с профессие...
2      хотели бы получить степень магистра но дистанц...
3      календарь на телефоне не врет уже  февраля а в...
4      юлия ушла с должности руководителя отдела в ту...
                             ...
995    дизайнбитва сегодня голосуем какой логотип луч...
996    сегодня на свой первый проект я даже смотреть ...
997    макрос для word  это не просто программа котор...
998    в сегодняшней статье подробно расскажем как сд...
999    расписание вебинаров на эту неделю  как всегда...
Name: body_norm, Length: 1000, dtype: object


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

a = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

b = {'a': 1, 'c': 3}

Проверить наличие b в a, и на выходе значение типа
bool
Пробовал такое решение:

b.items() <= a.items()

Так же возникла проблема с словарем такого типа:

a = {'a': 1, 'b': [{'a1': 1,'b2': 2}], 'c': 3, 'd': 4, 'e': 5}

b = {'c': 3, 'b': [{'a1': 1,'b2': 2}]}

Но его проверить таким способом не получится

 b.items() <= a.items()

Ищу другие решения данной проверки

Попробуйте так:
<code>
a = {'a': 1, 'b': 2,'c': 3, 'd': 4, 'e': 5}
b = {'a': 1, 'c': 3}

if len(b.items() & a.items()) == len(b):
    print(True, len(b.items() & a.items()), b.items() & a.items())
else:
    print(False)
</code>


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

['1_1_Oleg', '1_2_Oleg', '1_3_Oleg',
 '1_4_Oleg', '1_5_Oleg', '1_6_Oleg',
 '2_1_Maks', '2_2_Maks', '2_3_Maks',
 '2_4_Maks']

Из массива по форме \

{Номер поста}
_
{Номер фотографии}
_
{Имя Актёра} \
нужно сделать сортировку по
Номеру поста и
Номеру фотографии, а потом выводилось
Имя Актёра

Если привести все цифры к int, то все отсортируется правильно:

lst = [
    '1_1_Oleg1',
    '1_2_Oleg',
    '1_3_Oleg3',
    '1_4_Oleg2',
    '1_5_Olega',
    '1_6_Olegn',
    '2_4_Maks1',
    '2_1_Maks4',
    '2_2_Maks2',
    '11_3_Maks3',
]

def sortlst(val: str):
  n1, n2, string = val.split('_')
  return int(n1), int(n2), string

print(*sorted(lst, key=sortlst), sep='\n')

# 1_1_Oleg1
# 1_2_Oleg
# 1_3_Oleg3
# 1_4_Oleg2
# 1_5_Olega
# 1_6_Olegn
# 2_1_Maks4
# 2_2_Maks2
# 2_4_Maks1
# 11_3_Maks3

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

lst = [
    '1_1_Oleg1',
    '1_2_Oleg',
    '1_3_Oleg3',
    '1_4_Oleg2',
    '1_5_Olega',
    '1_6_Olegn',
    '2_4_Maks1',
    '2_1_Maks4',
    '2_2_Maks2',
    '11_3_Maks3',
]
print(*sorted(lst, key=lambda v: v.split('_')), sep='\n')
# 1_1_Oleg1
# 1_2_Oleg
# 1_3_Oleg3
# 1_4_Oleg2
# 1_5_Olega
# 1_6_Olegn
# 11_3_Maks3
# 2_1_Maks4
# 2_2_Maks2
# 2_4_Maks1


как прочитать значение из ячейки excel?
Надо прочитать из ячейки excel информацию и заполнить переменную.

Можно воспользоваться модулем
openpyxl.
Пример чтения из ячейки
A1:

# pip install openpyxl
from openpyxl import load_workbook

wb = load_workbook('file.xlsx')
ws = wb.active

data = ws['A1'].value


Как сконвертировать строку в дату время?

def main():
    with open('data.csv', newline='', encoding='utf-8') as File:
        reader = csv.reader(File)
        for pdata_row in reader:
            pdata = pdata_row[0]
            pdata_form = pdata[3:].replace(")", "").replace(" ", "").strptime(pdata_form, '%Y-%m-%d')

if __name__ == '__main__':
    main()

Помогите разобраться с
.strptime(pdata_form, '%Y-%m-%d')
Нужно строковую дату(27.9.1991) отформатировать и привести к
datetime в чем не точность?

Возможно, Вам поможет такой код:

from datetime import datetime

oldformat = '27.9.1991'
datetimeobject = datetime.strptime(oldformat,'%d.%m.%Y') #формат даты
newformat = datetimeobject.strftime('%Y-%m-%d')
print (newformat)

Для примера привела полученную дату к другому виду: ГГГГ-ММ-ДД
Вывод:

1991-09-27


python как узнать серийный номер жесткого диска linux
как с помощью python узнать серийный номер жесткого диска в linux
linux версии 4.14.116

за информацией можно обратиться непосредственно к программе linux. точнее, к файлам виртуальной файловой системы
sysfs, обычно примонтированной в каталог
/sys.
на языке программирования python это может выглядеть примерно так:

#!/usr/bin/env python

import glob

for wwid in glob.glob("/sys/block/*/device/wwid"):
    print(wwid)
    with open(wwid, "r") as file:
        try:
            data = file.readline().strip()
            print(data)
        except:
            print("not readable")

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

/sys/block/sdd/device/wwid
t10.ATA     Hitachi HDS721010CLA332                       JP2940HD33Z1JC
/sys/block/sdb/device/wwid
t10.ATA     ST2000VX008-2E3164                                  Z52AV6HP
/sys/block/sde/device/wwid
not readable
/sys/block/sdc/device/wwid
t10.ATA     Hitachi HDS721010CLA332                       JP2940HD33YXGC
/sys/block/sda/device/wwid
t10.ATA     ST2000VX008-2E3164                                  Z52AKGD1


Поиск по части элемента в массиве и вывод элемента (Python)
Имеется файл, в котором порядка тысячи строк. Для быстроты поиска я сперва помещаю его в массив (пока тестирую, не уверен, что так на самом деле быстрее). В общем, мне нужно, чтоб при нахождении строки, содержащей слово, выводилась вся строка. Попытался реализовать вот так, но выводится последняя строка из файла. И я не очень понимаю, как мне получить нужную строку?
<code>
list = []
f = open('list.txt', 'r', encoding='utf-8')
for line in f:
    list.append(line)

def searchlist(word):
    if any(word in line for line in list):
        print('Your word is in this line:')
        print(line)
    else:
        print('There is no lines with your word')

while True:
    word = input('Input word to find:')
    searchlist(word)
</code>

вместо этого:

f = open('list.txt', 'r', encoding='utf-8')
for line in f:
    list.append(line)

используйте это:

f = open('list.txt', 'r', encoding='utf-8')
list = f.readlines()

и кстати называть переменные ключевыми словами не очень хорошо (в смысле плохо)
последняя строка выводится, потому что

if any(word in line for line in list):

определяет СНАЧАЛА есть ли слово во всех строках, поэтому если слово есть, то вы получаете последнее значение
line из цикла, т.е. последнюю строку в списке
итого ваш код должен быть таким:

f = open('list.txt', 'r', encoding='utf-8')

is_found = False

for line in f.readlines():
    if word in line:
        is_found = True
        print('Your word is in this line:', line)

if not is_found:
    print('There is no lines with your word')

f.close()

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

f = open('list.txt', 'r', encoding='utf-8')

found = [line[:-1] for line in f.readlines() if word in line]

if len(found):
    print('Your word is in this line:')
    print(*found, sep='\n')
else:
    print('There is no lines with your word')

f.close()

P.S.
и самое главное
word in text ищет не слово, в тексте, а часть текста, например
"xxy" in "xxyxx" найдет вхождение текста
так что по хорошему это тоже надо бы учесть


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

Параметр lst - список, который может содержать другой список

>>> flatten_list([])
[]
>>> flatten_list([1,2,3])
[1, 2, 3]
>>> flatten_list([1,2,[3,4],5,6])
[1, 2, 3, 4, 5, 6]
>>> flatten_list([[[[1],2],3],4,[5,[6,[7]]]])
[1, 2, 3, 4, 5, 6, 7]

код попытки:

def flatten_list(lst):
    flat_list = []
        for sublist in lst:
            for item in sublist:
                flat_list.append(item)
    return flat_list

Таким способом можно раскрыть 2D список, как из этого сделать для 3D, 4D списка и т.д Рекурсия ? Как ее можно реализовать в данной функции ?

есть наверное средства библиотеки numpy и т.д., но если в лоб встроенными средствами, то можно так:

def flatten_list(arr):
    res = []
    for obj in arr:
        res += flatten_list(obj) if isinstance(obj, (list, tuple, set)) else [obj]

    return res

print(flatten_list([[[[1],2],3],4,[5,[6,[7], {1,2,3,4}]]]))

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


Ничего не получается установить с помощью PIP(python) [закрыт]

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

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

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

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

Ввожу

pip install livewires
и выдает ошибку

invalid syntax

я ввожу команду по пути

С:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.752.0_x64_qbz5n2kfra8p0\python3.9.exe
Что делать?

Вы вводите это в REPL!
А надо в командную строку

pip install livewires

Через REPL будет работать так:

import os
os.system('pip install livewires')

И самое главное: Удалите питон из microsoft store и поставьте с официального сайта: python.org