Консольный чат на Python. Реализация регистрации в чате
Прошу вашего совета. Я хочу реализовать простенький чат на python c одним условием - регистрацией "участников чата".
(Ник участника чата можно зарезервировать под себя, и введя пароль - зайти в чат под своим ником)
Саму логику обычного чата клиент-сервер я реализовал и проблем не возникало до тех пор, пока не появился процесс "регистрации" в чате.
Логика работы:

- Соединение с сервером
- Введение имени
- Утверждение, что имя введено верно
- Введение пароля
- Повторное введение пароля
- Пользователь заходит в общий чат

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

import socket
import threading

SERVER_ADDRESS = ('localhost', 8125)
sor = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sor.bind(('', 0))
sor.sendto(('Connect to server').encode('utf-8'), SERVER_ADDRESS)

def reading_socket():
    while True:
        data = sor.recv(1024)
        print(data.decode('utf-8'))

potok = threading.Thread(target=reading_socket)
potok.start()

while True:
    message = input()
    sor.sendto((message).encode('utf-8'), SERVER_ADDRESS)

Код сервера:

import socket

SERVER_ADDRESS = ('localhost', 8125)

server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(SERVER_ADDRESS)
clients = []
members = {}
print("Server is running")

#ТУТ БОЛЬШАЯ ФУНКЦИЯ "РЕГИСТРАЦИИ"
#С ВВОДОМ ИМЕНИ, ПОДТВЕРЖДЕНИЕМ, ПАРОЛЕМ
def register_on_chat(port_address):
    register_data = 'Необходимо пройти регистрацию, введите свой ник: '
    server_socket.sendto(register_data.encode('utf-8'), address)

    def confirm_nickname(port_address):
        name, address = server_socket.recvfrom(1024)
        registration_data = f"Ваш ник {name.decode('utf-8')}? Введите Уes или No."
        server_socket.sendto(registration_data.encode('utf-8'), address)
        append_to_list(name, port_address)

    def new_nickmane(address):
        registration_data = 'Введите свой ник: '
        server_socket.sendto(registration_data.encode('utf-8'), address)
        confirm_nickname(address)

    def append_to_list(name, port_address):
        data, address = server_socket.recvfrom(1024)
        if data.decode('utf-8') == 'Yes':
            get_pass(name)
        elif data.decode('utf-8') == 'No':
            new_nickmane(port_address)

    def get_pass(name):
        pass_data_1 = f"Привет {name.decode('utf-8')} Введите пароль для своего ника: "
        server_socket.sendto(pass_data_1.encode('utf-8'), address)
        password_1, adr= server_socket.recvfrom(1024)
        pass_data_2 = "Повтори пароль"
        server_socket.sendto(pass_data_2.encode('utf-8'), address)
        password_2, adr = server_socket.recvfrom(1024)

        if password_1 == password_2:
            members[name.decode('utf-8')] = password_1.decode('utf-8')
            pass_data_3 = "Отлично, регистрация прошла успешно"
            server_socket.sendto(pass_data_3.encode('utf-8'), address)
            print(members)
        else:
            pass_data_4 = "Давай-ка попробуем снова"
            server_socket.sendto(pass_data_4.encode('utf-8'), address)
            get_pass(name)

    confirm_nickname(port_address)

while True:
    data, address = server_socket.recvfrom(1024)
    print(address[0], address[1])
    if address not in clients:
        clients.append(address)
        register_on_chat(address)
        text = "Регистрация прошла успешно. Добро пожаловать в чат!"
        server_socket.sendto(text.encode('utf-8'), address)

    for client in clients:

        if client == address:
            text_from_client = data.decode('utf-8')
            print(text_from_client)

            continue

        server_socket.sendto(data, client)

Спасибо за советы.

Вам нужно создать сессии для пользователей и отделить их от получения данных.
<code>
class Session:
    def __init__(self, address, sock):
        self.state = 'init'
        self.address = address

    def on_message(self, message):
        if self.state == 'init':
             answer = 'Необходимо пройти регистрацию, введите свой ник: '
        elif self.state == 'waitname':
             answer = f'Ваш ник {message}'
             self.nick = message
        .......
        return answer

....

clients = {}

while True:
    data, address = server_socket.recvfrom(1024)
    session = clients.get(address, None)
    if not session:
        session = Session(address,server_socket)
        clients[address] = session
    answer = session.on_message(data.decode('utf-8'))
    self.sock.sendto(answer.encode('utf-8'), address)
    if session.state == 'chat':
        for other_session in clients.values():
            if other_session.state == 'chat':
                self.sock.sendto(f"{session.nick}: {data}\n".encode('utf-8'), other_session.address)
</code>
Класс Session будет хранить состояние чата и задавать следующий вопрос в зависимости от этого состояния. А словарь clients будет привязкой сессии к конкретному клиенту, а не только списком адресов.
Можно без класса, а состояние хранить в словаре.


Проверять в словаре существование элемента python
У меня есть список
{"result":"ok","code":0,"data":{"nickName":"habast","uid":3731878,"accountRank":4}}, но в нем может не быть некоторых данных
{"result":"ok","code":0,"data":{"nickName":"habast"}}. Как проверять элемент на существование и если не существует то добавлять его и заменять на
'None'. Пример
{"result":"ok","code":0,"data":{"nickName":"habast"}} преобразовываем в
{"result":"ok","code":0,"data":{"nickName":"habast","uid":3731878,"accountRank":4,"uid":"None","accountRank":"None"}}

dict в питоне имеет метод

 |  setdefault(self, key, default=None, /)
 |      Insert key with a value of default if key is not in the dictionary.
 |
 |      Return the value for key if key is in the dictionary, else default.

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

rs['data'].setdefault('uid', None)

исправит ваш словарь.
Также при обработке входных данных полезно забирать значения из словаря через

uid = rs['data'].get('uid', None)

Вернет значение
None вместо
KeyError.
Ещё можно сделать прототип по схеме данных:

schema = {"uid": None, "rank":0}
rs['data'] = dict(schema).update(rs['data'])

Тут dict() создаст копию схемы, а update() обновит поля на нужные значения.


Добавить аргумент при запуске скрипта python
Хочу добавить строку как аргумент, но при обращении к этому элементу я вижу, что там хранится массив с 1-им значением. Как сделать, чтобы аргумент стал строкой?
<code>
parser.add_argument(
    help="Operator name",
    action="store",
    dest="operator",
    nargs="+"
)
</code>

nargs="+" отвечает за объединение переданных аргументов в список. Укажите
nargs="?" или совсем уберите, если вам не нужен.


Заменить два регулярных выражения одним
Есть регулярное выражение вида
<code>
data = re.sub(r'\s+', ' ', re.sub(r'[^\w]', ' ', data)).strip()
</code>
Оно заменяет все небуквенные символы на пробелы и удаляет лишние
Можно ли его заменить на одно регулярное выражение, чтобы потом можно было его заранее скомпилить?

Можно. Вот так:
<code>
data = re.sub(r'\W+', ' ', data).strip()
</code>
Обратите внимание: W - здесь большая буква, не маленькая!


Простая авторизация с логином и паролем
Пишу десктопное приложение для windows на python с помощью QT5. Хочу сделать небольшую авторизация с логином и паролем. Но, увы только начал разбираться в sqllite. Помогите кто чем сможет. Код приветствуется.

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

логин : пароль

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


Как отделить нужную часть?
есть такой output:
<code>
                    Starting at:
         $0.06 USD # нужное
         $0.05 USD
</code>
Я полагаю,что можно отделить с помощью регулярных выражений, но большое кол-во пробелов меня немного смущает, помогите.

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

import re
s="\n   $0.06 USD   \n" #ваша строка
r =re.search('\$(\d+\.\d{2}) USD', s)
print (r.group(1)) #0.06

Поиск будет осуществляться по шаблону
\d+\.\d{2}. Метод search вернёт первое совпадение в виде объекта Match, а остальные отсечёт.
Объект Match в свою очередь будет содержать найденные значения в группах. Первая группа (с индексом 0) - это выражение целиком, вторая (с индексом 1) - первое соответствие шаблону в первых скобках (у нас они одни, так что на этом поиск закончится)


как найти произведение в матрице ,ниже главной диагонали
суть такова - задается размер массива(NxN),заполняется случайными числами,а далее надо найти произведение всех чисел которые лежат ниже главной диагонали.Не понимаю как вычислить произведение
<code>
from random import randint
z = 1
N = int(input())
x = [[0]*N for i in range(N)]
for i in range(N):
   for c in range(N):
      x[i][c] = randint(1, 100)
for v in range(len(x)):
   print(x[v])
</code>

Вот это должно сработать.
<code>
result = 1
for a in range(len(x)):
   for b in range(len(x[a])):
      if a > b:
         result *= x[a][b]
print(result)
</code>


Как сделать чтобы цикл for передавал случайное количество значений из списка
Есть цикл
for который передает все значения списка
links100 (в списке цифры для наглядности, может быть все что угодно). Как дописать цикл чтобы он возвращал случайный процент (в диапазоне от 60% до 80%) значений списка
links100. В результате значения списка должны идти по-порядку.
Пример ответа:
1 2 3 5 6 8 10

import random

def get_result(result):

    print(result)

def main():

    links100 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    for i in links100:
        result = i
        get_result(result)

if __name__ == '__main__':
    main()

import random

def get_result(result):
    print(result)

def main():

    links100 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    num_samples = round(len(links100) * random.uniform(0.6, 0.8))

    rand_mask = [1] * num_samples + [0] * (len(links100) - num_samples)
    random.shuffle(rand_mask)

    for (i, is_chosen) in zip(links100, rand_mask):
        if is_chosen:
            result = i
            get_result(result)

if __name__ == '__main__':
    main()


Во что распаковывается словарь Python
Всем привет!
Пусть имеем словарь:

d1 = {'a':1,'b':2}

Имеется функция:

def function(a,b):
    print(a)

Мы можем вызвать функцию, путем распаковки словаря d1:

function(**d1)

Следовательно словарь d1, в качестве аргумента функции, распаковывается в конструкцию вида:

a = 1, b = 2

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

d2 = {**d1}, или
d2 = dict(a = 1, b = 2)

Но нельзя вот так:

d2 = {a = 1, b = 2}

Так во что именно распаковываются словари? Все зависит от контекста?

Вы верно предположили — всё зависит от контекста, давайте же рассмотрим это детальнее.
Примечание: Я использую
Python 3.8 для испытаний

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

x = {'a': 'Hello', 'b': 'World'}

В данном примере словарь будет создан вызовом команды BUILD_CONST_KEY_MAP, которая является специализированной версией BUILD_MAP. Описание самое обыкновенное, не будем заострять на этом внимание.
Создание словаря с помощью распаковки в литералах
Пример:

d = {**x, **y, **z}

Этот способ отличается от первого. Главное, что нужно понять — это не имеет никакого отношения к именованным аргументам. Это специализированный способ.
Python вызовет команду BUILD_MAP_UNPACK, чтобы осуществить такое создание. Описание команды гласит:

Берёт
count словарей из стека, объединяет их в один словарь, и помещает результат в стек. Осуществляет распаковку словарей в словарь вида
{**x, **y, **z}.
Новое в версии 3.5.

Примечание: Вольный перевод. Sorry for my English :)
Распаковка в конструктор класса
Пример:

x = {'a': 'Hello', 'b': 'World'}
d = dict(**x)

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

Это похоже на BUILD_MAP_UNPACK, но используется для
f(**x, **y, **z) синтаксиса вызова.

Примечание: Вольный перевод. Sorry for my English :)
Распаковка словаря в именованные аргументы
Пример:

def f(a, b):
    print(a)
x = {'a': 'Hello', 'b': 'World'}
f(**x)

Процесс абсолютно аналогичен варианту выше.

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


Обработка данных перед сохранением админ панели Django
Есть простая модель

class Job(models.Model):
    image = models.ImageField(upload_to='images/')
    summary = models.CharField(max_length=200)
Необходимо реализовать обработку введённых данных  с формы в админке перед сохранением. Логичнее, наверно, сделать отдельную форму и вьюху для обработки, но если всё таки необходимо форму оставить в админ панели, то как можно реализовать обработку?
В модели есть ImageField, мне нужно обрезать картинку и только потом записывать в базу для дальнейшего вывода в шаблон

Вы можете переопределить метод ModelAdmin.save_model(request, obj, form, change).


Процент элемента из массива
Есть блокнот с большим количеством данных, например 1000 элементов. Данные - это пять разных элементов. Пусть это будут: а1, а2, а3, а4, а5. Они встречаются в разном порядке и с разной вероятностью. Каких-то элементов больше, а каких-то меньше. Я создал массив, заполнил его и перемешал.
Задача:

Выяснить какой процент каждого элемента встречается относительно всех элементов. Узнать количество и процент.
Как часто выбранный элемент, например а2, встречается через допустим через 3 других элементов. (а3, а1, а5, а2, а3, а5) тут через 3 элемента попался а2. Узнать количество и процент.
Как часто выбранный элемент, например а2, встречается подряд (а1, а2, а2, а2, а5, а3). Узнать количество и процент.
Выяснить, как часто встречаются выбранные элементы из связки (одно из или вместе подряд - всё равно) например а2 и а5, через 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 других элементов (а1, а1, а3, а2, а1, а5, а4) тут через 3 и через 1, но через 3 и 1 это две разные категории. Узнать количество и процент.
Выяснить, как часто выбранная связка элементов, например а2 и а5, встречается подряд (одно из или вместе подряд - всё равно). Узнать количество и процент.

4 и 5 пункты по сути это 2 и 3.
Всего 10 категорий.
Пример для 2 пункта:
У нас есть массив с числами. Всего 5 разных видов чисел, допустим, 1, 2, 3, 4, 5 в разном количестве, допустим 1 - 50 штук, 2 - 40, 3 - 30, 4 - 20, 5 - 10. Они перемешаны между собой и встречаются в разном порядке. Задача - найти все числа 2, которые встречаются, после трёх чисел, не являющимися двойками. Например: 1, 2, 5, 1, 1, 3, 2, 5, 4, 1, 2, 1, 1, 3, 2, 2, 5, 5, 4, 1, 2. Первую двойку брать не нужно, она идёт после одного числа. Вторую двойку тоже не берём она, после 4 чисел. А берём третью двойку, она идёт после трёх чисел, то, что нам нужно. А четвёртую двойку не берём, так как она тоже идёт после трёх ненужных чисел, но она не одна. Она идёт как пара двоек. А должна быть одна двойка.
По сути нужна двойка, которая встречается через 3 ненужных элемента, и всё равно парная она или нет дальше. Главное, через 3 ненужных, чтобы была двойка и вычислить, сколько таких ситуаций встречается в массиве.

В комментариях вы приложили код. Он использует внешнею библиотеку NumPy, советую вам о ней почитать.
Использование этой библиотеки не обязательно.
Для начала разобъем массив на массив, содержащий xN-ые элементы, где N - это размер среза ( через сколько чисел нужно искать )

array[N::N] - наш массив, начинающийся с N+1 го элемента со срезом N.
После обработаем его в цикле, и для каждого совпадения с необходимым числом прибавим 1 к счетчику

N=10 ## Размер среза
D=a2 ## Число
counter = 0

for digit in array[N::N]:
    counter+=(digit == a2) ## Скобки для наглядности

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


Даны два слова. Вывести на экран те буквы слов, которые встречаются в обоих словах только один раз [закрыт]

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

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

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

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

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

Я бы разбил эти слова на 2 списка(списки желательно сделать двусвязными, что бы было менее затратно удалять элементы из середины(при больших входных данных удаление из середины обычного списка поглощает много памяти)):
<code>
from collections import deque
l = deque()                  # реализует двусвязный граф(очередь)
                             # имеется возможность удалить N-ый элемент как справа(l.pop()),
                             # так и слева(l.leftpop())
</code>
Далее пройдёмся по 2 этим спискам, и удалим повторяющиеся элементы(как в слове процессор)
Потом просто запускаешь 2 вложенных цикла, проверяешь есть ли 1 элемент в другом списке:

Если нет, то добавляешь этот элемент в новый список ans, который в конце необходимо просто вывести
Если оно есть во 2-м списке, то пишем break, и выходим из вложенного списка, запуская след круг первого списка.

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


как спарсить вложенные контент
Cтруктура
HTML:

<div class="responsive">
   <div id="footer_responsive">
     <span id="footerLogo">
       <span id="footerText">
       <span class="valve_links">
       Тут нужный мне контент.
       </span>
       </span>
     </span>
   </div>
</div>

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

from bs4 import BeautifulSoup as BS
html = """
<div>
   <div>
     <span>
       <span>
       Тут нужный мне контент.
       </span>
     </span>
   </div>
</div>
"""
soup = BS(html)
print(soup.div.div.span.span.text)


Python "\n" не работают в строке, которая возвращается из БД
Храню в базе данных MongoDB разные строки, например:
"Abc \n Abc", когда пытаюсь её вывести через print(my_string), то получаю вывод:
"Abc \n Abc", вместо ожидаемого:

"Abc
Abc"

Вот сам код:

my_string = get_one_string_from_bd()
print(my_string)
print(type(my_string))
print(repr(my_string))

Вывод:

Abc \n Abc
<class 'str'>
Abc \\n Abc

Что я делаю не так и как заставить работать перевод строки?
Проблема решается если добавить (n с двумя палочками, заменить на n с одной палочкой, почему-то на этом сайте заменяется на 1) .replace("\n", "\n") к строке, но это как-то странно.

Строка из БД не содержит символа перевода строки, в ней есть последовательность символов
\ и
n. Строка, скорее всего, была преобразована в JS с помощью
JSON.stringify.
Для того, чтобы восстановить пробельные символы в строке, можно использовать

my_string = my_string.encode('latin1').decode('unicode-escape').encode('latin1').decode('utf8')

И ещё

import codecs
my_string = codecs.escape_decode(my_string)[0].decode('unicode-escape')

Пример работы кода в Python 3


Чтение n-ого бита в байте
Подскажите как можно реализовать чтение 7-ого,8-ого бита в 1-ом байте?

Алгоритм:

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

Пример:

def get_bit(num: int, pos: int) -> bool:
    return num >> pos & 1

# Счет идет с 0, поэтому 8 это проверка 9-го бита
print(get_bit(0b11110000, 8))  # 0

print(get_bit(0b11110000, 7))  # 1
print(get_bit(0b11110000, 6))  # 1

# Перебор всех битов числа
print([get_bit(0b11110000, i) for i in range(8)])
# [0, 0, 0, 0, 1, 1, 1, 1]


Применение условия к Series Pandas
Есть код для отдельного столбца датафрейма:
<code>
for i in range(len(plan)):
    if plan['ProducerGroup'][i]=='A':
        print('yes')
        plan['OTHER PRODUCTION COSTS'][i] = logistics_book['OTHER PRODUCTION COSTS'][0]
</code>
Однако он работает довольно долго на больших объемах данных.
Можно ли его как-то ускорить?

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

plan.loc[plan['ProducerGroup']=='A', 'OTHER PRODUCTION COSTS'] = \
    logistics_book['OTHER PRODUCTION COSTS'][0]

Цикл в данном случае не нужен.

Чтобы заполнить одинаковым значением по нескольким условиям:

plan.loc[plan['ProducerGroup'].isin(['A','B']), 'OTHER PRODUCTION COSTS'] = \
    logistics_book['OTHER PRODUCTION COSTS'][0]


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

def main():
mysqlConn = getMysqlConn()
try:
    with mysqlConn.cursor() as cursor:
        sql = "SELECT phone FROM workersSchedule WHERE month=%s and day=%s"
        cursor.execute(sql, (11,18))
        result = cursor.fetchone()
        phone = result['phone']
        file = open('/etc/asterisk/scripts/workerPhone.txt', 'w')
        if phone == '' or phone is None:
            phone = 'тут был номер'
        file.write(phone)
        file.close()
finally:
    mysqlConn.close()

Но в этом случае дергались данные из строки по совпадению cursor.execute(sql, (11,18)). То есть, month=11 и day=18.
Требуется сделать так, чтоб из столбцов month и day сравнивал с текущим днем.
Попробовал подобный вариант, но не работает. Помогите, пожалуйста, советом.

def main():
mysqlConn = getMysqlConn()
try:
    with mysqlConn.cursor() as cursor:
        sql = "SELECT `phone` FROM `workersSchedule` WHERE `month`=%s and `day`=%s"
        cursor.execute(sql, int(datetime.datetime.now().strftime('%m')), int(datetime.datetime.now().strftime('%d')))
        result = cursor.fetchone()
        phone = result['phone']
        file = open('/etc/asterisk/scripts/workerPhone.txt', 'w')
        if phone == '' or phone is None:
            phone = 'тут был номер'
        file.write(phone)
        file.close()
finally:
    mysqlConn.close()

В оригинале в excute передаются два параметра - sql запрос и кортеж (tuple) с параметрами запроса:

cursor.execute(sql, (11,18))

В вашем коде вы передаете три параметра - sql запрос, месяц, день:

cursor.execute(sql, int(datetime.datetime.now().strftime('%m')), int(datetime.datetime.now().strftime('%d')))

Параметры запроса (месяц и день) нужно передавать в виде tuple (обернуть в скобки, по сути):

cursor.execute(sql, (int(datetime.datetime.now().strftime('%m')), int(datetime.datetime.now().strftime('%d'))))

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

(datetime.datetime.now().month, datetime.datetime.now().day)

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

sql = "SELECT phone FROM workersSchedule WHERE month=%s and day=%s"
now = datetime.datetime.now()
cursor.execute(sql, (now.month, now.day))


Как в моей программе исправить почти бесконечный цикл?
Если я ввожу число 1 или 100, то программа прекрасно работает, например, я ввел число 1, компьютер предположил, что я ввел 10, и предлагает мне выбрать между больше и меньше. Я пишу "меньше", и так, пока не угадает, т.е. диапазон ,несомненно, сокращается с "1-100" до "1-10", но, если мое число - 50, комп предлагает 51, я пишу "меньше" - комп предлагает, допустим, 32, я пишу больше, комп предлагает уже 82, т.е. этот цикл превращается в практически бесконечный, если взять диапазон побольше. Когда мое число 50, комп предлагает 51, как мне сделать так, чтобы, комп именной в этой "сессии" "игры" не предлагал уже более 51?
<code>
import random
print ("Добро пожаловать в игру 'Загадай число'!")
print ("Вы должны выбрать любое число в диапазоне от 1 до 100,")
print ("компьютер попытается отгадать заданное Вами число, используя минимальное количество попыток.")

the_number = int(input("Введите число от 1 до 100: "))
tries = 1
PC_number = random.randint(1, 100)
print (PC_number)
while PC_number != the_number:
    if the_number != PC_number:
        print ("Загаданное число больше или меньше предложенного?")
        value = input ()
    if value == "больше":
        PC_number = random.randint(PC_number, 100)
    elif value == "меньше":
        PC_number = random.randint(1, PC_number)
    print (PC_number)
    tries += 1
print ("Ваше число - ", PC_number ,"Компьютер угадал ваше число с", tries ,"попытки")
input("Нажмите Enter, чтобы выйти.")
</code>

Сохранять попытки в переменные и вызывать random.randint() с этими значениями, а не с 1 и 100.
<code>
if value == "больше":
    min_guess = PC_number
elif value == "меньше":
    max_guess = PC_number
PC_number = random.randint(min_guess+1, max_guess-1)
print (PC_number)
</code>


Как активировать функцию, только при нажатии кнопки интерфейса? [дубликат]

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

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

                                (1 ответ)

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

Во время практики, я попробовал создать калькулятор с интерфейсом на стандартной библиотеке.
Проблема: есть кнопка
one_but и к ней через
one_but = Button (command = num(1)) прикрепил функцию

def num(s):
    global n
    if n == 0:
        n += s
        label2.config(text = n)

Всё остальное в принципе не важно. При компиляции, у меня сразу же s принимает значение 1 и поскольку у меня стандартно у n стоит 0 то к нему прибавляется один, абсолютно тоже самое и с другими кнопками. Как сделать так чтобы s, принимало значение 1 или другое, только при нажатии?

...
def num(s):
    global n
    if n == 0:
        n += s
        label2.config(text = n)
one_but = Button (command = lambda:num(1))
...


Как убрать двоеточие из отчёта?
Помогите пожалуйста убрать двоеточие из отчёта!
Вот мой код:

a = [x[x.find(':'):]for x in input().split()]

Ответ должен выглядеть вот так:

['ztuebs', 'zdhkpq', 'jkyfmo', 'ducsvpq', 'ntsaw']

А у меня выводит вот так:

[':ztuebs', ':zdhkpq', ':jkyfmo', ':ducsvpq', ':ntsaw']

<code>
a = [x[x.find(':')+1:]for x in input().split()]
</code>
Раз срез забирает в начале один лишний символ, левую границу нужно сделать больше на 1


при создании контакта старый стирается, почему и оцените как я пишу код
<code>
# -*- coding in UTF-8 -*-
import pickle

class WriteListNomber:
    # Записываем в Список Контактов
    def __init__(self, name, namber):
        self.name = name
        self.namber = namber
        ListNameNam[ self.name ] = self.namber
        FileSeiv = open("SeiveInfo.data", "wb")
        pickle.dump(ListNameNam, FileSeiv)
        FileSeiv.close()

class printListNam:
    #Выводит на экран список контактов
    def __init__(self):
        FileSeiv = open("SeiveInfo.data", "rb")
        LoadingInfo = pickle.load(FileSeiv)
        print(LoadingInfo)
        FileSeiv.close()

# Список контактов
ListNameNam = {
               "ФИО": "Номер"
}

# Приветствие и выдача инструкций пользователю
print("Вас приветствует база мобильных номероа")
print("Введи 'Чтение контактов' для выведения на экран списка контактов")
print("Введи 'Сделать запись' для записи нового контакта")
print("Для завершения работы введи 0 ")

# Ввод команды пользователем
comandUser = input("---> ")

# Обработкка полученных команд от пользователя
while True:
    print("Выполнение команды")
    if comandUser == 'Чтение контактов':
        printListNam()
        comandUser = input("Введи новую команду \n ---> ")
    elif comandUser == 'Сделать запись':
        name = input("Введи имя \n --->")
        namber = input("Введи номер \n --->")
        WriteListNomber(name, namber)
        comandUser = input("Введи новую команду \n ---> ")
    elif comandUser == '0':
        print("Программа завершена")
        break
</code>

Вы не создаете экземпляр класса. У вас два отдельных класса, которые работают как функции. Собственно классы вами используются без понимания их смысла.
Нужно вот например так

class Abonent:
    def __init__(self, name, number):
        self.name = name
        self.number = number

class Notebook:
    def __init__(self):
        self.abonents = []
    def addAbonent(self, abonent):
        self.abonents.append(abonent)

    def saveToFile(self, filename):
        abonentsDict = {}
        for ab in self.abonents:
            abonentsDict[ab.name] = ab.number
        with open(fileame, 'wb') as f:
            pickle.dump(data, abonentsDict)

Использование

myAbonents = Notebook()
ivan = Abonent('Ivan','12345')
mary = Abonent('MAry','54321')
myAbonents.addAbonent(ivan)
myAbonents.addAbonent(mary)
myAbonents.saveToFile('notebook.data')

И файл вы открываете для записи, соответственно старое все стирается и заменяется новым.
Вот так очень очень плохо

while True:

вот пример

choose = -1
while (choose != 3):
    print("[1] - MenuItem1")
    print("[2] - MenuItem1")
    print("[3] - Exit")
    choose = int(input("Выбор= "))
    if choose == 1:
        ...
    if choose == 2:
        ...


Вывод позиции в списке, а не значения
Есть код:

lst = [int(i) for i in input().split()]

x = int(input())

position = [number for number in lst if number == x]

if not position:
    print('Отсуствует')
else:
    print(*position)

При выводе нужно получить все позиции, на которых встречается число
x в переданном списке
lst, а не
х. Не могу понять как это сделать.

Для прохода по коллекции с нумерацией элементов используется функция
enumerate:

lst = [2, 3, 4, 1, 1, 3]
x = 3
position = [i for i, number in enumerate(lst) if number == x]
print(position)  # [1, 5]

Что делает
enumerate:

print(list(enumerate([2, 3, 4, 1, 1, 3])))

выводит

[(0, 2), (1, 3), (2, 4), (3, 1), (4, 1), (5, 3)]

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


Как удалить объект класса из списка обьектов класса python
Для изучения классов пишу игру жизнь на питон. Столкнулся с непонятной мне ошибкой при описании смерти(т.е удаления объекта класса из списка классов). В некоторых случаях код отрабатывает правильно и все объекты класса удаляются верно при достижении счетчиком значения. Но иногда выполнение скрипта прерывается на строке l[i].show с ошибкой IndexError: list index out of range. В чем моя ошибка и как это исправить? Код привожу ниже.
<code>
import random
import time

class cat(object):
    def __init__(self):
        name_male=['Tom','Alex','Bob','Liam','Noah','Mason','Ethan','Logan','Lucas','Jackson','Aiden','Oliver','Elijah','Alexander','James']
        name_female=['Emma','Olivia','Ava','Sophia','Isabella','Mia','Charlotte','Amelia','Emily','Madison','Harper','Abigail','Avery']
        male=['male', 'female']
        male=random.choice(male)
        age=random.randrange(1,20)

        if male=='male':
            name=random.choice(name_male)
        else:
            name=random.choice(name_female)
        self.name=name
        self.male=male
        self.age=age

    def show(self):
        print('-------')
        print('Имя:',self.name)
        print('Пол:',self.male)
        print('возраст:',self.age)
        print('-------')
    def __del__(self):
        print(self.name,"удален из памяти")

l=[]
count_cats=random.randrange(1,10)
print('количество котов  в популяции:',count_cats)

for i in range (count_cats):
        l.append(cat())
while len(l)!=0:
    for i in range(len(l)):
            print(i)
            l[i].show()
            l[i].age+=1

            if l[i].age>20:
                    del l[i]
                    input()
    print('*****************************************')
print(len(l))

</code>

Цикл
for i in range(len(l)): не знает, что длина списка уменьшилась из-за удаления элемента.
Выход - удалять с конца списка или использовать цикл while, который будет постоянно опрашивать текущую длину.

for i in range(len(l)-1, -1, -1):


Непонятен синтаксис. Что реализует данный фрагмент кода: "(...nums: List[int]) -> int"
<code>
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
</code>

Тут:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:

Объявление класса
Solution с методом
removeDuplicates. То, что это метод, это из-за первого параметра
self
В методе описывается, что он принимает параметр
nums и его тип -- список целых чисел (
List[int]), и метод возвращает целое число (
-> int:)


Как исправить ошибку IndexError: list index out of range
Код:

#!/bin/python

import sys

try:
    sys.argv[1]
except:
    print "Usage: python killpid.py pids.txt"
    sys.exit()

kill_lis = open(sys.argv[1],"r").read()

b = kill_lis.split("\n")
a = []
c = []
for i in  range(len(b)-1):
    c.append(b[i].split(" "))
    h = c[i][0]+c[i][1]
    lists = h.split(":")
    spl = lists[1].replace("?","")
    a.append(spl.replace("pts/0",""))

for i in range(len(a)):
    result = a[i]+"\x0a"
print " ".join(a)

Ошибка возникает на 20 строке, интерпретатор ругается на

spl = lists[1].replace("?","")

что бы получить файл pids.txt

ps -A | grep ping >> pids.txt

ps -A | grep ping >> pids.txt дает строки вида
22538 pts/1    00:00:00 ping.
Смотрим что вы делаете:

b = kill_lis.split("\n")  # разбиение на отдельные строки

c.append(b[i].split(" "))  # разбиение по пробелам, добавление в список
# В результате в список добавляется подсписок вида ['22538', 'pts/1', '', '', '', '00:00:00', 'ping']
# Мне кажется, удобнее разбивать без указания разделителя, тогда будет разбиваться по группе пробелов: ['22538', 'pts/1', '00:00:00', 'ping']

h = c[i][0]+c[i][1]
# Склеиваете первый и второй элементы подсписка вместе, получается '22538pts/1'

lists = h.split(":")
# разбиваете полученную выше строку по двоеточию - т.к. двоеточий там нет,
# то получается список из одного элемента ['22538pts/1']

spl = lists[1].replace("?","")
# пытаетесь взять второй элемент из полученного выше списка -
# вылетает ошибка IndexError: list index out of range

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


Добавление элемента в начало списка Python
Есть функция append(), но она добавляет элемент в конец списка, какую функцию использовать чтобы она добавляла в начало?
Например
<code>
[10,100,55]
Добавить 5 в начало
[5,10,100,55]
</code>


Cоздать и инициализировать?
Здравствуйте нужно выполнить задания, прохожу курс. Создал класс с атрибутами.
Создать и инициализировать псевдослучайными значениями
одномерный массив из 100 экземпляров класса.
<code>
class Clothes:
    material = "qwerty"
    price = "300"
    color = "red"
    country = "USA"
    def makeNoise(self):
        print("Страна "+self.country)
    made = Clothes()
    made.makeNoise()
</code>

import random
class Clothes:
    def __init__(self,randNum):
        self.randNum=randNum
    def printNum(self):
        print(self.randNum)
lstClass=[]
for i in range(1,101):
    lstClass.append(Clothes(random.randint(1,100)))

for i in range(len(lstClass)):
    a=lstClass[i]
    a.printNum()

В этой строке
material_lst[rd.randint(0,len(material_lst)-1)] я получаю псевдослучайное целое число от 0 до длинны списка - 1, тк нумерация в Python с 0, и обращаюсь к элементу списка по индексу который равен этому случайному числу

import random as rd
class Clothes:
    def __init__(self,material,price,color,country,sale,size):
        self.material = material
        self.price = price
        self.color = color
        self.country = country
        self.sale = sale
        self.size = size
    def view_all(self):
        print(self.material)
lstClass=[]
material_lst=["Кожа","Шелк","Хлопок","Лен"]
color_lst=["Red","Green","Blue","Dark"]
country_lst=["Russia","Ukraine","USA","Portugal"]
for i in range(1,101):
    lstClass.append(Clothes(material_lst[rd.randint(0,len(material_lst)-1)],
    rd.randint(0,10000),
    color_lst[rd.randint(0,len(color_lst)-1)],
    country_lst[rd.randint(0,len(country_lst)-1)],
    rd.randint(0,100),
    rd.randint(0,60)))

for i in range(len(lstClass)):
    a=lstClass[i]
    a.view_all()


Найти число, которое является некоторой степенью двойки
Программа должна ввести с консоли натуральное число
n и найти число следующее за
n, которое является некоторой степенью двойки. Например, вводим,
7, оно не может являться степенью двойки, прибавляем
1 - получаем
8 (это
2 в
3 степени).
Вот мой код, который не даёт желаемого результата:

n = int(input())
z = n
x = 2
active = True
while active:
   for i in range(1, n):
      if z == x**i:
         active = False
   z += 1
z = n
print(n)

Предлагаю такой вариант решения:
<code>
print(2 ** int(input()).bit_length())
</code>


SQLAlchemy - как лучше `MetaData` или `__tablename__`?
Встречаются разные способы создания объектов для описания базы в SQLAlchemy.
Тут с использованием
MetaData:

from sqlalchemy import Table, Column, Integer, String, MetaData
meta = MetaData()

students = Table(
   'students', meta,
   Column('id', Integer, primary_key = True),
   Column('name', String),
   Column('lastname', String),
)

А, например,  тут - без
MetaData, а с использованием
__tablename__ :

from sqlalchemy import Table, Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Parent(Base):
        __tablename__ = 'parent'
        id = Column(Integer, primary_key=True)
        children = relationship("Child")

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))

В чем разница? Какой способ использовать лучше, современнее, безопаснее?
И почему существуют оба способа? Какой из них устарел?
Ведь случается, когда используют обе нотации, как например при описании связи Many to Many :

association_table = Table('association', Base.metadata,
    Column('left_id', Integer, ForeignKey('left.id')),
    Column('right_id', Integer, ForeignKey('right.id'))
)

class Parent(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key=True)
    children = relationship("Child",
                    secondary=association_table)

class Child(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key=True)

Почему в последнем (дополнительном) примере обе нотации одновременно? То есть нотация без Table и MetaData более ограниченная и "не все" кмеет?

Существует классический подход создания объектов. Это как раз тот, который напрямую использует
mapper(). А есть декларативный, более лаконичный стиль, с использованием функции
declarative_base(), который так же использует
mapper(), но уже не явно.
В документации написано:

В некоторых примерах в документации все еще используется классический подход, но следует отметить, что как классический, так и декларативный подходы полностью взаимозаменяемы. В конечном итоге обе системы создают одну и ту же конфигурацию, состоящую из пользовательского класса
Table, связанного вместе с помощью
mapper(). Когда мы говорим о «поведении
mapper()», это относится и к использованию декларативной системы - она все еще используется, просто за кулисами.

Там же не явно указано на то, что классический подход является устаревшим. Например:

Декларативное отображение - это типичный способ построения отображений в современной SQLAlchemy.

Удобство в декларативном подходе в том, что вся метаинформация и дополнительные атрибуты, такие как связи с другими классами, также объявляются встроенными в определение класса. Так же классический подход не поддерживает систему "string lookup" и к полям таблицы необходимо обращаться, как:
table_name.c.field_name.
Императивный подход удобнее использовать для описания таблиц связей, именно так и поступает
sqlacodegen.
Из документации построение связей:

Для построения связи Many to Many добавляется таблица связи между
  двумя классами. Таблица ассоциаций указывается
вторичным аргументом
  для
relationship(). Обычно в
Table используется объект
MetaData,
  связанный с декларативным базовым классом, так что директивы

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

association_table = Table('association', Base.metadata,
    Column('left_id', Integer, ForeignKey('left.id')),
    Column('right_id', Integer, ForeignKey('right.id'))
)

class Parent(Base):
    __tablename__ = 'left'

    id = Column(Integer, primary_key=True)
    children = relationship("Child", secondary=association_table)

class Child(Base):
    __tablename__ = 'right'

    id = Column(Integer, primary_key=True)

Насколько я понимаю это связано с тем, что параметру функции
relationship() мы должны передать структуру модели, а на объект питоновского класса. (Если кто понимает этот процесс лучше - поправьте)
А еще императивный стиль позволяет создавать и изменять модели "на лету", тем самым давая возможность гибкого использования БД.


Проверить, входят ли 2 строчки через not in python
Хочу сделать проверку сразу 2 строчек:
<code>
if 'excel','spreadsheet' not in content_type:
</code>
Как это сделать красиво на питоне?

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

exclusions = ['excel', 'spreadsheet']

if all(word not in content_type for word in exclusions):
    pass

Функция
all проверяет, что ей передана последовательность состоящая только из истинных элементов (
bool(x) == True).
В данном случае берется по одному слову из списка
exclusions, и для каждого проверяется что этого слова нет в
content_type. Дальше, если все проверки дали результат
True, то функция
all вернет
True. Если хотя бы одно
False, то
all вернет
False.


При нажатии на QPushButton ничего не происходит
Надо при нажатии на кнопку открыть word-файл.
Но когда нажимаешь, ничего не происходит. Ошибку в консоль не выводит
<code>
import sys
from PySide import QtCore, QtGui
from ui import Ui_Form

app = QtGui.QApplication(sys.argv)

Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()

def bp():
    open("E:/GUI/1.docx")

ui.pushButton.clicked.connect(bp)

sys.exit(app.exec_())
</code>

Используйте os.startfile, чтобы открыть файл ассоциированной с ним программой.
А функция
open используется для работы с содержимым файлов: считывания, записи, добавления и
open("E:/GUI/1.docx") сделает открытие файла. Кст, чтобы считать этот формат нужно сделать так:
print(open("E:/GUI/1.docx", 'rb').read())
Пример с os.startfile:

import os
import sys

from PySide import QtCore, QtGui
from ui import Ui_Form

#Create application

app = QtGui.QApplication(sys.argv)

# Create form and unit UI

Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()

#Hook logic

def bp():
    os.startfile("E:/GUI/1.docx")

ui.pushButton.clicked.connect ( bp )

#Run main loop

sys.exit(app.exec_())


Проблема с вводом массива
Не компилируется код. Не могу понять, почему возникает ошибка.
Проблема с 6 строкой:

spisok[i] = input()

IndexError: list assignment index out of range

spisok = list()
print('Определите количество студентов вашей группы.')
KolStud= int(input())
for i in range(KolStud):
    print('Введите ФИО['+str(i)+']: ')
    spisok[i] = input()

print(spisok)

как уже отметил  @S. Nick, ошибка в том, что вы пытаетесь передать значение ввода элементам массива, которых еще не существует, вместо этого - воспользуйтесь конструкцией :

.append()

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

spisok = [0] * KolStud


Как сгруппировать по дням dataframe?
Есть dataframe со столбцами:

НоменклатураКод( название),
КоличествоОборот(сколько продано единиц товара всего за указанный период)
СуммаОборот(всего продано по деньгам, то есть цена 1 единицы товара умножить на КоличествоОборот)
Период(дата, какой-то дань)

Как сделать dataframe, чтобы по дням можно было сгруппировать наименования товаров, то есть дата, НоменклатураКод(это название товара) Количество проданное за день этого товара(это сумма КоличествОборот за день), Общая цена(это сумма СуммаОборот за день)?
<code>
funcs = dict('КоличествоОборот' ="summ", 'СуммаОборот' ="summ")
art3 = art.resample('D').agg(funcs)
</code>
Не получается, надо уникально по каждой НоменклатураКод( название) : То есть Товар - дата - объем - общая цена. То есть по каждому товару посчитать сколько было за день объема с общей ценой.

Вот так можно
<code>
data = pd.read_csv('art.csv', sep=',', parse_dates=['Период'], dayfirst=True, index_col='Период', decimal=',')
groupDate = data.groupby(['Период','НоменклатураКод']).sum()
</code>
У вас проблема в том, что дробная часть в числе отделена запятой, а должна быть точкой.


Поэлементное соединение матриц
У меня есть 2 матрицы
numpy.array одинакового размера:

[[a, b, c],
 [d, e, f]]

[[z, x, v],
 [r, t, y]]

Как соединить их поэлементно так, чтобы получилось:

[[[a,z],[b,x],[c,v]],
 [[d,r],[e,t],[f,y]]]


Проблема с библиотекой tkinter
Несколько лет назад работал с библиотекой tkinter. Сейчас при попытке её вызова:
<code>
from tkinter import*
root=Tk()

root.mainloop()
</code>
-она не работает. Может я что-то делаю не так? Не подскажите, как правильно?

Возможно проблема из-за того что у вас python 2, а не 3.Тогда так:
<code>
from Tkinter import *

root = Tk()
root.mainloop()
</code>


в директории (а)есть другая директория(б).Как записать все файлы директории (а) включая файлы директории (б) в список
Есть программа:

import os

from pathlib import Path

source = Path('D:\\current_dir')

a = os.listdir(source)
print()
# возврашает

#a = ['one_more_dir', '20 String Methods.docx', '20191201153648.zip', '5efb682f752f46906fc79b2f9094ddd2.jpg', 'fortnite.jpg', 'u9o1t3aemesy.png']

Где,
a - это список "детей" директории
current_dir, но первый элемент списка
а - это директория
one_more_dir.
Как мне получить список файлов директории
one_more_dir и записать их в список
а?
В самом списке не должно быть директории
one_more_dir. При этом, я не знаю, есть ли в директории
one_more_dir другие директории.

Функция
os.walk() рекурсивно пройдёт все директориям и в список
all_files добавит названия файлов

   import os
    all_files=[]
    for d, dirs, files in os.walk('c:/1'):
        for f in files:
            all_files.append(f)
    print(all_files)


Преобразование строк с двумя разделителями в список списков
Как Преобразовать строку вида
"1,2 2,3 3,4" в такой список (типа
int):
[[1,2], [2,3], [3,4]]


Случайный вектор из закрытого интервала
С помощью
np.random.uniform(a, b, n) можно сгенерировать вектор размера
n с элементами из интервала
[a;b).
Можно ли как-то сделать то же самое, но c элементами из закрытого интервала
[a;b]?

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

Но если очень хочется, то можно так:

np.random.uniform(a, b + 1e-7, n)

Тест:

In [109]: np.random.uniform(-2, 5 + 1e-7, size=10**8).max()
Out[109]: 5.000000081751573


Сгенерировать N псевдослучайных чисел из диапазона [a;b)
Есть ли в питоне/numpy аналог функции
std::generate из
C++? У меня есть функция без параметров, которая возвращает единственное значение. Надо создать numpy массив/список из n элементов, n раз вызвав эту функцию.
Определение функции:

def generator():
    return (b - a) * np.random.random_sample(N) + a


In [77]: import math

In [78]: min(d, key=lambda a: a-27 if a>=27 else math.inf)
Out[78]: 31


Вычислить столбец datetime в зависимости от значения в другом столбце
Необходимо прибавить к столбцу с типом datetime определенное количество часов в зависимости от данных в столбце Локация. Т.е. если в столбце локация А то прибавляем 1 час, если Б то 2.
Есть словарь с локацией и сколько необходимо прибавить.
Словарь:

dict_tz = {'UL':timedelta(minutes=120),'BL':timedelta(minutes=300),'SL':timedelta(minutes=240),
           'WSL':timedelta(minutes=120),'EL':timedelta(minutes=420),'WUL':timedelta(minutes=120)}

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

df['GMT'] = df['GMT'].apply(lambda x: x + dict_tz.get(df['Location'],timedelta(minutes=0)))

Текст ошибки:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-36-c6daa8fd5423> in <module>()
      1 df['GMT'] = df['StartDate']
----> 2 df['GMT'] = df['GMT'].apply(lambda x: x + dict_tz.get(df['Location'],timedelta(minutes=0)))
      3 #df['GMT'] = dict_tz.get(df['Location'],datetime.time(0,0,0))
      4 df

2 frames
pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

/usr/local/lib/python3.6/dist-packages/pandas/core/generic.py in __hash__(self)
   1884         raise TypeError(
   1885             "{0!r} objects are mutable, thus they cannot be"
-> 1886             " hashed".format(self.__class__.__name__)
   1887         )
   1888

TypeError: 'Series' objects are mutable, thus they cannot be hashed


Не могу определить юзера при создании новой модели DRF
Есть модель:

class Profile(models.Model):
    user = models.OneToOneField(User, verbose_name="Пользователь", related_name="profile", on_delete=models.CASCADE)
    ...

Также сериализатор:

class ProfileSerializer(serializers.ModelSerializer):
    # Профиль юзера

    user = UserSerializer()

    class Meta:
        model = Profile
        fields = [
            'user', 'name', 'surname',
            'patronymic', 'kind', 'regions',
            'phone', 'company', 'categories'
        ]

    def create(self, validated_data):
        profile = Profile.objects.create(user=self.context['request'].user, **validated_data)
        return profile

views:

class ProfileCreate(generics.GenericAPIView):
    # Создание профиля юзера

    serializer_class = ProfileSerializer
    permission_classes = [IsAuthenticatedOrReadOnly]

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        profile = serializer.save()
        return Response(ProfileSerializer(profile))

Как я понимаю, вся проблема в том когда проверяются данные в структуре

serializer.is_valid(raise_exception=True)

Выдаётся ошибка "User - это обязательное поле"
Видимо нужно не при создании профиля определять юзера, а при валидации данных передавать его.
Но вопрос, как это сделать?

Проблема решена.
Следовало просто убрать из fields поле user, для того чтобы оно стало необязательным.
Благодаря методу create в сериализаторе юзер сохраняется.


Проблема с путями запуска внешнего приложения
Ниже приведен скрипт на питоне для создания резервной копии базы данных 1с на сервере Win.

import os
from datetime import datetime

print("Запуск скрипта резервного копирования 1С")

# путь к 1С
# set EXEC_PATH="C:\Program Files (x86)\1cv8\common\1cestart.exe"
EXEC_PATH = '"C:\Program Files (x86)\1cv8\common\1cestart.exe"'
# Путь до папки с резервными копиями
BACKUP_PATH = r'D:\backup'
# Префикс названия файла резервной копии
BACKUP_PREFIX = 'monolit'
# логин пользователя 1С
LOGIN = 'Администратор'
# пароль пользователя 1С
PASSWORD = ''
# ИБ:
# /F - файловый вариант, /S - клиент-серверный вариант
# для файлового варианта - указывается только путь, например /F"C:\1c_base\"
# для клиент-серверного - указывается Кластер\Имя_ИБ, например /S"1c\1c_base"
# BASE=r'/S"1c\new_tc"'
BASE = r'/F"C:\base\Монолит бух\"'

# Отключаем пользователей
os.system(
    f'{EXEC_PATH} ENTERPRISE {BASE} /N{LOGIN} /P{PASSWORD}'
    '/WA- /AU- /DisableStartupMessages /CЗавершитьРаботуПользователей')

# Разрешаем доступ к базе
os.system(
    f'{EXEC_PATH} ENTERPRISE {BASE} /N{LOGIN} /P{PASSWORD}'
    '/WA- /AU- /DisableStartupMessages /CРазрешитьРаботуПользователей /UCКодРазрешения')

# Делаем резервную копию
os.system(
    f'{EXEC_PATH} CONFIG {BASE} /N{LOGIN} /P{PASSWORD} /Out"%LOG_FILE%"'
    f'/DumpIB"{BACKUP_PATH}"\\{BACKUP_PREFIX}_{datetime.now().strftime("%Y%m%d")}.dt')

При попытке запуска выдает:

Запуск скрипта резервного копирования 1С
"C:\Program" �� ���� ����७��� ��� ���譥�
��������, �ᯮ��塞�� �ணࠬ��� ��� ������ 䠩���.
"C:\Program" �� ���� ����७��� ��� ���譥�
��������, �ᯮ��塞�� �ணࠬ��� ��� ������ 䠩���.
"C:\Program" �� ���� ����७��� ��� ���譥�
��������, �ᯮ��塞�� �ணࠬ��� ��� ������ 䠩���.

Process finished with exit code 0

Методом научного тыка нашел что проблема возникает когда в команду запуска добавляется содержимое переменной BASE. Хотя думаю проблему вызывает всю содержимое команды запуска находящееся правее слова ENTERPRISE.
То есть такая конструкция работает:

os.system(f'{EXEC_PATH'} ENTERPRISE')

А вот такая уже нет:

os.system(f'{EXEC_PATH'} ENTERPRISE {BASE}')

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

Сначала надо убрать проблемы кодировки, чтобы видеть что отвечает консоль.
Программа передает значения переменных в UTF-8 (она же 65001), а консоль работает по-умолчанию в 866, ответы приходят в 866. Например PyCharm выдаст такой ответ как в примере ("иероглифами").
Например, это можно убрать с помощью:

chcp 65001>nul&&

Потом надо убрать двойные кавычки в пути до exe-шника:

EXEC_PATH = r'C:\Program Files (x86)\1cv8\common\1cestart.exe'

Возможно для нормализации пути будет полезным использовать os.path.abspath (но полезность это функции в данном примере сомнительна):

EXEC_PATH = os.path.abspath(r'C:\Program Files (x86)\1cv8\common\1cestart.exe')

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

os.system(
    f'chcp 65001>nul&&"{EXEC_PATH}" ENTERPRISE {BASE} /N{LOGIN} /P{PASSWORD}'
    '/WA- /AU- /DisableStartupMessages /CЗавершитьРаботуПользователей')

Протестировал на своей базе запуск уже отредактированного скрипта прямо из PyCharm, нашел пару ошибок в моем исходном комментарии, из-за которых скрипт ошибок не выдавал, но и с 1С ничего не делал. После замены "||" на "&&" все отрабатывает как надо.


Как принять в список форматированный вывод списка
Как разделить вот такую строку
<code>
s = '[7, 9, 9, 8, 7],[7, 8, 9, 8, 9],[8, 8, 6, 2, 4, 3]'
</code>
в двумерный список?

Для таких целей можно воспользоваться регулярными выражениями (модуль
re).
Поиск по шаблону
\[([^\[\]]*)\]* вернёт следующий список:

['7, 9, 9, 8, 7', '7, 8, 9, 8, 9', '8, 8, 6, 2, 4, 3']

Далее можно разделить полученные строки по запятым с помощью
split(',').
А полученные числа привести к типу
int.
Пример:

import re

def main():
    s = '[7, 9, 9, 8, 7],[7, 8, 9, 8, 9],[8, 8, 6, 2, 4, 3]'

    matrix = [list(map(int, li.split(','))) for li in re.findall(r'\[([^\[\]]*)\]*', s)]
    print(matrix)

if __name__ == '__main__':
    main()

stdout:

[[7, 9, 9, 8, 7], [7, 8, 9, 8, 9], [8, 8, 6, 2, 4, 3]]

Есть ещё один довольно короткий, но опасный способ — функция
eval.
Использовать стоит только тогда, когда Вы уверены в безопасности и корректности передаваемых данных!
В большинстве случаев данный подход делает Вашу программу уязвимой к исполнению произвольного кода!
Пример:

...
matrix = list(eval(s))
...


Не могу передать юзера в модель. DRF
У меня для создания профиля требуется User

class Profile(models.Model):
    user = models.OneToOneField(User, verbose_name="Пользователь", related_name="profile", on_delete=models.CASCADE)
    ...

Есть сериализатор:

class ProfileSerializer(serializers.ModelSerializer):
    # Сериализатор профиля юзера

    user = UserSerializer()

    class Meta:
        model = Profile
        fields = [
            'user', 'name', 'surname',
            'patronymic', 'kind', 'regions',
            'phone', 'company', 'categories'
        ]

    def create(self, validated_data):
        profile = Profile.objects.create(user=self.context['request'].user, **validated_data)
        return profile

Но почему-то я не могу передать поле "user" в сериализатор. Views:

class ProfileCreate(generics.GenericAPIView):
    # Наполнение профиля юзера

    serializer_class = ProfileSerializer
    permission_classes = [IsAuthenticatedOrReadOnly]

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.user = request.user
        serializer.is_valid(raise_exception=True)
        profile = serializer.save()
        return Response(ProfileSerializer(profile))

В чём же моя ошибка или непонимание?

Попробуйте передавать пользователя при сохранении:
<code>
serializer.save(user=request.user)
</code>


Насколько рандомен random.randint в python?
<code>
import random
x=0
for i in range(10000):
    my_series = [random.randint(0, 11) for i in range(100)]
    x += 1 if len(list(filter(lambda x: x % 2 == 1, my_series))) < len(list(filter(lambda x: x % 2 == 0, my_series))) else -1
    print(x)
</code>
Почему перевес всё время в минус хотя генерация списков рандомная и возможное количество чётных и нечётных значений одинаковое(от 0 до 11).

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


Количество чисел в тексте и максимальное из них

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

Знаю как найти сумму:
<code>
s='aa3aBbb6ccc'
total=0
for i in range(len(s)):
    if s[i].isalpha():
        continue
    total=total+int(s[i])
print ("сумма чисел:", total)
</code>

Для того чтобы отличить цифру, можно воспользоваться методом
isdigit().
Пример:

def main():
    s = 'aa3aBbb6ccc'

    digits = [int(char) for char in s if char.isdigit()]  # listcomp
    print(*digits)      # Цифры
    print(len(digits))  # Количество цифр
    print(sum(digits))  # Сумма цифр
    print(max(digits))  # Максимальная цифра

if __name__ == '__main__':
    main()

stdout:

3 6
2
9
6


Помогите, почему закрывается cmd? [дубликат]

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

Не запускается Python 3 на Windows 10

                                (1 ответ)

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

<code>
print ("\t\t\t\t'Любимое блюдо'")
#Эта программа считывает по очереди 2 любимых блюда
#пользователя и сцепляет эти 2 строки в одну
print ("\n\t\t\t \\ \\ \\ \\ \\ \\ \\ \\ \\ \\")
meal_1=input("\tВведите первое любимое блюдо:  ")

meal_2=input("\n\tВведите второе любимое блюдо:  ")

result_meal=meal_1+meal_2
print ("\n\n\tВаше любимое блюдо - " + result_meal)
</code>
Почему после того, как я ввожу meal_2 и жму Enter, программа закрывается?

print ("\t\t\t\t'Любимое блюдо'")

#Эта программа считывает по очереди 2 любимых блюда
#пользователя и сцепляет эти 2 строки в одну

print ("\n\t\t\t")

meal_1 = input("\tВведите первое любимое блюдо:  ")
meal_2 = input("\n\tВведите второе любимое блюдо:  ")

result_meal = meal_1 + meal_2

print ("\n\n\tВаше любимое блюдо - " + result_meal)

Программа работает. Возможно, вы просто запускаете в
.exe, и по окончанию программа закрывается. Если так, поставьте в конец пустой
input().


BeautifulSoup4 Получить контент в зависимости от тега h3 и удалить этот тег
Получаю такой HTML-код при парсинге:

<div class="row tab-pane" id="tab-description">

  <div class="col-md-6">
        <h3>Описание Makita 4329 Лобзик электрический</h3>
        <ul>
            <li><span>Новый эргономичный дизайн </span></li>
            <li><span>Удобная D-образная рукоятка с резиновыми вставками </span></li>
            <li>Маятниковый ход </li>
        </ul>
    </div>

    <div class="col-md-6">
        <h3>Характеристики Makita 4329 Лобзик электрический</h3>
        <table class="reviewtab table table-striped">
            <tbody>
                <tr>
                    <td>Производитель</td>
                    <td class="odd" itemprop="brand"> Makita </td>
                </tr>
                <tr>
                    <td>Страна происхождения</td>
                    <td class="odd"> Япония </td>
                </tr>
                <tr>
                    <td>Штрих код:</td>
                    <td class="odd">088381083102</td>
                </tr>
            </tbody>
        </table>
    </div>

</div>

В нем есть нужные мне 2 div'a, с классами "col-md-6".
Мне нужно получить из них все кроме h3, вот пример:
получаю Описание

<ul>
    <li><span>Новый эргономичный дизайн </span></li>
    <li><span>Удобная D-образная рукоятка с резиновыми вставками </span></li>
    <li>Маятниковый ход </li>
</ul>

получаю Характеристики

<table class="reviewtab table table-striped">
    <tbody>
        <tr>
            <td>Производитель</td>
            <td class="odd" itemprop="brand"> Makita </td>
        </tr>
        <tr>
            <td>Страна происхождения</td>
            <td class="odd"> Япония </td>
        </tr>
        <tr>
            <td>Штрих код:</td>
            <td class="odd">088381083102</td>
        </tr>
    </tbody>
</table>

Вот с какими проблемами я столкнулся:
1) Может быть такое, что один из блоков отсутствует и нужно как-то "понять", где Описание, а где Характеристики. За что в таком случае зацепится и какие методы библиотеки при этом задействовать?
2) Как мне удалить ненужные мне h3?

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

from bs4 import BeautifulSoup

def main():
    with open('index.html', encoding='utf-8') as f:
        html = f.read()
    soup = BeautifulSoup(html, 'lxml')

    divs = soup.find_all('div', {'class': 'col-md-6'})
    for div in divs:
        h3 = div.find('h3')
        title = h3.get_text().split()[0]
        h3.extract()

        print(f'{title}:')
        print(div.prettify())
        print('=' * 73, end='\n\n')

if __name__ == '__main__':
    main()

stdout:

Описание:
<div class="col-md-6">
 <ul>
  <li>
   <span>
    Новый эргономичный дизайн
   </span>
  </li>
  <li>
   <span>
    Удобная D-образная рукоятка с резиновыми вставками
   </span>
  </li>
  <li>
   Маятниковый ход
  </li>
 </ul>
</div>

=========================================================================

Характеристики:
<div class="col-md-6">
 <table class="reviewtab table table-striped">
  <tbody>
   <tr>
    <td>
     Производитель
    </td>
    <td class="odd" itemprop="brand">
     Makita
    </td>
   </tr>
   <tr>
    <td>
     Страна происхождения
    </td>
    <td class="odd">
     Япония
    </td>
   </tr>
   <tr>
    <td>
     Штрих код:
    </td>
    <td class="odd">
     088381083102
    </td>
   </tr>
  </tbody>
 </table>
</div>

=========================================================================


Как узнать процент покрытия кода тестами?
Использую для тестов unittest. Запускаю через pytest. Каким способом можно узнать процент покрытия кода тестами? Вроде как-то coverage.py можно использовать?

Нужно установить плагин pytest-cov для pytest (
pip install pytest-cov), при запуске pytest добавить ключ
--cov=proj (где proj - имя директории, для файлов которой будет считаться покрытие).
После выполнения тестов создастся файл
.coverage с информацией по покрытию. Также можно генерировать отчеты по покрытию, например, в виде html и других форматах (см. pytest-cov - Reporting)
Документация по pytest-cov


Найдите флаг Python
Найдите флаг
Найти все вхождения строки формата "flag{[0-9a-f]{32}}" в файле "input.txt"
Примеры
Входные данные
flag{5c4d49102af8d43d9802cabd6b8a3619}
flag
Результат работы
flag{5c4d49102af8d43d9802cabd6b8a3619}
написал код, но не могу понять в чем проблема.
<code>
import re

with open('input.txt') as fh:
    matches = re.findall(r'flag\{[0-9a-f]{32}\}', fh.read())

for m in matches:
    print(m.group(0))
</code>
Предлагали прописать путь до тхт, но файл отправляется на сайт

Вы объявили
matches внутри
with, чтобы ваш код сработал.
ДОПОЛНЕНИЕ
Так как
re.findall возвращает список строк, то
m внутри цикла
for является строкой ,а в
Python 3.x строка не имеет метода
group, по этому ваш код не сработает.
Сработает так:

import re

with open('input.txt') as fh:
    matches = re.findall(r'flag\{[0-9a-f]{32}\}', fh.read())

    for m in matches:
        print(m)


Не могу создать профиль юзера DRF
Есть модель Profile

class Profile(models.Model):
    user = models.OneToOneField(User, verbose_name="Пользователь", related_name="profile", on_delete=models.CASCADE)
    name = models.CharField("Имя", max_length=30)
    surname = models.CharField("Фамилия", max_length=30)
    patronymic = models.CharField("Отчество", max_length=30)
    kind = models.CharField("Клиент или специалист", max_length=20, choices=KIND_CHOICES)
    regions = models.CharField("Регионы", max_length=100)
    phone = models.CharField("Телефон", max_length=15)

Профиль создаётся изначально как только создан юзер (т.е user уже связан с этим профилем, но профиль пустой)  (сигнал)
Мне нужно принять POST запрос и наполнить пустой профиль
Сделал сериализатор вот таким:

class ProfileSerializer(serializers.ModelSerializer):
    user = serializers.StringRelatedField(read_only=True)

    class Meta:
        model = Profile
        fields = [
            'user', 'name', 'surname',
            'patronymic', 'kind', 'regions',
            'phone', 'company', 'categories'
        ]

views:

class ProfileCreate(generics.GenericAPIView):
    # Наполнение профиля юзера

    serializer_class = ProfileSerializer
    permission_classes = [IsAuthenticatedOrReadOnly]

    def post(self, request, *args, **kwargs):
        user = get_object_or_404(User, pk=request.user.pk)
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            user.profile = serializer.save()
            return Response(ProfileSerializer(user.profile))
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Вылетает ошибка:
IntegrityError at /api/profile/create/
NOT NULL constraint failed: app_profile.user_id
Помогите решить данную проблему.

Ваша модель
Profile не получает данных для поля
user.
Один из вариантов - переопределить метод
create, в ваш
ProfileSerializer:

class ProfileSerializer(serializers.ModelSerializer):
    ...
    def create(self, validated_data):
        profile = Profile.objects.create(user=self.context['request'].user,
                                 **validated_data)
        return profile


Подготовка входных данных для нейросети
Хочу реализовать предсказание курса акций на фондовом рынке. Я понимаю, что в нейросеть напрямую не может поступать, например, стоимость акции, ибо нужна какая-то предварительная обработка. Как я должен подготовить данные на примере массива стоимостей акций (реализую сеть в keras+tensorflow)?

Если вы собираетесь использовать данные OHLC или технических индикаторов, вам желательно нормализовать данные прежде чем прогонять через ИНС. Из моих наблюдений для этого больше подходит Min-max scaling.
Ps: Другие способы нормализации


Django 2.2 В БД не сохраняются комментарии
Django 2.2 Python 3.6
После заполнения формы, комментарий прилетает в django, но не сохраняется в БД... Модели постов и комментариев в одном приложении. Ни каких трейсбэков не получаю. Не понимаю что и где я проглядел...
Views.py

def post_detail(request, slug):
    post = Post.objects.get(slug=slug)

    if request.method == 'POST':
        new_comment_form = NewCommentForm(request.POST, instance=post)

        if 'add_comment' in request.POST and new_comment_form.is_valid():
            comment = new_comment_form.save(commit=False)
            comment.post = post
            comment.author = request.user
            comment.content = request.POST.get('content')
            comment.active = True
            comment.save()
    else:
        new_comment_form = NewCommentForm()

    context = {
        'post': post,
        'new_comment_form': new_comment_form,
    }
    template = 'content/post_detail.html'
    return render(request, template, context)

Forms.py

class NewCommentForm(forms.ModelForm):

    class Meta:
        model = Comment
        fields = (
            'content',
        )

    def save(self, commit=True):
        comment = super(NewCommentForm, self).save(commit=False)
        comment.content = self.cleaned_data['content']

        if commit:
            comment.save()
        return comment

Models.py

class Comment(models.Model):
    post = models.ForeignKey(Post, related_name='post_comments', on_delete=models.CASCADE, verbose_name='Комментарии')
    author = models.ForeignKey(VertexUser, related_name='comment_author', on_delete=models.CASCADE, verbose_name='Автор')
    content = models.TextField('Содержание', blank=True)
    like = models.PositiveIntegerField('Лайки', default=0, blank=True, null=True)
    dislike = models.PositiveIntegerField('Дизлайки', default=0, blank=True, null=True)
    publication_date = models.DateTimeField('Дата публикации', auto_now=True, null=True)
    active = models.BooleanField('Опубликовано', default=True)

    def __str__(self):
        return f'Автор {self.author} | Опубликовано {self.publication_date}'

    class Meta:
        verbose_name = 'Комментарий'
        verbose_name_plural = 'Комментарии'

Спасибо за внимание.

new_comment_form = NewCommentForm(request.POST, instance=post)

Привязка в post была лишняя.


Как отсортировать двумерный список?
Нужно написать функцию, которая сможет сортировать следующий список по возрастанию первого (
list[:,0]) и третьего (
list[:,2]) объекта. Как это можно сделать без использования numpy и других библиотек?
Пример:

list = [[1.4, [21, 1], 4],
        [1.0, [54, 100], 8],
        [1.4, [34, 1], 2],
        [1.0, [55, 5], 4],
        [1.4, [7, 3], 6],
        [1.0, [10, 44], 1]]

Чтобы получилось вот так:

list = [[1.0, [10, 44], 1]
        [1.0, [55, 5], 4],
        [1.0, [54, 100], 8],
        [1.4, [34, 1], 2],
        [1.4, [21, 1], 4],
        [1.4, [7, 3], 6]]


Работа с цифрами
Есть числа:

123456.78901
-123456.7801
их нужно разделить как снизу

"123,456.80"
"-123,456.78"
Вопрос
Как это можно реализовать?


Получение списка экземпляров класса
Существует некоторый класс, подскажите пожалуйста, как я могу достать объект класса по индексу? Например, чтобы пользователь ввел число(это и было бы индексом)

class Goom(object):
    a = []

    def __init__(self, name, seats, jump):
        """Инициализация"""
        self.name = name
        self.seats = seats
        self.jump = jump
        self.a.append(self)

Например вот объекты:

my_goom1 = Goom("Лил", "1", "Нет")
my_goom2 = Goom("Мак", "1", "Есть")
my_goom3 = Goom("Ной", "1", "Есть")

Может через метод getitem?

    @classmethod
    def __getitem__(cls):
        """Показывает выбранный объект"""
        num = int(input('Введите число: ')
        print(cls.a[num])

Как я могу потом вызвать эту функцию? Спасибо большое за любые советы

Через
@classmethod нет возможности переопределить метод
__getitem__ класса. При попытке обращения через квадратный скобки будет возникать ошибка
TypeError: 'type' object is not subscriptable.
Нерабочий пример:

class Goom(object):
    items = []

    def __init__(self, name, seats, jump):
        """Инициализация"""
        self.name = name
        self.seats = seats
        self.jump = jump
        Goom.items.append(self)

    def __str__(self):
        return "{} {} {}".format(self.name, self.seats, self.jump)

    @classmethod
    def __getitem__(cls, index):
        return cls.item[index]

my_goom1 = Goom("Лил", "1", "Нет")
my_goom2 = Goom("Мак", "1", "Есть")
my_goom3 = Goom("Ной", "1", "Есть")

print(Goom[0])
# Traceback (most recent call last):
#   File "./prog.py", line 24, in <module>
# TypeError: 'type' object is not subscriptable

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

class Goom(object):
    items = []

    def __init__(self, name, seats, jump):
        """Инициализация"""
        self.name = name
        self.seats = seats
        self.jump = jump
        Goom.items.append(self)

    def __str__(self):
        return "{} {} {}".format(self.name, self.seats, self.jump)

my_goom1 = Goom("Лил", "1", "Нет")
my_goom2 = Goom("Мак", "1", "Есть")
my_goom3 = Goom("Ной", "1", "Есть")

print(Goom.items[0])


Передача списка Python через сокет
Я передаю от сервера к клиенту Список

['c', 'e', 'd', 'a', 'b']

Передача сервером:

conn.send((str)(key).encode('utf-8'))

Принятие клиентом:

data2 = sock.recv(16384)
str2 = (data2.decode('utf-8'))

Дело в том что список приходит как
"['c', 'e', 'd', 'a', 'b']"
Как убрать эти
" "?

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

import json
...
key = ['c', 'e', 'd', 'a', 'b']
conn.send(json.dumps(key).encode('utf-8'))

и

import json
...
data2 = sock.recv(16384)
key = json.loads(data2, encoding='utf-8')


Не работает for
Написал программу. Но не могу понять, почему не работает цикл for.

import math
import time
print('Программа работает с геометрической прогрессией')
time.sleep(2)
print('Прежде чем мы начнем, напишите, Вы знаете второй член прогрессии b2 (Да/Нет): ')
answer=input()
if answer == 'Да':
    print('Введите первый член прогрессии (!= 0): ') # а можно было так: b1 = input('текст')
    b1 = input()
    print('Введите второй член прогрессии (!= 0): ')
    b2 = input()
    q = eval(b2) / eval(b1)
elif answer == 'Нет':
    print('Введите первый член прогрессии (!= 0): ')
    b1 = input()
    print('Введите знаменатель прогрессии (!= 0, 1): ') # 1 исключая для формулы суммы
    q = input()
    b2 = eval(b1) * eval(q)
else:
    print('Ошибка ввода. Работа программы прекращена.')
    time.sleep(3)
    exit(0)

print()
print('Отлично. Теперь у нас есть всё, для того чтобы поработать с прогрессией!')
print('Bn: b1 = '+str(b1)+'; b2 = '+str(b2)+'; q = '+str(q))
print()
time.sleep(1)
print('Давайте найдем какой-нибудь член этой прогрессии.')
print('Введите номер члена (n), который будем искать: ')
n=input()
bn = float(b1) * (float(q) ** (int(n) - 1))
print()
print('Bn: b'+str(n)+' = '+str(bn))
print()
time.sleep(1)
print('Окей. А теперь найдем сумму n первых членов этой прогрессии.')
sn = (float(b1) * (float(q) ** (int(n))-1)) / (float(q) - 1)
print('Sn = '+str(sn))
nn = int(input('Введите количество элементов этой прогрессии, которое Вы хотите увидеть'))
for i in range(1, nn):
    b1 *= q
    print(f'b{i} = {b1}')

Ругается на последнюю строку:
SyntaxError: invalid syntax

Скорее всего вы используете версию Python, которая не поддерживает f-строки (они поддерживаются начиная с Python 3.6).
Решение:

Установить более новую версию Python (или запускать более новой версией, если она уже установлена), или
Использовать другие варианты форматирования строк, например:

print('b{i} = {b1}'.format(i=i, b1=b1))

или

print('b{} = {}'.format(i, b1))

или ("старый" Си-подобный стиль)

print('b%d = %s' % (i, b1))


Как добавить несколько авторов к одной книге в Django
Есть две модели Автор и Книга в модели Автор создано 3 автора Jim, Bob, Ana
как добавить Jim, Ana в Book?  Через DjangoAdmin можно выбрать всего лишь одного автора. Помогите разобраться пожалуйста.
<code>
class Author(models.Model):
   first_name = models.CharField(max_length=50)
   last_name = models.CharField(max_length=50)
class Blog(models.Model):
   title = models.CharField(max_length=255)
   author = models.ForeignKey(Author, on_delete=models.CASCADE)
</code>

Создайте связь многое-ко-многим:
<code>
class Blog(models.Model):
    title = models.CharField(max_length=255)
    author = models.ManyToManyField(Author)
</code>


Проблема с вычислением
Есть проблема. Надо в 33 строке посчитать формулу, но у меня не получается. Ошибка. Что делать?
<code>
import math
import time
print('Программа работает с геометрической прогрессией')
time.sleep(2)
print('Прежде чем мы начнем, напишите, Вы знаете второй член прогресии b2 (Да/Нет): ')
answer=input()
if answer == 'Да':
    print('Введите первый член прогресии (!= 0): ')
    b1 = input()
    print('Введите второй член прогресии (!= 0): ')
    b2 = input()
    q = eval(b2) / eval(b1)
elif answer == 'Нет':
    print('Введите первый член прогресии (!= 0): ')
    b1 = input()
    print('Введите знаменатель прогресии (!= 0): ')
    q = input()
    b2 = eval(b1) * eval(q)
else:
    print('Ошибка ввода. Работа программы прекращена.')
    time.sleep(3)
    exit(0)

print()
print('Отлично. Теперь у нас есть всё, для того чтобы поработать с прогрессией!')
print('Bn: b1 = '+str(b1)+'; b2 = '+str(b2)+'; q = '+str(q))
print()
time.sleep(1)
print('Давайте найдем какой-нибудь член этой прогресии.')
print('Введите номер члена, который будем искать: ')
n=input()
bn=b1 * (q ** n-1)
print(bn)
</code>

у меня не получается. Ошибка. Что делать?

Как Вы считаете, нам было бы легче ответить на Ваш вопрос, если бы мы знали, какая это ошибка?

Какой здесь приоритет операций, и какие типы переменных?
<code>
bn = float(b1) * (float(q) ** (int(n) - 1))
</code>


Добавить к матрице строку и вставить ее под номером
Как с помощью библиотеки numpy добавить к матрице строку и вставить ее под нужным номером?


Как сделать отображение картинки не на всё окно, а в ограниченной области? PyQT5
И как можно разграничить область с картинкой и область с radiobutton? При этом нужно сохранить пропорции картинки в области. Код на Python.
<code>
import sys
from PyQt5.QtWidgets import (QMainWindow, QApplication, QLabel, QFileDialog,
                         QAction, QWidget, QGraphicsItem, QRadioButton)
from PyQt5.QtGui import QPixmap, QCursor, QPainter, QPen, QColor
from PyQt5.QtCore import QCoreApplication, Qt, QRect

class MainWindow(QMainWindow):
    def __init__(self, parent = None):
        super(MainWindow, self).__init__(parent)

        self.imagePath = ''
        self.chosen_points = []
        self.zeroX   = 0
        self.zeroY   = 0

        self.scaleX_x = 0
        self.scaleX_y = 0

        self.scaleY_x = 0
        self.scaleY_y = 0

        self.chooseColor = 0

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('Файл')
        editMenu = menubar.addMenu('Редактор')
        openAction = QAction('Открыть', self)
        openAction.triggered.connect(self.openImage)
        openAction.setShortcut('Ctrl+O')
        fileMenu.addAction(openAction)
        closeAction = QAction('Выход', self)
        closeAction.triggered.connect(self.close)
        fileMenu.addAction(closeAction)
        editAction = QAction('Выбрать точки', self)
        editAction.triggered.connect(self.choosePoint)
        editMenu.addAction(editAction)

        self.resize(1000, 1000)
        self.label = QLabel()
        self.setCentralWidget(self.label)

        self.rB1 = QRadioButton("Отметить точку (0, 0)", self)
        self.rB1.setGeometry(QRect(600, 20, 900, 17))
        self.rB1.setChecked(True)
        self.rB2 = QRadioButton("Отметить точку (1, 0)", self)
        self.rB2.setGeometry(QRect(600, 40, 900, 17))
        self.rB3 = QRadioButton("Отметить точку (0, 1)", self)
        self.rB3.setGeometry(QRect(600, 60, 900, 17))
        self.rB4 = QRadioButton("Отметить точки на графике", self)
        self.rB4.setGeometry(QRect(600, 80, 900, 17))

    def openImage(self):
        self.imagePath, _ = QFileDialog.getOpenFileName(self, "Select Image", "", "Image Files (*.png *.jpg *.jpeg *.bmp)")

    def mousePressEvent(self, mouse_event):
        self.cursor = QCursor()

        if mouse_event.button() == Qt.LeftButton:

            if self.rB1.isChecked() == True:
                self.zeroX = mouse_event.x()
                self.zeroY = mouse_event.y()
                print(self.zeroX, self.zeroY)
                self.chosen_points.append(mouse_event.pos())

            if self.rB2.isChecked() == True:
                self.scaleX_x = mouse_event.x()
                self.scaleX_y = mouse_event.y()
                self.chosen_points.append(mouse_event.pos())

            if self.rB3.isChecked() == True:
                self.scaleY_x = mouse_event.x()
                self.scaleY_y = mouse_event.y()
                self.chosen_points.append(mouse_event.pos())

            if self.rB4.isChecked() == True:
                self.chosen_points.append(mouse_event.pos())
        self.update()

    def paintEvent(self, paint_event):
        painter = QPainter(self)
        pixmap = QPixmap(self.imagePath)
        painter.drawPixmap(self.rect(), pixmap)
        if self.imagePath:
            self.resize(pixmap.width(), pixmap.height())
        pen = QPen(QColor("green"))
        pen.setWidth(5)
        painter.setPen(pen)
        for pos in self.chosen_points:
            painter.drawPoint(pos)

    def choosePoint(self):
        print("def choosePoint(self):")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainWindow()
    win.setWindowTitle('Оцифровка графиков')
    win.show()
    sys.exit(app.exec_())
</code>

И как можно разграничить область с картинкой и область с radiobutton?

В текущем виде самое простое -- захаркодить ширину картинки. А по хорошему сделать виджет для картинки (в вашем предыдущем вопросе я оставлял ответ с таким виджетом) и через компоновщики (layout'ы) разместить виджет и кнопки.

При этом нужно сохранить пропорции картинки в области

Делайте у pixmap перед рисование вызов scaled туда передавайте ширину, высоту и способ Qt.KeepAspectRatio, тогда картинка сохранит пропорции. И рисуйте так:

painter.drawPixmap(0, 0, pixmap)

Пример:

import sys
from PyQt5.QtWidgets import (QMainWindow, QApplication, QLabel, QFileDialog,
                         QAction, QWidget, QGraphicsItem, QRadioButton)
from PyQt5.QtGui import QPixmap, QCursor, QPainter, QPen, QColor
from PyQt5.QtCore import QCoreApplication, Qt, QRect

class MainWindow(QMainWindow):
    def __init__(self, parent = None):
        super(MainWindow, self).__init__(parent)

        self.imagePath = ''
        self.chosen_points = []
        self.zeroX   = 0
        self.zeroY   = 0

        self.scaleX_x = 0
        self.scaleX_y = 0

        self.scaleY_x = 0
        self.scaleY_y = 0

        self._fixed_image_width = 500  # Добавил ширину

        self.chooseColor = 0

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('Файл')
        editMenu = menubar.addMenu('Редактор')
        openAction = QAction('Открыть', self)
        openAction.triggered.connect(self.openImage)
        openAction.setShortcut('Ctrl+O')
        fileMenu.addAction(openAction)
        closeAction = QAction('Выход', self)
        closeAction.triggered.connect(self.close)
        fileMenu.addAction(closeAction)
        editAction = QAction('Выбрать точки', self)
        editAction.triggered.connect(self.choosePoint)
        editMenu.addAction(editAction)

        self.resize(1000, 1000)
        self.label = QLabel()
        self.setCentralWidget(self.label)

        self.rB1 = QRadioButton("Отметить точку (0, 0)", self)
        self.rB1.setGeometry(QRect(600, 20, 900, 17))
        self.rB1.setChecked(True)
        self.rB2 = QRadioButton("Отметить точку (1, 0)", self)
        self.rB2.setGeometry(QRect(600, 40, 900, 17))
        self.rB3 = QRadioButton("Отметить точку (0, 1)", self)
        self.rB3.setGeometry(QRect(600, 60, 900, 17))
        self.rB4 = QRadioButton("Отметить точки на графике", self)
        self.rB4.setGeometry(QRect(600, 80, 900, 17))

    def openImage(self):
        self.imagePath, _ = QFileDialog.getOpenFileName(self, "Select Image", "", "Image Files (*.png *.jpg *.jpeg *.bmp)")

    def mousePressEvent(self, mouse_event):
        self.cursor = QCursor()

        if mouse_event.button() == Qt.LeftButton:

            if self.rB1.isChecked() == True:
                self.zeroX = mouse_event.x()
                self.zeroY = mouse_event.y()
                print(self.zeroX, self.zeroY)
                self.chosen_points.append(mouse_event.pos())

            if self.rB2.isChecked() == True:
                self.scaleX_x = mouse_event.x()
                self.scaleX_y = mouse_event.y()
                self.chosen_points.append(mouse_event.pos())

            if self.rB3.isChecked() == True:
                self.scaleY_x = mouse_event.x()
                self.scaleY_y = mouse_event.y()
                self.chosen_points.append(mouse_event.pos())

            if self.rB4.isChecked() == True:
                self.chosen_points.append(mouse_event.pos())
        self.update()

    def paintEvent(self, paint_event):
        painter = QPainter(self)
        if self.imagePath:
            w, h = self._fixed_image_width, self.height()  # Берем нашу ширину и высоту виджета

            pixmap = QPixmap(self.imagePath)
            pixmap = pixmap.scaled(w, h, Qt.KeepAspectRatio)  # Маштабируем картинку с сохранением пропорций
            painter.drawPixmap(0, 0, pixmap)  # Рисуем картинку начиная с левого верхнего угла
            # self.resize(pixmap.width(), pixmap.height())

        pen = QPen(QColor("green"))
        pen.setWidth(5)
        painter.setPen(pen)
        for pos in self.chosen_points:
            painter.drawPoint(pos)

    def choosePoint(self):
        print("def choosePoint(self):")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainWindow()
    win.setWindowTitle('Оцифровка графиков')
    win.show()
    sys.exit(app.exec_())

PS.
Вместо

w, h = self._fixed_image_width, self.height()

можно брать, например, половину текущей ширины окна:

w, h = self.width() // 2, self.height()


Разделение колонки CSV
Есть CSV файл типа:

AAA, DDD, EEE, last_column
а,  "b,c", e,  last

Нужно привести его к виду

AAA, EEE, last_column, b, c
a,   e,   last,        b, c

Разделитель запятая. Нет даже идей как это можно сделать скриптом.

Если есть test.csv:

AAA, DDD, EEE, last_column
а,  "b,c", e,  last
f,  "r,p", m,  foo

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

import pandas as pd

df = pd.read_csv('test.csv', sep=',', skipinitialspace=True)
res = df["DDD"].str.split(",", n=1, expand = True)

for x in res:
    df[x] = res[x]

df.drop(columns =["DDD"], inplace = True)
df.to_csv('result.csv', index=False)

Что даст нам
result.csv:

AAA,EEE,last_column,0,1
а,e,last,b,c
f,m,foo,r,p


Как записать два цикла for для одной функции
Есть два списка:
first_list и
second_list. Как теперь правильно записать для них циклы
for чтобы передать результат в функцию
get_result?

def get_first_list():

    first_list = ["one", "two", "three"]

    return first_list

def get_second_list():

    second_list = [1, 2, 3]

    return second_list

def get_result(ifirst, isecond):

    print(ifirst)

    print(isecond)

def main():

    first_list = get_first_list()
    second_list = get_second_list()

    get_first_list()
    for first in first_list:
        ifirst = first
        get_result(ifirst, isecond)

    get_second_list()
    for i in second_list:
        isecond = i
        get_result(ifirst, isecond)

if __name__ == '__main__':
    main()

def main():
    first_list = get_first_list()
    second_list = get_second_list()
    for ifirst, isecond in zip(first_list, second_list):
        get_result(ifirst, isecond)

или

def main():
    any(map(get_result, get_first_list(), get_second_list()))

это не одно и то же в общем случае, но в данном примере сработает.


Поместить повторяющиеся элементы списка в подсписки (в функциональном стиле)
Прошу, помогите реализовать данное задание на ЯП Python в функциональном стиле. Возможно использование генератора списка и функций высшего порядка (map, reduce, filter и т.д.).
Пример:
<code>
(a a a a b c c a a d e e e e) => ((a a a a)(b)(c c)(a a)(d)(e e e e))
</code>


Как обеспечить HTTPS на flask python?
Как обеспечить https соединение на web фреймворке flask (python3)? Заранее спасибо!

Например так:
<code>
from flask import Flask

from OpenSSL import SSL
context = SSL.Context(SSL.PROTOCOL_TLSv1_2)
context.use_privatekey_file('server.key')
context.use_certificate_file('server.crt')

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, world!'

if __name__ == '__main__':
     app.run(host='127.0.0.1', debug=True, ssl_context=context)
</code>
Но это не очень хорошая практика, обрабатывать HTTPS внутри веб-приложения. Для этого обычно применяются прокси-сервера вроде NginX, примеров его настройки полно, в т.ч на оф.сайте.
Где взять SSL/TLS сертификат это отдельный вопрос со своими нюансами – статей много (особенно на англ), погуглите. Вкратце: можно купить, можно сгенерировать простенький самому или на сайтах вроде SSLforFree.


Не понимаю как использовать configparser в Python
Мне нужно заюзать конфиги в коде, но print не хочет мне вывести что вообще в конфиге есть. Смотрел в дебаггере - qw и we уже передает пустой лист. Что делать?

with open(path_configs + 'config_1.ini', 'r') as config_file:
    config = configparser.ConfigParser()
    qw = config.read(config_file)
    we = config.sections()
    er = config['KEYS']
    print(er)

Пишет

Traceback (most recent call last):
  File "C:/Users/User3/PycharmProjects/untitled/script.py", line 29, in <module>
    er = config['KEYS']
  File "C:\Users\User3\AppData\Local\Programs\Python\Python37-32\lib\configparser.py", line 958, in __getitem__
    raise KeyError(key)
KeyError: 'KEYS'

Собственно кофиг

[KEYS]
a = b
f = h
...

Метод
read принимает в качестве аргумента строку пути к файлу или список путей к файлам настроек.

config = configparser.ConfigParser()
config.read(path_configs + 'config_1.ini')

print(config['KEYS'])
# <Section: KEYS>

print(config['KEYS']['a'])
# b


Работа с файлами Python. Как вывести только цифры?
Есть текстовый файл:

Name,55
Tttaa,43
Asdasdasd,222
Asdasdasd,203
Fdfsg,34
Gffdfd,64
Vxzczcv,55
Fdsafdf,99
Asdasd,231

Мне нужно из него вывести только числа в список, и после этого отсортировать. С сортировкой проблем нету, не могу только понять как внести только числа в список.
Делаю как-то так, но что-то не получается. Знаю, что можно readline использовать, но как именно записать числа в список?

group673=open("673.txt")
lst=group673.read().split(',')
print (lst)
group673.close()

Решение через
re будет выглядеть так

import re
with open("673.txt") as group673
    digits = re.findall(r'\d+', group673.read())
    print(digits)
# ['55', '43', '222', '203', '34', '64', '55', '99', '231', '90']

Если в списке нужны данные типа
int, то можно записать так:

digits = [int(_) for _ in re.findall(r'\d+', group673.read())]

Или через
map:

digits = list(map(int, re.findall(r'\d+', group673.read())))

Или вообще упростить до

import re
digits = list(map(int, re.findall(r'\d+', open('673.txt').read())))


При вставке ошибка: ORA-01013: user requested cancel of current operation
Подключение к БД на сервере:

def connect():
    # Выполняем подключение к серверу Oracle

    connection = cx_Oracle.connect("SYSTEM", 'pass', "172.20.0.2:1521/ORCLCDB")
    cursor = connection.cursor()

    return connection, cursor

def load_database(total):
    # Загрузка данных в Oracle

    connection, cursor = connect()

    for article in total:
        sql_article = "INSERT INTO ARTICLES (NAME) VALUES ('%s')"%
        (article['name_article'])
        cursor.execute(sql_article)
        connection.commit()

При выполнении кода:

cursor.execute(sql_article)

приложение зависает. Если прервать выполнение, получаем ошибку:

cx_Oracle.OperationalError: ORA-01013: user requested cancel of current operation

Если же отправить этот запрос в БД не из цикла, то все работает.
В чем проблема?

01013, 00000, "user requested cancel of current operation"

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

Почему вставка длится так долго?

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

Исходя из вышеизложенного, код вставки будет выгядеть как-то так:
<code>
total = [{"no":123, "name":"art123"}, {"no":222, "name":"art222"}]

cursor.executemany ("insert into art (name) values (:1)", [(d['name'],) for d in total])
connection.commit ()
</code>


Нужно сделать задержку (таймер) к функциям на Python 3.7
Желаю сделать программу с определенными функциями на Python 3.7, которые будут выполняться с прошедшим временем. Пытался изучить библиотеки Tkinter и Time, но должной информации не нашел. Прошу помочь, нужен простенький таймер на каждую функцию.

Пример импортировать модуль
time и вызвать из него функцию
sleep

import time
time.sleep(10)


Как в Python из ключа json сделать заголовок csv?
Есть данные формата json, структура такая -

{"q":"1",
"w":[{"qwe": "123","rty":"456","uio":"789"},
     {"qwe": "657","rty":"345","uio":"087"}]}

Примерно так он выглядит. При парсинге в общем ключи из json нужно превратить в заголовки в csv. Он должен выглядеть так -

qwe,rty,uio
123,456,789
657,345,087

НО, json может выглядеть так -

{"q":"1",
"w":[{"qwe": "123","rty":"456","uio":"789"},
     {"qwe": "657","rty":"345","uio":"087"},
     {"tert": "er54t", "uetn": "er54t", "ywfe": "er54t", "kjgn": "er54t", "azvd": "er54t"]}

А в csv он выглядит так -

qwe,rty,uio
123,456,789
657,345,087
er54t,er54t,er54t,er54t,er54t

В конце концов его надо превратить в такое -

qwe,rty,uio
123,456,789
657,345,087
tert,uetn,ywfe,kjgn,azvd
er54t,er54t,er54t,er54t,er54t

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

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

{
    ('qwe', 'rty', 'uio'): [
        [123, 456, 789],
        [657, 345, 087]
    ],
    ('tert', 'uetn', 'ywfe', 'kjgn', 'azvd'): [
        ['er54t', 'er54t', 'er54t', 'er54t', 'er54t']
    ]
}

Таким образом мы сгруппируем строки с одинаковыми заголовками и с такой структурой работать будет чуть удобнее.
Используем
collections.defaultdict, значениями по умолчанию в котором указываем списки, чтобы было проще добавлять туда данные.

In [31]: import csv

In [32]: import collections

In [33]: result = collections.defaultdict(list)

In [34]: data
Out[34]:
{'q': '1',
 'w': [{'qwe': '123', 'rty': '456', 'uio': '789'},
  {'qwe': '657', 'rty': '345', 'uio': '087'},
  {'tert': 'er54t',
   'uetn': 'er54t',
   'ywfe': 'er54t',
   'kjgn': 'er54t',
   'azvd': 'er54t'}]}

Заполняем словарь

In [35]: for d in data['w']:
    ...:     result[tuple(d.keys())].append(d.values())
    ...:

In [36]: result
Out[36]:
defaultdict(list,
            {('qwe', 'rty', 'uio'): [dict_values(['123', '456', '789']),
              dict_values(['657', '345', '087'])],
             ('tert',
              'uetn',
              'ywfe',
              'kjgn',
              'azvd'): [dict_values(['er54t', 'er54t', 'er54t', 'er54t', 'er54t'])]})

Записываем результат в файл:

In [37]: with open('out.csv', 'w', newline='', encoding='utf=8') as f:
    ...:     writer = csv.writer(f)
    ...:     for k, v in result.items():
    ...:         writer.writerow(k)
    ...:         for i in v:
    ...:             writer.writerow(i)

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


можно ли получить имя переменной экземпляра класса внутри __init__ этого же экземпляра?
Ну то есть

class LinkedList(object):
    def __init__(self, head:Node = None):
        self.head = head
        self.name = self.какая-то_магия_дающая_имя_self

Да, извращение. Если интересно - просто хочу реализовать связанный список и классически, и через словари и через списки и, конкретно здесь, через SQLite. Ну и хочу хранить в базе в оьдельном поле имя списка, которому принадлежат узлы...
такая себе автосериализация будет...
Пример в предложенном возможном дубле вопроса insolor, не работает:

class Test():
    def __init__(self,value, g=globals()):
        self. value = value
        print(*[n for n in g if g[n] is self])

dd = Test(33)
print(dd.value)

на печать выдает только 33. Если при уже существующем dd запустить

Test.__init__(dd,34)

то
dd распечатается...
Похоже - никак?

когда мы пишем lst = LinkedList(object), то срабатывает __init__(self, head:Node = None) с lst вместо self. Ну вот lst - это и есть имя экземпляра класса – Vasyl Kolomiets
Все гораздо проще - автор читает это слева направо, а не справа налево

lst = LinkedList(object)
Т.е. считает что сначала происходит присваивание
lst = и затем это имя передается в init где потом создается объект - конечно это неверно
На самом же деле - Сначала создается объект, который на этом этапе никуда не сохраняется
1)
LinkedList(object)
и только потом то, что там создано сохраняется в lst,
2)
lst = то что мы создали ранее
т.е. имя переменной известно только После создания объекта, но никак не до его создания
Конечно правильнее передавать эти имена явно, аргументом или использовать один контейнер(напр dict) для хранения всех экземпляров, а идея автора делать как он описал - плоха


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

['13', '24', '66', '78', '99']

Есть ли функция которая переставляет эти значения в определенном порядке?
Например:

['24', '66', '13', '99, '78']

Вам нужна математическая перестановка. И то, что Вы хотите сделать, называется перестановочным шифром, ключом в котором является перестановка. Для шифрования используется перестановка, для расшифрования используется обратная к той, что использовалась при шифровании.
<code>
import random

def gen_key(length: int) -> tuple:
    key = tuple(range(length))
    return tuple(sorted(key, key=lambda _: random.random()))

def get_inverse_permutation(perm: tuple) -> tuple:
    ret_perm = [0] * len(perm)
    for i, p in enumerate(perm):
        ret_perm[p] = i
    return tuple(ret_perm)

def encrypt(plain: list, perm: tuple) -> list:
    cipher = [plain[i] for i in perm]
    return cipher

def decrypt(cipher: list, perm: tuple) -> list:
    inv_perm = get_inverse_permutation(perm)
    return encrypt(cipher, inv_perm)

foo = ['13', '24', '66', '78', '99']

key = gen_key(len(foo))
print(f"Key: {key}")

cipher = encrypt(foo, key)
print(f"Cipher: {cipher}")

plain = decrypt(cipher, key)
print(plain == foo)
</code>