Работа со строкой. split() [закрыт]

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

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

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

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

Исходные данные:

q = "На данный продукт распространяются условия ограниченной гарантии Apple, предоставляющей право на соответствующее обслуживание и ремонт аппаратного обеспечения.Предполагаемая дата окончания срока действия: 23 сентября 2019 г.Ознакомьтесь с информацией Apple относительно права на сервисное обслуживаниедля вашего продукта ссылка откроется в новом окне"

После q.split()

q = ['На данный продукт распространяются условия ограниченной гарантии Apple, предоставляющей право на соответствующее обслуживание и ремонт аппаратного обеспечения.\nПредполагаемая дата окончания срока ', ' 23 сентября 2019 г.\nОзнакомьтесь с информацией Apple относительно права на сервисное обслуживание для вашего продукта\nссылка откроется в новом окне']

Вопрос-задача:

Почему разбивает на список по строчно? Потому что при записи в переменную передались и "\n"?
Задача "вырезать" дату (здесь как пример, а так дата всегда разная).
Нуждаюсь в совете.

Задача "вырезать" дату

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

In [18]: q = "На данный продукт распространяются условия ограниченной гарантии Apple, предоставляющей право на соответствующее обслуживание и ремонт ап
    ...: паратного обеспечения.Предполагаемая дата окончания срока действия: 23 сентября 2019 г.Ознакомьтесь с информацией Apple относительно права на
    ...: сервисное обслуживаниедля вашего продукта ссылка откроется в новом окне"

In [19]: q.split('действия: ')[1].split('Ознакомьтесь')[0]
Out[19]: '23 сентября 2019 г.'

Или сделать это с помощью регулярных выражений:

In [20]: import re

In [21]: re.findall('\d{1,2} \w+ \d{4} г.', q)
Out[21]: ['23 сентября 2019 г.']


Отбросить приставку слова
Мне нужно получить инфинитив слова и отбросить его приставку с помощью
pymorphy2.
Я пытался найти нужную информацию в документации, но не нашёл (есть KnownPrefixAnalyzer, но ничего не написано про то, как им пользоваться. Очевидно, это внутренний анализатор). Буду благодарен за любую помощь.

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

from pymorphy2 import MorphAnalyzer
from pymorphy2.units.by_analogy import KnownPrefixAnalyzer, UnknownPrefixAnalyzer

morph = MorphAnalyzer()

def cut_prefix(word, morph=MorphAnalyzer()):
    analyzers = [
        KnownPrefixAnalyzer(morph),
        UnknownPrefixAnalyzer(morph)]
    seen = set()
    word_lower = word.lower()
    res = []
    for analyzer in analyzers:
        parsed = analyzer.parse(word, word_lower, seen)
        if not parsed:
            continue
        tmp = parsed[0]
        res.extend(tmp)
        if len(tmp) >= 5:
            if tmp[4] and tmp[4][0]:
                return morph.normal_forms(tmp[4][0][1])[0]
    return res

тесты:

In [131]: cut_prefix("приукрасила")
Out[131]: 'украсить'

In [132]: cut_prefix("подловил")
Out[132]: 'ловить'

In [133]: cut_prefix("мегаабракадабра")
Out[133]: 'абракадабра'

In [134]: cut_prefix("перенедоел")
Out[134]: 'недоесть'

In [140]: cut_prefix("безопасный")
Out[140]: 'опасный'

In [141]: cut_prefix("безобразие")
Out[141]: 'образие'


Python - Создать массив 10 на 10 и заполнить его значениями по условию
Я не понимаю ошибки  list index out of range
<code>
for i in range(n):
    for j in range(n):
        mass[i][j] = r
mass
</code>


Python запуск / остановка функции
есть цикл, как сделать чтобы можно было его запустить и остановить вводом /start и /stop
тот же input() замораживает скрипт
заранее спасибо
upd. допустим у меня есть функция

def foo(text):
    while True:
        print(text)
        time.sleep(1)

и мне допустим надо ее запустить несколько раз, например с текстом "text 1", "text 2" и "text 3" и они должны работать одновременно
upd2.
сделал такой код, но при старте перестает работать input()

from threading import Thread
from time import sleep

def foo(text):
    for i in range(10):
        out = text + ' [' + str(i) + ']'
        print(out)
        sleep(1)

#t1 = Thread(target=foo, args=('text 1',))

threads = []

while True:
    cmd = input('cmd > ')
    if cmd == 'start':
        text = input('text > ')
        threads.append(Thread(target=foo, args=(text,)))
        threads[-1].start()
        threads[-1].join()
    elif cmd == 'stop':
        pass

upd3.
как тогда сделать чтобы код продолжил выполняться после запуска потока (чтобы 123 вывелось не в конце, а в начале)

from threading import Thread
from time import sleep

def foo(text):
    for i in range(10):
        out = text + ' [' + str(i) + ']'
        print(out)
        sleep(1)

t1 = Thread(target=foo, args=('text 1',))
t2 = Thread(target=foo, args=('text 2',))

t1.start()
t2.start()

t1.join()
t2.join()

print('123')

Советую почитать о назначении метода
join(). Предлагаю такое решение:

from threading import Thread
from time import sleep

def foo(text):
    for i in range(10):
        out = text + ' [' + str(i) + ']'
        print(out)
        sleep(1)

#t1 = Thread(target=foo, args=('text 1',))

threads = []

while True:
    cmd = input('cmd > ')
    if cmd == 'start':
        text = input('text > ')
        threads.append(Thread(target=foo, args=(text,)))
        threads[-1].start()
        #threads[-1].join()
    elif cmd == 'stop':
        pass

for thread in threads:
    thread.join()

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

from threading import Thread
from threading import Lock
from time import sleep

lk = Lock() # Мьютекс

def foo(text):
    for i in range(10):
        out = text + ' [' + str(i) + ']'
        lk.acquire()
        print(out)
        lk.release()
        sleep(1)

#t1 = Thread(target=foo, args=('text 1',))

threads = []

while True:
    lk.acquire()
    cmd = input('cmd > ')
    lk.release()
    if cmd == 'start':
        lk.acquire()
        text = input('text > ')
        lk.release()
        threads.append(Thread(target=foo, args=(text,)))
        threads[-1].start()
        sleep(5) # Спит, чтобы функция успела хоть что-то вывести до очередной блокировки
        #threads[-1].join()
    elif cmd == 'stop':
        pass

for thread in threads:
    thread.join()

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


Запланированный вызов функции и дублирование ответа бота в ВКонтакте
мне нужно через бота каждое утро в 8 часов вызывать функцию prizyv_morning(), но я не понимаю что вписать в peer_id чтобы он отправил в айди всех бесед содержащихся в массиве ids_groups. Выводит ошибку

__call__() takes 1 positional argument but 2 were given

Вот функция которую я хочу запустить и планировщик ниже.

    members = vk.messages.getConversationMembers(
        peer_id = "Тут должен быть айди беседы, но я вписывал peer",
    )['items']

    members_ids = [member['member_id'] for member in members if member['member_id'] > 0]

    message = 'Доброе утро! Напоминаю вам что сегодня будет вебинар. Всем хорошего дня!!!'
    for member_id in members_ids:
        message += f'[id{member_id}|#]'
    for i in range(len(ids_group)):
        send_message(ids_group[i], message)

# ///////////////////////////////////////////////////////// КОНЕЦ ФУНКЦИЙ ПРИЗЫВА /////////////////////////////////////////////////////////

# ///////////////////////////////////////////////////////// Планировщик по воскресеньям /////////////////////////////////////////////////////////

# теги: rus, eng, phys, bio, history, obsch
# ЧАСОВОЙ ПОЯС -3
def scheduler():
    schedule.every().tuesday.at("01:05").do(prizyv_morning)

    while True:
        schedule.run_pending()
        sleep(1)  # Выберите оптимальное значение под свои задачи планировщика

# Создаём и запускаем планировщик в отдельном потоке
t = Thread(target=scheduler)
t.start()

# ///////////////////////////////////////////////////////// Конец планировщика /////////////////////////////////////////////////////////

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

NAME = 'БОТ JASON'
VERSION = 2.0
# ///////////////////////////////////////////////////////// ИМПОРТ МОДУЛЕЙ /////////////////////////////////////////////////////////
from vk_api import VkApi
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
from vk_api.utils import get_random_id
from threading import Thread
from time import sleep
import schedule
import time
# ///////////////////////////////////////////////////////// КОНЕЦ ИМПОРТА МОДУЛЕЙ /////////////////////////////////////////////////////////

# ///////////////////////////////////////////////////////// МАССИВЫ С ID БЕСЕД И УЧИТЕЛЕЙ /////////////////////////////////////////////////////////
ids_group = [ # Не знаю почему назвал группами беседу, да и кого это волнует))
    2000000014, # Русский язык
    2000000018, # Обществознание
    2000000017, # Физика
    2000000015, # История
    2000000016, # Биология
    2000000019, # Английский язык
]

# учителя
ids_teachers = [
    159523091, # Назиля (Русский язык)
    37066446, # Диляра (Обществознание)
    88864448, # Анвар (Физика)
    105722192, # Оля (История)
    241310331, # Антонина (Биология)
    44618787, # Регина(Английский язык)
    333017994, # Равиль
    23526696, # Альберт
    504785497, # Санчай
]
# ///////////////////////////////////////////////////////// КОНЕЦ МАССИВОВ С ID БЕСЕД И УЧИТЕЛЕЙ /////////////////////////////////////////////////////////

# ///////////////////////////////////////////////////////// ФУНКЦИИ /////////////////////////////////////////////////////////

# Вывод сообщений
def send_message(peer_id, message):
    vk.messages.send(
        peer_id=peer_id,
        message=message,
        random_id=get_random_id(),
    )

# ///////////////////////////////////////////////////////// НАЧАЛО ФУНКЦИЙ ПРИЗЫВА /////////////////////////////////////////////////////////
def prizyv():
    members = vk.messages.getConversationMembers(
        peer_id = peer_id,
    )['items']

    members_ids = [member['member_id'] for member in members if member['member_id'] > 0]

    message = 'Призыв!'
    for member_id in members_ids:
        message += f'[id{member_id}|#]'

    send_message(peer_id, message)

def prizyv_morning():
    members = vk.messages.getConversationMembers(
        peer_id,
    )['items']

    members_ids = [member['member_id'] for member in members if member['member_id'] > 0]

    message = 'Доброе утро! Напоминаю вам что сегодня будет вебинар. Всем хорошего дня!!!'
    for member_id in members_ids:
        message += f'[id{member_id}|#]'
    for i in range(len(ids_group)):
        send_message(ids_group[i], message)

# ///////////////////////////////////////////////////////// КОНЕЦ ФУНКЦИЙ ПРИЗЫВА /////////////////////////////////////////////////////////

# ///////////////////////////////////////////////////////// Планировщик по воскресеньям /////////////////////////////////////////////////////////

# теги: rus, eng, phys, bio, history, obsch
# ЧАСОВОЙ ПОЯС -3
def scheduler():
    schedule.every().tuesday.at("01:05").do(prizyv_morning)

    while True:
        schedule.run_pending()
        sleep(1)  # Выберите оптимальное значение под свои задачи планировщика

# Создаём и запускаем планировщик в отдельном потоке
t = Thread(target=scheduler)
t.start()

# ///////////////////////////////////////////////////////// Конец планировщика /////////////////////////////////////////////////////////

# ///////////////////////////////////////////////////////// РЕГИСТРАЦИЯ БОТА /////////////////////////////////////////////////////////

accessToken = 'token' # токен
groupId = id  # id группы в котором находится бот

vkBotSession = VkApi(token=accessToken)
longPoll = VkBotLongPoll(vkBotSession, groupId)
vk = vkBotSession.get_api()

# ///////////////////////////////////////////////////////// КОНЕЦ РЕГИСТРАЦИИ БОТА /////////////////////////////////////////////////////////

# ///////////////////////////////////////////////////////// САМА РАБОТА БОТА В БЕСЕДАХ /////////////////////////////////////////////////////////
while True:
    try:
        for event in longPoll.listen():
            if event.type == VkBotEventType.MESSAGE_NEW:
                """
                Если бот не отвечает на сообщения из беседы, то выдайте ему права
                на чтение всей переписки, а лучше сразу права администратора,
                потому что они нужны для функции prizyv.
                """
                from_id = event.obj['from_id']  # id пользователя, который отправил сообщение
                peer_id = event.obj['peer_id']  # peer_id беседы или ЛС, откуда пришло сообщение

                # lower - это метод приведения к нижнему регистру. Для регистронезависимости.
                message = event.obj['text'].lower()

                # message теперь в нижнем регистре, поэтому все проверки делаем тоже в нижнем регистре
                # теги: rus, eng, phys, bio, history, obsch
                if ('крут' in message) and message != 'полностью согласен! реально круто 😎':
                    send_message(peer_id, 'О да, это точно круто! B-)')
                elif "призыв!" in message and (from_id in ids_teachers):
                    prizyv()
    except Exception as E:
        time.sleep(1)
#//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Для того чтобы отправить сообщение во все беседы, просто оберните тело функции в цикл
for, передав для итерации список с
peer_id.
Пример:

...
def prizyv_morning(ids: list) -> None:
    for peer_id in ids:
        members = vk.messages.getConversationMembers(
            peer_id,
        )['items']

        members_ids = [member['member_id'] for member in members if member['member_id'] > 0]

        message = 'Доброе утро! Напоминаю вам, что сегодня будет вебинар. Всем хорошего дня!!!'
        for member_id in members_ids:
            message += f'[id{member_id}|#]'

        send_message(peer_id, message)

def scheduler() -> None:
    schedule.every().tuesday.at('01:05').do(prizyv_morning, conversation_ids)

    while True:
        schedule.run_pending()
        sleep(1)  # Выберите оптимальное значение
...


как пользоваться for, range, return? [закрыт]

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

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

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

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

объясните вот эти вот:
<code>
for
return
range
</code>
объясните, пожалуйста, как ими пользоваться

Как бы мне ни хотелось отправить автора вопроса почитать любой учебник по Python, тем не менее:

for – в простейшем варианте применения (а их есть довольно много)
    создаёт цикл вот так:

    for i in  """здесь последовательность значений (любых)""" :
            """здесь тело цикла"""
Таким образом,
i поочерёдно принимает значения из
последовательности и потом выполняется тело цикла (любые другие
действия)

return – вкратце используется для возвращения значения из функции.
Объяснение о том, что такое функции и зачем они нужны слишком длинно
для ответа на вопрос, в конце прикреплю ссылку

range – опять же, вкратце, функция, создающая числовые
последовательности (а может и не только числовые, точно не помню).
Например
range(5) вернёт
[0,1,2,3,4] (как видно,
последовательность создаётся от нуля до переданного числа минус 1)

ОЧЕНЬ РЕКОМЕНДУЮ ПОЧИТАТЬ:

Учебник 1
Учебник 2 (на мой взгляд, лучше)

P.S. Автору этого вопроса и всем новичкам, кто это прочитает: прежде чем задавать вопрос на Stackoverflow следует САМОМУ(ОЙ) предпринять какие-либо попытки разобраться в материале. Читайте книжки, наконец. По таким элементарным вопросам в интернете горы литературы, в которых профессиональные и гораздо более осведомлённые авторы "разжёвывают" всё до мельчайших подробностей, не оставляя непонятным ни единого шага.


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

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

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

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

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

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

<code>
def correct_sentence(text ) -> str:
    """
        returns a corrected sentence which starts with a capital letter
        and ends with a dot.
    """
    for i in text:
...     return i.lower().capitalize()
...

    # your code here
    return text

if __name__ == '__main__':
    print("Example:")
    print(correct_sentence("greetings, friends"))

    # These "asserts" are used for self-checking and not for an auto-testing
    assert correct_sentence("greetings, friends") == "Greetings, friends."
    assert correct_sentence("Greetings, friends") == "Greetings, friends."
    assert correct_sentence("Greetings, friends.") == "Greetings, friends."
    assert correct_sentence("hi") == "Hi."
    assert correct_sentence("welcome to New York") == "Welcome to New York."

    print("Coding complete? Click 'Check' to earn cool rewards!")*
</code>

Вот один из вариантов решения Вашей задачи:
<code>
def correct_sentence(text ) -> str:
    """
        returns a corrected sentence which starts with a capital letter
        and ends with a dot.
    """
    text = text[0].upper() + text[1:]
    if(text[-1] != '.'):
        text += '.'

    return text

if __name__ == '__main__':
    print("Example:")
    print(correct_sentence("greetings, friends"))

    # These "asserts" are used for self-checking and not for an auto-testing
    assert correct_sentence("greetings, friends") == "Greetings, friends."
    assert correct_sentence("Greetings, friends") == "Greetings, friends."
    assert correct_sentence("Greetings, friends.") == "Greetings, friends."
    assert correct_sentence("hi") == "Hi."
    assert correct_sentence("welcome to New York") == "Welcome to New York."

    print("Coding complete? Click 'Check' to earn cool rewards!")*
</code>
Что здесь происходит:

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


Пространства имён в python3
Чем объясняется следующее поведение?

i = 0
x = []
for i in range(20):
    x.append(i)
print(i)  # 19

В случае же сокращённой записи:

i = 0
x = []
[i for i in range(20)]
print(i)  # 0

В чём концептуальные различия?

Хороший вопрос. Я не знаю точный ответ, но очевидно, что так короче. Если вы захотите записывать в x не i, а i^2, то такая запись будет явно короче. Не исключаю, что она и работает быстрее из-за внутренней оптимизации.

[i**2 for i in range(20)]

Стоит отметить, что во втором случае значение возвращается, а не сохраняется. Многие методы питона так поступают. Т.е. если вы запишите так
x = [i for i in range(20)] или так
[x.append(i) for i in range(20)], то будет идентично.
Надеюсь, кто нибудь оставит здесь будет более полный и точный ответ:)


Как создать таблицу Excel с помощью Бота ВКонтакте?
у меня стоит бот вконтакте на longpool, мне нужно сделать так чтобы он в определенной беседе (с помощью peer_id) выписывал Имена и Фамилию в таблицу Excel и рядом табличку с значениями цифр(3 бальная система). Можете подсказать идеи или (пожалуйста:) ) пример кода. Буду очень благодарен! Язык Python 3

Для получения
id всех участников беседы можно воспользоваться методом
messages.getConversationMembers.
Для получения их имён —
users.get.
Создание таблицы
xlsx я доверил модулю
openpyxl
Пример:

from vk_api import VkApi
from openpyxl import Workbook

ACCESS_TOKEN = '...'
PEER_ID = ...

def get_conversation_members_names(vk, peer_id: int) -> list:
    conversation_members = vk.messages.getConversationMembers(peer_id=peer_id)['items']
    members_ids = [str(member['member_id']) for member in conversation_members]

    users = vk.users.get(user_ids=','.join(members_ids))
    user_names = [' '.join((user['last_name'], user['first_name'])) for user in users]
    return user_names

def main() -> None:
    vkBotSession = VkApi(token=ACCESS_TOKEN)
    vk = vkBotSession.get_api()

    wb = Workbook()
    ws = wb.active

    names = get_conversation_members_names(vk, PEER_ID)

    lenght = len(names)
    for i, cell in enumerate(ws['A1':f'A{lenght}']):
        cell[0].value = names[i]

    wb.save('result.xlsx')

if __name__ == '__main__':
    main()


Расчет динамики показателей
Как корректно рассчитать динамику по показателям?
Имеется датафрейм
df1:

id  year  sales assets
qwe  2014  110    50
qwe  2015  115    53
qwe  2016  117    52
qwe  2017  120    55
dfe  2014  76     45
dfe  2015  80     47
dfe  2016  83     50
dfe  2017  85     50

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

id  year  % sales %assets
qwe  2014  1       1
qwe  2015  1.04    1.06
qwe  2016  1.01    0.98
qwe  2017  1.02    1.05
dfe  2014  1       1
dfe  2015  1.05    1.04
dfe  2016  1.03    1.06
dfe  2017  1.02    1

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


Как конвертировать JSON/XML в CSV/XLS?
Есть файл JSON (попутно конвертировал в XML) размером 60МБ, где каждая строка имеет по два значения:

{"item1": "default", "item2":"1473"}

или же то же самое в XML:

<root><item1>Название</item1><item2>1473</Way></root>

Как можно с помощью Python правильно конвертировать их в CSV/XLS?
P.S. В
item1 часто попадаются запятые.

Пример входного JSON:

[
 {"item1": "default", "item2":"1473"},
 {"item1": "a,b,c", "item2":"4567"}
]

Конвертация
JSON -->
CSV:

import pandas as pd   #  pip install pandas

pd.read_json(r"C:\temp\test.json").to_csv(r"c:\temp\result.csv", index=False)

Результат:

item1,item2
default,1473
"a,b,c",4567

Конвертация
JSON -->
Excel:

import pandas as pd   #  pip install pandas

pd.read_json(r"C:\temp\test.json").to_excel(r"c:\temp\result.xlsx", index=False)


Как корректно заменить в pandas '0.24.2': -np.inf и отдельно np.inf на числа?
Как корректно заменить в pandas '0.24.2': -np.inf на -9999, а np.inf на 9999?
df.replace никак не выручает, а точнее не видит в таблице ни inf, ни -inf ?
пока обхожусь таким решением:
<code>
train[features] = train[features].fillna(-999) #замена nan на -999
pd.options.mode.use_inf_as_na = True
train[features] = train[features].fillna(-9999) #замена -inf и inf на -9999
</code>
но здесь замена двух бесконечностей на одно число.


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

elif y < a < b < x:

Заданные параметры:

N: 53
M: 3
x: 2
y: 0

Код программы:

N = int(input())
M = int(input())
x = int(input())
y = int(input())
if M > N:
    a = (N - x)
    b = (M - y)
    if a < y < x < b:
        print (a)
    elif y < a < b < x:
        print (y)
    elif b < y < a < x:
        print (b)
    else:
        print (x)
else:
    a = (M - x)
    b = (N - y)
    if a < y < x < b:
        print (a)
    elif y < a < b < x:
        print (y)
    elif b < y < a < x:
        print (b)
    else:
        print (x)

(Этот код тоже на PasteBin.)

Потому что не выполняется условие
b < x.
Выражение
A < B < C равносильно
A < B and B < C.
Для лучшей отладки вашего кода могу посоветовать воспользоваться визуализатором, это поможет для самых простых проектов.


Ошибка при INSERT запросе psycopg2
Появилась следующая проблема при отправке запроса к бд

psycopg2.errors.UndefinedColumn: column "crossroad_id" of relation "api_accidents" does not exist
LINE 1: INSERT INTO api_accidents ("crossroad_id", "datetime_start",...

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

    def send(self, args):

        query = sql.SQL(self.query).format(
                sql.SQL(', ').join(map(sql.Identifier, self.col_names)),
                sql.SQL(', ').join(map(sql.Placeholder, self.col_names))
            )
        self.cursor.execute(query, args)

Так как метод базовый, в дочерних классах меняется только
col_names и
query, и с ними проблем нет.
Определяются они для этой схемы вот так внутри класса

    query = """INSERT INTO api_accidents ({}) VALUES ({})"""
    col_names = ['crossroad_id', 'datetime_start', 'datetime_stop']

При сырых запросах вот такой SQL проходит

INSERT INTO api_accidents (сrossroad_id, datetime_start, datetime_stop)
    VALUES (1, current_timestamp, NULL)

А вот такой не проходит

INSERT INTO api_accidents ("сrossroad_id", "datetime_start", "datetime_stop")
    VALUES (1, current_timestamp, NULL)

Но стандартное форматирование
sql.SQL делает второй вариант.
Можно ли как-то решить проблему, не вписывая напрямую названия столбцов без кавычек?
UPDATE
Проверил еще, в итоге выяснил, что от кавычек не зависит. Вот этот запрос выполняется независимо от того есть кавычки, или нет:

INSERT INTO api_accidents (сrossroad_id, datetime_start, datetime_stop)
    VALUES (1, current_timestamp, NULL);

А этот выдает ошибку независимо от того есть кавычки или нет:

INSERT INTO api_accidents (crossroad_id, datetime_start, datetime_stop)
    VALUES (1, current_timestamp, NULL);

И да, они полностью одинаковые. Но Postgres так не считает.

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


ID пользователя pytelegrambotapi
Можно ли как-то узнать id пользователя так, чтобы он при этом не отправлял сообщение?
Например, есть команда
message.from_user.id, но она покажет мой id.
Можно ли сделать команду
/id @пользователь, для получения НЕ моего id?

Нет, нельзя. Боты обрабатывают только сообщения, но можно переслать сообщение необходимого вам юзера и узнать
id через
message.forward_from.id. Однако это не сработает, если у пользователя установлены соответствующие настройки приватности для пересылания его сообщений.
Если же вам просто надо узнать
id без привязки к вашему боту, то лучше воспользоваться уже готовыми ботами, например,
@ForwardInfoBot


Компиляция Kivy под windows
Банальный вопрос по сути
Казалось бы, kivy так разрекламирован. И я опробовал - дествительно хорош.
Но на равне с плюшками встаёт доисторическая проблема - компиляция python кода.
И PyInstaller мне не помог, чего и стоило ожидать, т.к. об этом пишут почти везде. Файл запускается несколько секунд, а затем вылетает.
И в интернете об этом мало что пишут, куча танцов с бубном и использование версий питона ниже 3.4...
Да и почти на всех сайтах вроде qaru и т.д. рассматривается вопрос одного бедолаги, со своим специфическим кодом и иерархией директорий.
Мне же нужно хотя-бы научится компилировать один файл, хотя в дальнейшем, разумеется, понадобиться и прочие файлы, задействованные в проекте, запихивать в этот единственный exe.

install.spec:

# -*- mode: python -*-

import sys
from kivy_deps import sdl2, glew

app_name = 'atomic_quests'
sys.path += ['src/']

block_cipher = None

a = Analysis(['/Users/macbookair/Projects/Q100Q/src/main.py'],
             pathex=['/Users/macbookair/Projects/Q100Q'],
             binaries=None,
             datas=None,

             hiddenimports=[
                 'webbrowser', 'kivymd'
             ],

             hookspath=None,
             runtime_hooks=None,
             excludes=None)

from os.path import join
from fnmatch import fnmatch

exclusion_patterns = (
    join('kivy_install', 'data', 'images', 'testpattern.png'),
    join('kivy_install', 'data', 'images', 'image-loading.png'),
    join('kivy_install', 'data', 'keyboards*'),
    join('kivy_install', 'data', 'settings_kivy.json'),
    join('kivy_install', 'data',
 'logo*'),
    join('kivy_install', 'data', 'fonts', 'DejaVuSans*'),
    join('kivy_install', 'modules*'),
    join('Include*'),
    join('sdl-config'),
    join('.idea*'),
)

def can_exclude(fn):
    for pat in exclusion_patterns:
        if fnmatch(fn, pat):
            return True

a.datas = [x for x in a.datas if not can_exclude(x[0])]
#a.datas += [('load-atom.png', '/Users/macbookair/Projects/Q100Q/src/data/images/load-atom.png', 'DATA')]
a.binaries = [x for x in a.binaries if not can_exclude(x[0])]
appfolder = [x for x in Tree('/Users/macbookair/Projects/Q100Q/src/', excludes=['*.py', '*.pyc']) if not can_exclude(x[0])]

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name=app_name,
          debug=False,
          strip=False,
          upx=True,
          console=False)
#          icon='/Users/macbookair/Projects/Q100Q/src/data/images/load-atom.png')

coll = COLLECT(exe, appfolder,
               a.binaries,
               a.zipfiles,
               a.datas,
               *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
               strip=False,
               upx=True,
               name=app_name)

Build:

wine /Users/macbookair/.wine/drive_c/Python3.6/Scripts/pyinstaller.exe /Users/macbookair/Projects/Q100Q/install.spec

С путями к файлам разберетесь сами.


Запись переменной в файл
Суть задачи:
Программа спрашивает у пользователя (....)
Потом выводит результат записывая его в переменную.
Затем этот результат мне нужно записать в файл.
Вот код:

eye_color = input("Какой у Вас цвет глаз: ") # определяет цвет глаз.
result_eye_color = print("Ваш цвет глаз: " + eye_color + "\n")

f = open("test.txt", "w")
f.write(result_eye_color))
f.close()

Выводит ошибку:

TypeError: write() argument must be str, not None

Вроде как исправил...

eye_color = input("Какой у Вас цвет глаз: ") # определяет цвет глаз.
result_eye_color = print("Ваш цвет глаз: " + eye_color + "\n")

f = open("test.txt", "w")
f.write(str(result_eye_color)) # исправил так
f.close()

Но теперь в файл записывается только строка None
Помогите, пожалуйста.

Проблема здесь:

result_eye_color = print("Ваш цвет глаз: " + eye_color + "\n")

Функция
print() возвращает
None, так что
result_eye_color будет
None, и потому
string(result_eye_color) даст строку
"None".
Используйте просто переменную
eye_color:

f.write(eye_color)


Нужна помощь ошибка в коде
Ошибка типа:> не поддерживается между экземплярами str и int
Задача состоит в том, чтобы средний календарный год лучше соответствовал солнечному, в юлианском, потом и григорианском календаре в високосный год, в котором в феврале добавили еще одни, 29-е сутки.
В григорианском календаре (у нас все в живых) год является високосным в двух случаях: либо кратно 4, но не кратко 100, либо кратко 400. Напишите программу, которая принимает номер года и печатает "Високосный" или " Не високосный ".
<code>
#Задача на Високосность
print('Здравствуйте,если хотите узнать какой год <Високоный или невисокосный>'
      'напишите год')
    year = input()
    if year  >4:
        if year <100:
            if year >400:
                print('Високосный')
    else:
        print('Не високосный')
</code>

Вместо

year = input()

примените

year = int(input())

чтобы вы строку (например
"2016") изменили на целое число (
2016).
Вместо вашего неправильного кода для алгоритма по вычислении високосный / невисокосный можете использовать например

if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
    print('Високосный')
else:
    print('Не високосный')

потому что вы хотите тест на делимость, а не на больший / меньший.


Есть двухмерный массив, нужно посчитать среднее арифметичное всех положительных чисел
Есть двухмерный массив, нужно посчитать среднее арифметичное всех положительных чисел.
<code>
list = [[1, 2, 3, 4, 5], [10, 11, 12, 13, 14, 15], [20, 21, 22, 23, 24, 25]]
</code>
что должно следовать после того, как я создам этот самый массив?

Не называйте свои переменные именами встроенных функций python.

lst = [[1, 2, 3, 4, 5], [10, 11, 12, 13, 14, 15], [20, 21, 22, 23, 24, 25]]

res = [x for y in lst for x in y] # превращаем двумерный список в одномерный
res = list(filter(lambda x: x > 0, res)) # отсеиваем положительные числа
my_mean = sum(res)/len(res) # вычисляем арифметическое среднее
print(my_mean)

13.235294117647058

без lambda:

lst = [[1, 2, 3, 4, 5], [10, 11, 12, 13, 14, 15], [20, 21, 22, 23, 24, -25]]

def checkpositive(a):
    return a>0

res = [x for y in lst for x in y]
res = list(filter(checkpositive, res))
print (res)

[1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24]


Как убрать все слова со знаком " - " из csv
Есть test.csv, в ней есть условно названия:

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

велосипед лента
И сохранить в test_ext.csv

В общем, алгоритм такой
<code>
import re
of = open("text_ext.csv", "w+")

with open("text.csv", "r") as f:
    for line in f:
        line = re.sub(r"\-\S*\s?", "", line)
        of.write(line)

of.close()
</code>


Нужно посчитать количество чисел, которые больше или меньше заданного
Нужно посчитать количество чисел, которые больше или меньше заданного в списке. Пользователь, соответственно, сам вводит число. Я начала - но как дальше не знаю.
<code>
 nomer = input('Введите число: ')
    sch = input('Считать числа больше заданого или меньше? ')
    if not (sch == 'больше' or sch == 'меньше'):
</code>

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

nomer = int(input()) # Ввод числа с которым сравниваем элементы массива
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] # Массив в котором производим подсчет
more_less = input('Введите какие числа считать (more/less):') # Ввод параметра по которому будет производиться сравнение
cnt = 0 # Создание счетчика
if more_less == 'more': # Проверка значения переменной more_less, если значение more
    for i in lst:
        if i> nomer:    # ищем элементы массива больше заданного
            cnt+=1      # при верном условии увеличиваем счетчик
else:                   # иначе, если значение more_less равно less
    for i in lst:
        if i< nomer:    # ищем элементы массива меньше заданного
            cnt+=1      # при верном условии увеличиваем счетчик
print(cnt)              # выводим значение счетчика на экран


Как исправить ошибку о том что переменная не присвоена?
Есть скрипт:

import requests
from bs4 import BeautifulSoup
import pymysql

def get_html(url):
    r = requests.get(url)
    return r.text

# < Сбор ссылок.
def get_links(html):
    soup = BeautifulSoup(html, 'lxml')
    links=soup.findAll(link_container_array[0],{link_container_array[1]:link_container_array[2]})
    for link_container in links:
        a_tag = link_container .find("a")
        # Если нашел
        if a_tag:
             link = resource_allnews_link + a_tag.get("href")
    return link
# < Сбор контента.
def get_content(html, link):
     soup = BeautifulSoup(html,'lxml')
     page_url=soup.find(page_link_array[0],{page_link_array[1]:page_link_array[2]})
     print(page_url)
#< Вызывание всех функций.
def main(resource_allnews_link):
    url = resource_allnews_link
    get_links(get_html(url))
    get_content(link)

# < Подключение к базе данных.
connection = pymysql.connect(host='localhost',
                             user='root',
                             password='',
                             db='news_portal',
                             charset='utf8',
                             autocommit=True)
cursor = connection.cursor()

# < Запрос правил выдергивания контента.
cursor.execute('SELECT `resource_id`, `resource_name`, `resource_url`, `resource_allnews_link`, `link_rule`, `mainblock`, `mainblock1`, `page_link`, `title`, `datetime`, `datetime1`, `text`, `text1` FROM `resource` WHERE 1')
resources=cursor.fetchall()
# < Цикл для перебора из кортежа.
for resource in resources:
    resource_allnews_link=resource[3]
    content_rule=resource[4]
    main_block=resource[5]
    main_block1=resource[6]
    page_link=resource[7]
    title=resource[8]
    datetime=resource[9]
    datetime1=resource[10]
    text=resource[11]
    text1=resource[12]
    link_container_array=content_rule.split(',')
    main_block_array=main_block.split(',')
    main_block1_array=main_block1.split(',')
    page_link_array=page_link.split(',')
    title_array=title.split(',')
    datetime=datetime.split(',')
    datetime1=datetime1.split(',')
    text=text.split(',')
    text1=text1.split(',')

    main(resource_allnews_link)

connection.close()

И при запуске скрипта выходит такая ошибка что переменная
link не присвоена.Хотя я в функции
get_links сделал
return.
Вот текст ошибки:

Traceback (most recent call last):
  File "C:/Users/Администратор/PycharmProjects/Task/sql_parser.py", line 64, in <module>
    main(resource_allnews_link)
  File "C:/Users/Администратор/PycharmProjects/Task/sql_parser.py", line 28, in main
    get_content(link)
NameError: name 'link' is not defined

Process finished with exit code 1

Вы просто возвращаете значение, а не выводите переменную.
Т.е. ваша запись равносильна

>>> a = 1
>>> a
1

Самое простое что тут можно сделать - присваивать возвращаемые значения переменным.

def main(resource_allnews_link):
    link = get_links(get_html(resource_allnews_link))
    get_content(link)


Как применить к массиву inverse_transform?
Имею:

train_x = df_train[cols]
test_x = df_test[cols]
train_y = df_train['SalePrice']

saleprice_scaled = StandardScaler().fit_transform(train_y[:,np.newaxis]);

pred_model.fit(train_x, saleprice_scaled)

predicted_prices = pred_model.predict(test_x)

Получаю массив:

array([-0.63068705, -0.46680173,  0.09475258, ..., -0.31903422,
       -0.91872981,  0.66107928])

Как применить к нему
inverse_transform?

saleprice_scaled_reversed = StandardScaler().inverse_transform(predicted_prices)

Даёт ошибку:

NotFittedError: This StandardScaler instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.

Во-первых нет смысла скалировать / нормализовать искомый(ые) переменные. Калибровать нужно «входные» признаки - X. Предсказываемые столбцы (Y) - калибровать бессмысленно.
Во-вторых, для того чтобы иметь возможность сделать обратное преобразование нужно сохранить объект
StandardScaler() после обучения (
.fit() или
.fit_transform()) - в вашем коде он теряется после вызова
.fit_transform().
Сохранить объект можно так:

scaler = StandardScaler()
saleprice_scaled = scaler.fit_transform(train_y[:,np.newaxis])
...
saleprice_scaled_reversed = scaler.inverse_transform(predicted_prices)

PS но лучше не скалировать искомый
Y вообще.


Замена NaN во фрейме
Есть все тот же фрейм:
Проблема в невозможности создания предсказания, из-за неверного формата данных/наличия Nan во фрейме.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from scipy.stats import norm
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor as rfr
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline

df_train = pd.read_csv('D:\TITAN\Kaggle\House prices/train.csv')
df_test = pd.read_csv('D:\TITAN\Kaggle\House prices/test.csv')

cols = ['LotArea','OverallQual','YearBuilt','TotalBsmtSF','GrLivArea','FullBath','GarageArea', 'TotRmsAbvGrd', 'Fireplaces']

train_x = df_train[cols]
test_x = df_test[cols]
train_y = df_train['SalePrice']

train_x.fillna(0)

test_x.fillna(0)

pred_model = rfr()
pred_model.fit(train_x, train_y)

predicted_prices = pred_model.predict(test_x)

ValueError: Input contains NaN, infinity or a value too large for dtype('float32').

test_x = test_x.astype(int)

ValueError: Cannot convert non-finite values (NA or inf) to integer
Если я правильно понимаю, Nan могут ,быть как текст и не как текст. Как это найти/определить/заменить ?

По умолчанию, метод DataFrame.fillna() возвращает измененный/заполненный DataFrame, но не изменяет оригинальный DataFrame. Поэтому надо делать либо так:

train_x = train_x.fillna(0)
test_x = test_x.fillna(0)

либо так:

train_x.fillna(0, inplace=True)
test_x.fillna(0, inplace=True)


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

class MyClass(QObject):
    def method1(self):
        for i in round(1, 1000000):
            pass

    def method2(self):
        for i in round(1, 1000000):
            pass

class GuiClass(QtWidgets.QMainWindow):
    def __init__(self):
        mc = MyClass()

    def start(self):
        """вызвать self.mc.method1 и self.mc.method2 в разных потоках"""
        """оба метода одного экземпляра"""

Вызов метода
start() должен запустить методы
method1() и
method2() одного экземпляра в разных потоках.

P.S.
Раскидать методы
method1() и
method2() по разным классам не подходит для меня.

import threading
class MyClass(QObject):
    def method1(self):
        for i in range(1, 1000000):
            pass

    def method2(self):
        for i in range(1, 1000000):
            pass

class GuiClass(QtWidgets.QMainWindow):
    def __init__(self):
        self.mc = MyClass()
    def start(self):
        threading._start_new_thread(self.mc.method1,())
        threading._start_new_thread(self.mc.method2,())

Попробуйте как-то так.
И, сдаётся мне, Вы
range с
round перепутали, ибо Ваша запись с
round не имеет логического смысла. Она запускает цикл, повторяемый один раз. Скажу даже больше: я проверил, оно просто не запустится.
Также хочу заметить, что, т.к. в Вашем вопросе была поставлена задача только запустить выполнение методов в разных потоках, я не заботился об ожидании завершения их работы.


Число сочетаний (с из n по k) есть ли быстрый алгоритм? Python
Число сочетаний можно найти используя рекурсию и, соответственно, рекуррентное соотношение. Код получается вот такой:
<code>
def C(n, k):
    if k == n or k == 0:
        return 1
    if k != 1:
        return C(n-1, k) + C(n-1, k-1)
    else:
        return n

print(C(int(input()), int(input())))
</code>
Но я знаю, что рекурсия штука не быстрая и не всегда надежная. Есть ли другие алгоритмы и на сколько они быстрые?

Через факториал медленно и не эффективно.
В формуле
n! / (k! (n - k)!), если сократить, то получится
(n-k+1)(n-k+2)..n/k!
Получается такой код:

def С(n, k):
    if 0 <= k <= n:
        nn = 1
        kk = 1
        for t in xrange(1, min(k, n - k) + 1):
            nn *= n
            kk *= t
            n -= 1
        return nn // kk
    else:
        return 0

Также можно посмотреть библиотеку
itertools:

combinations('ABCD', 2)  # AB AC AD BC BD CD


Задача питон Декоратор
Задали в универе задачу по Декораторам в питоне
Суть такова:
Имеется функция, которая вычисляет некоторое значение и возвращает его в качестве результата работы. Функция вычисляется достаточно долго, ничего не выводит на экран, не пишет в файлы и зависит только от переданных аргументов.
Реализуйте декоратор, который «ускорит» вычисления этой функции. Для каждого набора параметров необходимо запоминать результат выполнения функции и возвращать его, если снова передали такой набор параметров.
Вроде я придумал алгоритм который "ускорит" функцию, но не могу понять как это функцию запихнуть в декоратор.
Вот вариант без функции и декораторов
<code>
d={}
i = 0
while i<5:
   value=int(input("Введите первое число: "))
   value2=int(input("Введите второе число: "))
   c = [value,value2]
   key=value+value2
   if key in d.keys():
      d[key] = c
      print("Такое ключ уже есть в списке:",*d.keys())
   else:
      d[key] = c
      print("Добавили новое значение")
   i=i+1
</code>
Помогите пожалуйста создать функцию и запихнуть все в декоратор

Имеется функция, которая вычисляет некоторое значение и возвращает его
  в качестве результата работы

Пусть это будет возведение в степень:

def func(a, b):
    return a ** b

Теперь сделаем декоратор, который будет помнить (кеширование) аргументы и результат вызова, и перед вызовом подконтрольной функции проверит свой кеш перед тем как вызывать функцию:

def memoize_func(f):
    memo = dict()

    def func(*args):
        print(f'Run with args={args}, memo={memo}')
        if args not in memo:
            memo[args] = f(*args)
        return memo[args]

    return func

Чтобы функция работала с декоратором его нужно написать перед функцией как
@<decorator>:

@memoize_func
def func(a, b):
    print(f'    Run func({a}, {b})')
    return a ** b

Теперь посмотрим как работает:

print(func(3, 5), '\n')
print(func(3, 4), '\n')
print(func(3, 2), '\n')
print(func(3, 5), '\n')
print(func(3, 4), '\n')
print(func(3, 5), '\n')

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

Run with args=(3, 5), memo={}
    Run func(3, 5)
243

Run with args=(3, 4), memo={(3, 5): 243}
    Run func(3, 4)
81

Run with args=(3, 2), memo={(3, 5): 243, (3, 4): 81}
    Run func(3, 2)
9

Run with args=(3, 5), memo={(3, 5): 243, (3, 4): 81, (3, 2): 9}
243

Run with args=(3, 4), memo={(3, 5): 243, (3, 4): 81, (3, 2): 9}
81

Run with args=(3, 5), memo={(3, 5): 243, (3, 4): 81, (3, 2): 9}
243


объединение строк в Pandas

          Win_Status Reference_Name
Match
957116906     Winner           Agni
957116906     Winner       Poseidon
957116906     Winner         Olorun
957116906     Winner        Guan Yu
957116906     Winner           Nike
957116906      Loser         Awilix
957116906      Loser          Cupid
957116906      Loser          Hades
957116906      Loser           Zeus
957116906      Loser      Xing Tian
957116922     Winner        Nemesis
957116922     Winner           Hera
957116922     Winner         Apollo
957116922     Winner      Aphrodite
957116922     Winner       Hercules
957116922      Loser          Chaac
957116922      Loser           Zeus
957116922      Loser       Hun Batz
957116922      Loser           Rama
957116922      Loser        Bacchus
957116921     Winner           Hera
957116921     Winner        Nemesis
957116921     Winner    King Arthur
957116921     Winner           Ymir
957116921     Winner      Cernunnos
957116921      Loser         Olorun
957116921      Loser         Fenrir
957116921      Loser         Anubis
957116921      Loser          Horus
957116921      Loser       Achilles
957116911     Winner       Cabrakan
957116911     Winner          Nu Wa
957116911     Winner          Skadi
957116911     Winner        Izanami
957116911     Winner      Ratatoskr
957116911      Loser         Apollo
957116911      Loser        Arachne
957116911      Loser         Scylla
957116911      Loser          Horus
957116911      Loser         Merlin
957116913     Winner    Erlang Shen
957116913     Winner         Vulcan
957116913     Winner           Ymir
957116913     Winner        Chronos
957116913     Winner    King Arthur
957116913      Loser       Poseidon
957116913      Loser           Odin
957116913      Loser          Neith
957116913      Loser        Bacchus
957116913      Loser           Ares
957116928     Winner          Freya
957116928     Winner       Camazotz
957116928     Winner          Horus
957116928     Winner    Erlang Shen
957116928     Winner      Xing Tian
957116928      Loser          He Bo
957116928      Loser         Raijin
957116928      Loser       Cabrakan
957116928      Loser          Anhur
957116928      Loser       Hercules
957116906     Winner           Agni
957116906     Winner       Poseidon
957116906     Winner         Olorun
957116906     Winner        Guan Yu
957116906     Winner           Nike
957116906      Loser         Awilix
957116906      Loser          Cupid
957116906      Loser          Hades
957116906      Loser           Zeus
957116906      Loser      Xing Tian
957116916     Winner        Izanami
957116916     Winner        Arachne
957116916     Winner      Amaterasu
957116916     Winner        Kuzenbo
957116916     Winner         Scylla
957116916      Loser         Khepri
957116916      Loser           Pele
957116916      Loser          Thoth
957116916      Loser           Isis
957116916      Loser             Ra
957116907     Winner           Hera
957116907     Winner        Mercury
957116907     Winner           Pele
957116907     Winner          Chaac
957116907     Winner   Ah Muzen Cab
957116907      Loser           Ymir
957116907      Loser         Merlin
957116907      Loser       Kukulkan
957116907      Loser        Bellona
957116907      Loser          Skadi
957116918     Winner       Hun Batz
957116918     Winner    King Arthur
957116918     Winner      Zhong Kui
957116918     Winner        Izanami
957116918     Winner           Ymir
957116918      Loser       Cerberus
957116918      Loser        Bellona
957116918      Loser    King Arthur
957116918      Loser          Janus
957116918      Loser          Neith

Есть CSV(30.тыс строк) файл с 10 одинаковыми индексами Match, подскажите как их можно объединить в одну строку?
Получиться должно что-то вроде

Match     Winner1 Winner2  ... Loser1  Loser2
957116906 Agni    Poseidon ... Awilix  Cupid
957116922 Nemesis Hera     ... Chaac   Zeus

Добавил количество входных данных т.к для индексов Match разных более 6(т.е row боле 60) появляются значения Nan в таблице и количество колонок становиться в 2 раза больше. Loser6-10 и Winner6-10( они заполнены NaN)

Win_Status    Loser1    Loser10   Loser2       Loser3   Loser4     Loser5  Loser6 Loser7 Loser8 Loser9      Winner1 Winner10      Winner2      Winner3      Winner4       Winner5 Winner6   Winner7 Winner8  Winner9
Match
957116906     Awilix  Xing Tian    Cupid        Hades     Zeus  Xing Tian  Awilix  Cupid  Hades   Zeus         Agni     Nike     Poseidon       Olorun      Guan Yu          Nike    Agni  Poseidon  Olorun  Guan Yu
957116907       Ymir        NaN   Merlin     Kukulkan  Bellona      Skadi     NaN    NaN    NaN    NaN         Hera      NaN      Mercury         Pele        Chaac  Ah Muzen Cab     NaN       NaN     NaN      NaN
957116911     Apollo        NaN  Arachne       Scylla    Horus     Merlin     NaN    NaN    NaN    NaN     Cabrakan      NaN        Nu Wa        Skadi      Izanami     Ratatoskr     NaN       NaN     NaN      NaN
957116913   Poseidon        NaN     Odin        Neith  Bacchus       Ares     NaN    NaN    NaN    NaN  Erlang Shen      NaN       Vulcan         Ymir      Chronos   King Arthur     NaN       NaN     NaN      NaN
957116916     Khepri        NaN     Pele        Thoth     Isis         Ra     NaN    NaN    NaN    NaN      Izanami      NaN      Arachne    Amaterasu      Kuzenbo        Scylla     NaN       NaN     NaN      NaN
957116918   Cerberus        NaN  Bellona  King Arthur    Janus      Neith     NaN    NaN    NaN    NaN     Hun Batz      NaN  King Arthur    Zhong Kui      Izanami          Ymir     NaN       NaN     NaN      NaN
957116921     Olorun        NaN   Fenrir       Anubis    Horus   Achilles     NaN    NaN    NaN    NaN         Hera      NaN      Nemesis  King Arthur         Ymir     Cernunnos     NaN       NaN     NaN      NaN
957116922      Chaac        NaN     Zeus     Hun Batz     Rama    Bacchus     NaN    NaN    NaN    NaN      Nemesis      NaN         Hera       Apollo    Aphrodite      Hercules     NaN       NaN     NaN      NaN
957116928      He Bo        NaN   Raijin     Cabrakan    Anhur   Hercules     NaN    NaN    NaN    NaN        Freya      NaN     Camazotz        Horus  Erlang Shen     Xing Tian     NaN       NaN     NaN      NaN

Надо так:

In [30]: res = (df
                .assign(Win_Status=df["Win_Status"]
                                   +(df.groupby(["Match", "Win_Status"]).cumcount()+1).astype(str))
                .pivot_table(index="Match", columns="Win_Status",
                             values="Reference_Name", aggfunc="first"))

In [31]: res
Out[31]:
Win_Status  Loser1 Loser2    Loser3 Loser4     Loser5  Winner1   Winner2 Winner3    Winner4   Winner5
Match
957116906   Awilix  Cupid     Hades   Zeus  Xing Tian     Agni  Poseidon  Olorun    Guan Yu      Nike
957116922    Chaac   Zeus  Hun Batz   Rama    Bacchus  Nemesis      Hera  Apollo  Aphrodite  Hercules


Проблемы с запросами
Есть 2 запроса,их необходимо сравнить.
1:
<code>
    {"success":true,"hash":"2707772634/kxuw2oFFFf8","offer":{"partner":"877050581","token":"LE5HuwZk","tradeoffermessage":"32Z6 ... /trade/2707772634/kxuw2oFFFf8/","items":[{"appid":730,"contextid":2,"assetid":"16409501459","amount":1}]}}

2 Очень большой:{"response":{"trade_offers_sent":[{"tradeofferid":"3669793079","accountid_other":922836416,"message":"E9V8 ... /trade/2707784514/u2FjLxt1vNU/","expiration_time":1567092461,"trade_offer_state":9,"items_to_give":[{"appid":730,"contextid":"2","assetid":"16409431301","classid":"1560432824","instanceid":"188530139","amount":"1","missing":false,"est_usd":"35"}],"is_our_offer":true,"time_created":1565882861,"time_updated":1565882861,"from_real_time_trade":false,"escrow_end_date":0,"confirmation_method":2}
</code>
необходимо сравнить в 1 tradeoffermessage,во 2 message

Например можно прописать цепочку ключей. d1 это первый, d2 это второй. [0] в d2 это обращение к элементу списка.
<code>
d1["offer"]["tradeoffermessage"]==d2["response"]["trade_offers_sent"][0]["message"])
</code>


Насколько эффективен мой метод решения?
И вновь всех приветствую. Решил очередную задачу на контесте способом, который показался мне интересным. Т.к. я новичок, еще не совсем понимаю как определять О(n), поэтому прошу помощи в этом вопросе.
Собственно, вот сама задача:

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

И мое решение:
<code>
n = int(input())
summ = 0
r = [[0] * 3 for i in range(3)]
for i in range(n):
    s = int(input())
    r[i % 3][s % 3] += 1
print((r[0][0] * (r[0][0] - 1) + r[1][0] * (r[1][0] - 1) + r[2][0] * (r[2][0] - 1))//2 + r[0][1] * r[0][2] + r[1][1] * r[1][2] + r[2][1] * r[2][2])
</code>
Проверку на контесте прошла, результат - задача решена верно.

Решение отличное, сложность линейная от размера ввода
В цикле выполняется k*n операций, где k - константа, так что его сложность O(n)
Начальные строчки выполняются за константное время O(1), финальная тоже, итого
<code>
O(n + 1 + 1) = O(n)
</code>


Временный цикл в python [закрыт]

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

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

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

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

У меня есть папка, которая добавляется в результаты работы программы на диск C:/
Мне необходимо ввести цикл, чтобы наличие данной папки проверялось в течение минуты каждые 10 секунд, и, в случае, если папка была создана - цикл завершался.
Как написать данный цикл?
Понимаю, что делать нужно через 'while', но в силу того, что Python мною не изучался - не знаю как это сделать.

Можно, например, так:
<code>
# -*- coding: utf-8 -*-

import os, time

start_time = time.time()
path_to_folder = 'folder/'

while True:
    if os.path.isdir(path_to_folder):
        print "Folder found!"
        break

    if time.time()-start_time >= 60:
        print "60 seconds expired, folder not found!"
        break

    time.sleep(10)
</code>


Возможно ли удалить сообщение пользователя в беседе для всех, с помощью чат-бота в ВК
Вопрос. Возможно ли как-то удалить сообщения пользователя в беседе, чтобы удалилось у всех. С помощью чат-бота. На модуле
vk_api,
longpoll.

Сообщение пользователя/сообщества от имени которого пишет бот, отправленное в течение последних 24 часов - да, можно. Просто вызываете штатный метод messages.delete с параметром delete_for_all=1:
<code>
vk.messages.delete(message_ids='123,456', delete_for_all=1)
</code>
Сообщение какого-то другого пользователя - нет, т.к. ни API, ни интерфейс VK этого не позволяют.


не совпадала версия pip и python. Нужно было написать
pip3 install --user schedule.


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

from dateutil.relativedelta import relativedelta
    if df['Дата продажи'] is not None and df['Дата рождения'] is not None:
        df['Возраст'] = relativedelta(df['Дата продажи'], df['Дата рождения']).years else:
        df['Возраст'] = 10000

Выдаёт ошибку:

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

Посоветуйте вариант решения?

Используй
pandas.DataFrame.apply для построчных операций. Пример: парсим
DataFrame из текста, для обоих столбцов (
dob и
buy) конвертируем данные из текста в дату:

import io
import pandas as pd
from dateutil.relativedelta import relativedelta

raw = '''dob  buy
18.03.1971    01.01.2019
08.12.1952    31.03.2018
09.01.1999    30.10.2010
16.08.1992    05.05.2019
13.03.1987    09.09.2018
None          None
None          01.01.2019
01.01.2019    None'''

df = pd.read_csv(io.StringIO(raw), sep='\s{2,}')
df['buy'] = pd.to_datetime(df['buy'], format='%d.%m.%Y', errors='coerce')
df['dob'] = pd.to_datetime(df['dob'], format='%d.%m.%Y', errors='coerce')

Теперь создаем новый столбец
age, содержащий разницу между
buy и
dob:

def age(row):
    dob = row['dob']
    buy = row['buy']
    if pd.isnull(dob) or pd.isnull(buy):
        return 10000
    return relativedelta(buy, dob).years

df['age'] = df.apply(age, axis=1)

Новый датафрейм:

         dob        buy    age
0 1971-03-18 2019-01-01     47
1 1952-12-08 2018-03-31     65
2 1999-01-09 2010-10-30     11
3 1992-08-16 2019-05-05     26
4 1987-03-13 2018-09-09     31
5        NaT        NaT  10000
6        NaT 2019-01-01  10000
7 2019-01-01        NaT  10000


Логические операторы Python
Что значит эта запись?

if a == b and c:
    #do something

Это значит если
a равно
b и равно
с, то сделать что-то?
Или если
a равно
b и выполняется условие
c, то сделать что-то?
И можно ли писать иначе? Например, так:

if a == b and a == c or a == d:
    #do something

if a == b and c: означает, что
a равно
b и
c правда. А само выражение, по сути, разворачивается в
if a == b and bool(c):.
Метод bool очень умный и возвращает
True или
False для любых объектов.
Например:

print(bool(1))         # True
print(bool(123))       # True
print(bool(""))        # False
print(bool("abc"))     # True
print(bool([]))        # False
print(bool([1, 2, 3])) # True
print(bool(0))         # False
print(bool(None))      # False
...

Т.е. если объект условно пустой, то
False, иначе
True
Чтобы эта магия работала у объектов должен быть переопределен магический метод
def __bool__(self):, пример:

class Foo:
    def __init__(self, bool_val=True):
        self.bool_val = bool_val

    def __bool__(self):
        print('bool_val:', self.bool_val)
        return self.bool_val

c = Foo(bool_val=True)
bool(c)     # bool_val: True

c = Foo(bool_val=True)
if c: pass  # bool_val: True

c = Foo(bool_val=False)
if c: pass  # bool_val: False

Как видно в
bool(...) или в
if ... будет вызван
__bool__ и по нему определится можно ли считать, что объект
True или
False

if a == b and a == c or a == d: тут порядок выстроен по приоритетам (от большего к меньшему):
NOT,
AND,
OR. Т.е. сначала идет
and, потом
or, а если бы у вас был
if ... not c, то сначала
not т.е. инвертирование.
Добавлю скобки, чтобы было нагляднее:

if (a == b and a == c) or a == d:

Кст, если
a == b and a == c вернут
True, то проверки
... or a == d не будет (т.е. при
or если одна часть
True, то без разницы, что в другой -- все-равно будет
True):

def a(): print('a'); return True
def b(): print('b'); return True
def c(): print('c'); return True
def d(): print('d'); return True

if a() == b() and a() == c() or a() == d():
    pass

Выведет:

a
b
a
c


Как мне вывести числа?
Есть много реквизитов в тексте.
Например: А15632, А14752, А12345...
Мне надо вырезать каждую отдельно:

parsed_req = 'А15632RT, А14752RT, А12345RT...'
requisites = re.findall(r'>\d{5}', parsed_req)

вот так дает результат:
А15632 A14752 итд
пишу так а он не работает:

parsed_req = 'А15632RT, А14752RT, А12345RT...'
requisites = re.findall(r'>\d{5}', parsed_req)
requisites2 = re.sub(r'A','',requisites)

пишу на python 3.6

import re

parsed_req = 'А15632RT, А14752RT, А12345RT...'

Просто выцепляем 5 подряд идущих цифр:

requisites = re.findall(r'\d{5}', parsed_req)
print(requisites)  # ['15632', '14752', '12345']

С указанием специализированного шаблона поиска цифр:

requisites = re.findall(r'А(\d{5})RT', parsed_req)
print(requisites)  # ['15632', '14752', '12345']

PS.
У вас в примерах с
А символ русский, что странно при наличии латинских
RT


Каково назначение оператора with в python?

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

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

with open('a.file', 'a') as g
....

Здесь само открытие файла указано в явном виде. Однако, python, позволяет пользователю самому менять поведение контекстного менеджера, определив его в методах
__enter__() и
__exit__() пользовательского класса.
Например, так, как описано у Кнуппа:

class File():

    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        self.open_file = open(self.filename, self.mode)
        return self.open_file

    def __exit__(self, *args):
        self.open_file.close()

files = []
for _ in range(10000):
    with File('foo.txt', 'w') as infile:
        infile.write('foo')
        files.append(infile)

То есть, здесь контекст менеджер сам обрабатыват открытие файла и возвращает его дескриптор непосредственно в тело
with.


Как оптимизировать код по угадыванию чисел?
Пользователь вводит числа до тех пор, пока не угадает число из списка
myList. Есть ли возможность оптимизировать код и (или) уменьшить количество строк кода?

myList = [1, 2, 3]
while True:
    exit = 0
    num = int(input('Enter: '))
    if num in myList:
        exit = 1
    if exit == 1:
        break

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

while int(input('Enter: ')) not in [1, 2, 3]:
    pass

А если список большой и состоит полностью из последовательных целых чисел, можно заменить его на
range(1, 4)
PS: учтите, что оптимизация производительности кода != уменьшению числа строк кода. И помимо этих двух качеств программы также важна наглядность, которая нередко идёт вразрез с лаконичностью кода. Если тема интересна, советую почитать "Совершенный Код" Стива Макконнелла или подобную литературу.


Использование символа "_" в качестве промежуточной переменной для цикла
У меня появился вопрос почему некоторые разрабы на python, используют этот символ в качестве промежуточной переменной в цикле:
<code>
for _ in items:
    print(_)
</code>
может это традиционно как то в python так писать?

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

for _ in range(5):
    print("Hohoho!")

Еще в переменной
_ хранится значение последнего выражения в интерпретаторе:

>>> 3*2
6
>>> _
6
>>>


Группировка и выборка данных в Pandas
Имеется Excel таблица следующего вида:

группа  запрос      .....   длстр

0       1 2 3 4 5 6           63
0       1 2 3 4 5             55
0       1 2 3 4 5 6           55
0       1 2 3 4               46
0       1 2 3 4               45
0       1 2 3 4               45
1       1 2 3 4 5 6           80
..

Имеются некоторая группа (в примере это группа - 0)

Среди группы необходимо получить только одну строку.
Условие выборки:
Если количество слов в столбце запрос = 5 выбираем, иначе
Если количество слов в столбце запрос = 6 выбираем, иначе если количество слов в столбце запрос равен 4 выбираем

Дополнительно, если встречаются несколько 5, 6 или 4, то нужно выбрать ту строчку, где значение в столбце длст ("G" в Excel) больше

В нашем случае выходная строчка, это

 группа  запрос      .....   длстр
    0    1 2 3 4 5             55

Кон

группа;Запрос;Позиция;Базовая частотность;Очень точная частотность;Количество слов;длстр
1;основные принципы демократического избирательного права таблица;47;12;12;6;63
1;основные принципы демократического избирательного права;39;148;14;5;55
1;порядок подачи жалобы на административное постановление;48;81;3;6;55
1;принципы демократического избирательного права;43;569;92;4;46
1;демократические принципы избирательного права;43;569;19;4;45
1;принцип демократического избирательного права;28;569;10;4;45
1;основные принципы избирательного права;45;745;111;4;38
1;принцип гласности избирательного права;50;21;1;4;38
1;принцип прямого избирательного права;50;368;56;4;36
1;принципы избирательного права это;49;285;44;4;33
1;принципы избирательного права;49;8504;1403;3;29
1;принцип избирательного права;38;8585;96;3;28
2;истечение срока давности уголовного преследования;40;553;28;5;49
2;срок давности по уголовным делам средней тяжести;48;46;15;7;48
2;срок исковой давности по уголовным преступлениям;42;30;12;6;48
2;как исчисляется срок давности по уголовным делам;10;19;15;7;48
2;когда истекает срок давности по уголовному делу;46;119;6;7;47
2;как считается срок давности по уголовным делам;6;9;1;7;46
2;срок давности для возбуждения уголовного дела;33;44;4;6;45
2;когда истекает срок давности уголовного дела;32;214;1;6;44
2;исчисление срока давности по уголовным делам;28;12;4;6;44
2;срок давности расследования уголовного дела;5;24;3;5;43
2;факт уголовного преследования срок хранения;35;19;3;5;43
2;что такое срок давности по уголовным делам;17;76;21;7;42
2;какие преступления не имеют срока давности;37;72;21;6;42
2;срок исковой давности в уголовном процессе;52;15;3;6;42
2;сроки исковой давности по уголовным делам;34;543;14;6;41
2;срок давности возбуждения уголовного дела;50;509;7;5;41
2;какой срок давности у тяжких преступлений;47;1;1;6;41
2;истечение срока давности уголовного дела;46;1536;17;5;40
2;срок давности по уголовным преступлениям;50;731;121;5;40
2;срок исковой давности по уголовным делам;36;556;171;6;40
2;срок исковой давности по уголовному делу;31;543;24;6;40
2;с какого момента начинается преступление;26;340;1;5;40
2;есть ли срок давности по уголовным делам;24;289;8;7;40
2;сколько срок давности по уголовным делам;32;52;9;6;40
2;сроки давности уголовного преследования;50;1063;49;4;39
2;какие сроки давности по уголовным делам;24;192;3;6;39
2;прошел срок давности по уголовным делам;28;40;4;6;39
2;какой срок давности по уголовным делам;28;187;12;6;38
2;преступления не имеющие срока давности;47;164;12;5;38
2;сроки преследования по уголовным делам;35;70;2;5;38
2;срок давности преступления сколько лет;49;43;2;5;38
2;срок исковой давности уголовного дела;34;711;18;5;37
2;срок преследования по уголовному делу;48;70;5;5;37
2;какой срок давности у уголовного дела;22;60;5;6;37
2;истечение срока давности преступления;49;11;11;4;37
2;какие статьи не имеют срока давности;39;16;2;6;36
2;исковая давность по уголовным делам;28;630;21;5;35
2;когда истекает срок уголовного дела;27;407;6;5;35
2;какой срок уголовного преследования;50;76;1;4;35
2;какой срок давности у уголовных дел;22;56;27;6;35
2;срок исковой давности по уголовным;37;586;2;5;34
2;срок давности в уголовном процессе;38;65;2;5;34
2;сроки давности по уголовным делам;47;5885;468;5;33
2;сроки давности по уголовному делу;43;5773;19;5;33
2;по каким делам нет срока давности;51;18;1;6;33
2;срок давности по уголовным делам;48;5885;1778;5;32
2;срок давности по уголовному делу;43;5773;41;5;32
2;какой срок давности преступления;51;501;4;4;32
2;какие статьи имеют срок давности;24;22;2;5;32
2;давность лет по уголовным делам;18;118;6;5;31
2;срок истечения уголовного дела;34;2030;7;4;30
2;сроки уголовного преследования;32;1519;36;3;30
2;срок действия уголовной статьи;54;22;1;4;30
2;срок давности уголовного дела;29;8239;86;4;29
2;срок уголовного преследования;39;1519;27;3;29
2;срок действия уголовного дела;23;357;5;4;29
2;срок годности уголовного дела;32;41;7;4;29
2;срок давности уголовных дел;23;8056;24;4;27
2;сроки давности по уголовным;45;7877;30;4;27
2;сроки давности преступлений;50;7309;61;3;27
2;давность по уголовным делам;28;6019;5;4;27
2;срок действия уголовных дел;30;357;2;4;27
2;срок давности по уголовным;39;7877;39;4;26
2;срок давности преступление;49;7456;5;3;26
2;срок действия преступлений;30;224;3;3;26
2;срок действия преступления;36;222;10;3;26
2;срок годности преступления;39;16;16;3;26
2;давность уголовного дела;25;8321;2;3;24
2;срок давности дела;49;17016;6;3;18
20;как сделать лицензию на такси самому;34;33;6;6;36
22;уголовный кодекс об оскорблении личности человка;43;5;2;6;40
22;моральное оскорбление личности статья;37;44;6;4;37
26;образец жалобы на неправильно поставленный диагноз врача;33;1;1;7;56
26;врачи поставили неправильный диагноз куда жаловаться;17;36;4;6;52
26;если поставили неправильный диагноз куда жаловаться;12;57;4;6;51
26;врачи неправильно поставили диагноз куда обращаться;22;12;1;6;51
26;кому жаловаться на неправильно поставленный диагноз;17;3;1;6;51
26;если врач поставил неправильный диагноз что делать;44;51;19;7;50
26;врач поставил неправильный диагноз куда жаловаться;11;36;12;6;50
26;жалоба на неправильно поставленный диагноз образец;27;1;1;6;50
26;поставили неправильный диагноз куда жаловаться;7;57;3;5;46
26;куда жаловаться на неправильный диагноз врача;5;3;1;6;45
26;жалоба на неправильно поставленный диагноз;16;18;1;5;42
26;поставили неправильный диагноз что делать;50;96;2;5;41
26;если врач назначил неправильное лечение;37;42;7;5;39
26;куда жаловаться на неправильный диагноз;11;8;1;5;39
26;если врач неправильно поставил диагноз;51;407;4;5;38
26;неправильный диагноз врачей что делать;44;82;7;5;38
26;неправильный диагноз куда обращаться;24;71;1;4;36
26;жалоба на врача неправильный диагноз;9;31;1;5;36
26;если врач неверно поставил диагноз;46;84;3;5;34
26;врач написал неправильный диагноз;43;26;1;4;33
26;жалоба на неверный диагноз врача;9;9;4;5;32
26;если врач поставил неправильный;46;469;1;4;31
26;врач поставил ошибочный диагноз;49;114;1;4;31
26;жалобы на неправильный диагноз;21;71;1;4;30

Выходные данные (если сам не ошибся)

1 - 1;основные принципы демократического избирательного права;39;148;14;5;55
2 - 2;истечение срока давности уголовного преследования;40;553;28;5;49
20 - 20;как сделать лицензию на такси самому;34;33;6;6;36
22 - 22;уголовный кодекс об оскорблении личности человка;43;5;2;6;40
26 - 26;поставили неправильный диагноз куда жаловаться;7;57;3;5;46

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

def get_indices(d):
    ord_map = {5:100, 6:90, 4:80}
    tmp = d["Запрос"].str.split().str.len().map(ord_map).fillna(0).values
    # print(d.assign(x=tmp))
    return d.assign(x=tmp).nlargest(1, ["x", "длстр"]).index[0]

res = df.loc[df.groupby("группа").apply(get_indices)]

результат:

In [41]: res
Out[41]:
    группа                                             Запрос  Позиция  Базовая частотность  Очень точная частотность  Количество слов  длстр
1        1  основные принципы демократического избирательн...       39                  148                        14                5     55
12       2  истечение срока давности уголовного преследования       40                  553                        28                5     49
81      20               как сделать лицензию на такси самому       34                   33                         6                6     36
82      22   уголовный кодекс об оскорблении личности человка       43                    5                         2                6     40
92      26     поставили неправильный диагноз куда жаловаться        7                   57                         3                5     46


Как записать длинный bash-овский конвеер в python переменную?
Есть удобный bash-конвеер, который выдаёт в stdout нужную информацию. Как записать результат команды не на экран, а в переменную python?
Пробовал:

import subprocess

output = subprocess.check_output(['smartctl', '-a', '/dev/sda', '|', 'grep', 'Device Model', '|', 'tr', '-s', '" "', '|', 'cut', '-f3,4', '-d" "'])

В результате исключение:

Traceback (most recent call last):
  File "HDD.py", line 3, in <module>
    output = subprocess.check_output(['smartctl', '-a', '/dev/sda', '|', 'grep', 'Device Model', '|', 'tr', '-s', '" "', '|', 'cut', '-f3,4', '-d" "'])
  File "/usr/lib/python2.7/subprocess.py", line 223, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['smartctl', '-a', '/dev/sda', '|', 'grep', 'Device Model', '|', 'tr', '-s', '" "', '|', 'cut', '-f3,4', '-d" "']' returned non-zero exit status 1

Также пробовал для упрощения:

import subprocess
process = subprocess.Popen("smartctl -a /dev/sda | grep Model".split(), stdout=subprocess.PIPE)
output, error = process.communicate()
print(output)

Тут уже проблема в другом: думает, что это всё аргументы для команды smartctl...:

ERROR: smartctl takes ONE device name as the final command-line argument.
You have provided 4 device names:
/dev/sda
|
grep
Model

Use smartctl -h to get a usage summary

Подскажите, как это правильно сделать?
Сам скрипт bash, как вы могли догадаться:

smartctl -a /dev/sda | grep Device\ Model | tr -s " " | cut -f3,4 -d' '

Если нужно вызывать баш-портянку с пайпами и без
shell=True, разбей команду на отдельные
Popenы с редиректом вывода в
subprocess.PIPE. Пример:

smartctl = subprocess.Popen(['smartctl', '-a', '/dev/sda'], stdout=subprocess.PIPE)
grep = subprocess.Popen(['grep', 'Device Model'], stdout=subprocess.PIPE, stdin=smartctl.stdout)
tr = subprocess.Popen(['tr', '-s', ' '], stdout=subprocess.PIPE, stdin=grep.stdout)
cut = subprocess.check_output(['cut', '-f3,4', '-d', ' '], stdin=tr.stdout)

'-d" "' - это два отдельных аргумента и их необходимо разбить на
'-d', ' '
Не особо страшно, но эскейпить пробел как в командной строке необязательно:

['tr', '-s', ' ']

справится не хуже, чем

['tr', '-s', '" "']

а читается легче.
Для полноты картины - можно, конечно, использовать
shell=True (команда спавнится в отдельной оболочке, а-ля
sh -c 'ls -l', тогда можно передать команду прямым текстом:

process = subprocess.Popen("smartctl -a /dev/sda | grep Model", stdout=subprocess.PIPE, shell=True)

Но!
shell=True может быть капитальной дыркой в безопасности. Подробнее и пример в документации.


Python TelegramBot функции
Подскажите почему не отрабатывает 3 функция?Если убираю вторую то работает.Я наверно неправильно понимаю как работают функции в пайтон...Скиньте плс ссылку на хорошие доки)
<code>
import telebot

bot = telebot.TeleBot('ZZZZZZZZZZZZZZ')

keyboard1 = telebot.types.ReplyKeyboardMarkup()
keyboard1.row('Купить','Пожаловаться','Обменять','Нужна помощь')

@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Привет, ты написал мне /start', reply_markup=keyboard1)

@bot.message_handler(content_types=['text'])
def send_text(message):
    greeting = ['привет' , "hi" , "hello" , "здрасте" , "здравствуйте"]
    if message.text.lower() in greeting:
        bot.send_message(message.chat.id, message.text,reply_markup=keyboard1)
    elif message.text.lower() == 'пока':
        bot.send_message(message.chat.id, 'Прощай, создатель')

@bot.message_handler(content_types=['text'])
def send_text1(message):
    greeting1 = ['пожаловаться','обменять']
    if message.text.lower() in greeting1:
        bot.send_sticker(message.chat.id, 'CAADAgADpAEAAo5EEQItOULSZGLxYxYE')
    elif message.text.lower() == 'пока':
        bot.send_message(message.chat.id, 'Прощай, создатель')

bot.polling()
</code>

Доки
Второй декоратор обрабатывает все сообщения типа text, соответственно третьему декоратору ничего не остается и он игнорируется.
Ваша логика должна разделяться внутри одного декоратора:
<code>
@bot.message_handler(content_types=['text'])
        def send_text(message):
            greeting = ['привет' , "hi" , "hello" , "здрасте" , "здравствуйте"]
            greeting1 = ['пожаловаться','обменять']
            if message.text.lower() in greeting:
                bot.send_message(message.chat.id, message.text,reply_markup=keyboard1)
            elif message.text.lower() in greeting1:
                bot.send_sticker(message.chat.id, 'CAADAgADpAEAAo5EEQItOULSZGLxYxYE')
            elif message.text.lower() == 'пока':
                bot.send_message(message.chat.id, 'Прощай, создатель')
</code>


Форматирование YAML с помощью Python
Не могу правильно отформатировать файл для записи его в формате YAML. Требуется писать файл такого вида:

---
dnaSize: 177
primer: GTACACTACATGTCCATAGCAGGCTTG
primerOffset: 15
stages:
- reducedNucleotide: "T"
  delays:
  - 1
  - 5
  - 350
  ...
- reducedNucleotide: "A"
  delays:
  - 1
  - 5
  - 350
  ...

Однако получается файл такого формата:

!!set
'---': null
dnaSize: 177
primer: GTACACTACATGTCCATAGCAGGCTTG
primerOffset: 15
stages:
  'reducedNucleotide: "T"':
   delays: &id001
   - 1
   - 5
   - 350
   ...
  'reducedNucleotide: "A"':
   delays: &id001
   - 1
   - 5
   - 350
   ...

Запись в файл производиться следующим образом:

arr = {'---'}
to_yaml = {
           'dnaSize': 177,
           'primer': 'GTACACTACATGTCCATAGCAGGCTTG',
           'primerOffset': 15,
           'stages': {
                      'reducedNucleotide: "T"': {
                                                 'delays': delays
                                                 },
                      'reducedNucleotide: "A"': {
                                                 'delays': delays
                                                 },
                      'reducedNucleotide: "C"': {
                                                 'delays': delays
                                                 },
                      'reducedNucleotide: "G"': {
                                                 'delays': delays
                                                 }
                      }
           }

with open('/home/gamma-dna/Experiments/data.yaml', 'w') as outfile:
    yaml.dump(arr, outfile)
    yaml.dump(to_yaml, outfile, default_flow_style=False)

где delays - список из int. Просмотрев пару мануалов так и не понял как записать в начало
--- без кавычек и как записать строчки
reducedNucleotide: "T" как надо.

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

to_yaml = {
           'dnaSize': 177,
           'primer': 'GTACACTACATGTCCATAGCAGGCTTG',
           'primerOffset': 15,
           'stages': [{'reducedNucleotide': "T", 'delays': delays},
                      {'reducedNucleotide': "A", 'delays': delays},
                      {'reducedNucleotide': "C", 'delays': delays},
                      {'reducedNucleotide': "G", 'delays': delays}]
}

class NoAliasDumper(yaml.Dumper):
    def ignore_aliases(self, data):
        return True

data = "---\n{}".format(yaml.dump(to_yaml, Dumper=NoAliasDumper))

with open('/home/gamma-dna/Experiments/data.yaml', 'w') as outfile:
     outfile.write(data)

результат:

In [32]: print(data)
---
dnaSize: 177
primer: GTACACTACATGTCCATAGCAGGCTTG
primerOffset: 15
stages:
- delays:
  - 1
  - 5
  - 350
  reducedNucleotide: T
- delays:
  - 1
  - 5
  - 350
  reducedNucleotide: A
- delays:
  - 1
  - 5
  - 350
  reducedNucleotide: C
- delays:
  - 1
  - 5
  - 350
  reducedNucleotide: G


Хранить python dict в .env файле
Мне надо хранить dict (словарь с ключами и значениями) в переменные окружения Linux через файл .env, проект на python 3.6 все работает через docker docker-compose, все скрытые переменные проекта высвечиваются нормально, кроме словаря которого я прописал в .env файл LINES={'key': value1, 'key2': value2}, вместо этого я вижу LINES=38. Вопрос почему вместо значения ключа, стоит число 39?

.env файл является
shell скриптом, который должен содержать команды понятные интерпретатору
Shell. Если попытаться выполнить команду
LINES={'key': value1, 'key2': value2} в UNIX shell, то получим ошибку:

    sh-4.1$ LINES={'key': value1, 'key2': value2}
    sh: value1,: command not found

как вам уже написали в комментариях, LINES - встроенная переменная окружения, показывающая максимальное число строк в терминальном окне:

sh-4.1$ echo $LINES
40

хранить словарь можно в виде JSON строки. Пример:
задаем переменную окружения в виде JSON строки:

sh-4.1$ export DATA='{"key": 11, "key2": 12}'

содержимое Python скрипта:

import os
import json

data = json.loads(os.environ["DATA"])
print(data["key"], data["key2"])

проверка:

sh-4.1$ python a.py
11 12


Как использовать django модели в стороннем python приложении?
У меня задача рассылать уведомления пользователям. Решил это делать с помощью скрипта на python, чтобы это реализовать, мне нужно обращаться к бд моего сервера. Хотелось бы этого использовать существующий файл моделий django.
к примеру main/models.py:

class User(AbstractUser):
    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
    )
    first_name = models.CharField(_('first name'), max_length=30)
    email = models.EmailField(
        _('email'),
        unique=True,
        error_messages={
            'unique': _("Пользователь с такой почтой уже зарегистрирован.")
        },
        blank=True
    )

class Notification(models.Model):
    message = models.CharField(max_length=200)
    date = models.DateTimeField(auto_now=True)
    viewed = models.BooleanField(default=False)
    user = models.ForeignKey(User, related_name='notifications', on_delete=models.CASCADE)

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

User.objects.filter(...)
Notification.objects.create(user=..., message=...)

Как правильно подключать настройки django и models.py в моем скрипте, чтобы это реализовать?
Мне это по большей части нужно для email рассылки напоминалки

Чтобы использовать модели проекта, нужно установить его окружение указанным ниже способом.
<code>
import os
import django

os.environ.setdefault("PYTHONPATH", "path/to/you/project")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "you_project.settings")
django.setup()
</code>
В дальнейшем, просто импортируете модель из своего проекта, и работаете с ней как обычно.


Перечисление атрибутов модуля
Я импортировал модуль ccxt, в нем есть множество атрибутов.
Обычно я работаю с каждым по отдельности, например:

finance = ccxt.finance({params...})

exchange = ccxt.exchange({params...})

asset= ccxt.asset({params...})

Далее, я использую по очереди мои функции finance, exchange, asset и так далее.
Теперь мне нужно записать ccxt единожды, а все нужные атрибуты я вывел отдельно, и хочу использовать цикл, чтобы подставить их после ccxt.

my_atributes = ['finance','exchange', 'asset']
for i in my_atributes:
    ccxt.i({params...})

Такая запись не работает, потому что нельзя использовать строки в качестве атрибута для ccxt. Если записать элемента списка без кавычек, то они станут функциями, и код выдаст ошибку.

names = ['finance', 'exchange', 'asset']
for name in names:
    getattr(ccxt, name)({params...})

либо

funcs = [ccxt.finance, ccxt.exchange, ccxt.asset]
for f in funcs:
    f({params...})


как записать объекты в файл html?
Есть небольшая задачка. вот код:

class Tag:
    def __init__(self, tag, is_single=False):
        self.tag = tag
        self.text = ""
        self.attributes = {}

    def __enter__(self):
        return self

    def __exit__(self, *args, **kwargs):
        attrs = []
        for attribute, value in self.attributes.items():
            attrs.append('%s="%s"' % (attribute, value))
        attrs = " ".join(attrs)

        if self.is_single:
            print("<{tag} {attrs}/>".format(tag=self.tag, attrs=attrs))
        else:
            print(
                "<{tag} {attrs}>{text}</{tag}>".format(
                    tag=self.tag, attrs=attrs, text=self.text
                )
            )

    def __str__(self):
        attrs = []
        for attribute, value in self.attributes.items():
            attrs.append('%s="%s"' % (attribute, value))
        attrs = " ".join(attrs)

        return "<{tag} {attrs}>{text}</{tag}>".format(tag=self.tag, attrs=attrs, text=self.text)

class HTML(Tag, TopLevelTag):

class TopLevelTag:
    def __init__(self, tag, toplevel=False, is_single=False):
        self.tag = tag
        self.text = ""
        self.attributes = {}

        self.toplevel = toplevel
        self.is_single = is_single
        self.children = []

    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        if self.toplevel:
            print("<%s>" % self.tag)
            for child in self.children:
                print(child)

            print("</%s>" % self.tag)

    def __str__(self):
        attrs = []
        for attribute, value in self.attributes.items():
            attrs.append('%s="%s"' % (attribute, value))
        attrs = " ".join(attrs)

        if self.children:
            opening = "<{tag} {attrs}>".format(tag=self.tag, attrs=attrs)
            internal = "%s" % self.text
            for child in self.children:
                internal += str(child)
            ending = "</%s>" % self.tag
            return opening + internal + ending
        else:
            if self.is_single:
                return "<{tag} {attrs}/>".format(tag=self.tag, attrs=attrs)

            else:
                return "<{tag} {attrs}>{text}</{tag}>".format(tag=self.tag, attrs=attrs, text=self.text)

if __name__ == "__main__":

    with HTML(output="index.html") as doc:
        with TopLevelTag("head") as head:
            with Tag("title") as title:
                title.text = "hello"
                head += title
            doc += head

        with TopLevelTag("body") as body:
            with Tag("h1", klass=("main-text",)) as h1:
                h1.text = "Test"
                body += h1

            with Tag("div", klass=("container", "container-fluid"), id="lead") as div:
                with Tag("p") as paragraph:
                    paragraph.text = "another test"
                    div += paragraph

                with Tag("img", is_single=True, src="/icon.png") as img:
                    div += img

                body += div
            doc += body

должно получиться что-то вроде:

<html>
<head>
  <title>hello</title>
</head>
<body>
    <h1 class="main-text">Test</h1>
    <div class="container container-fluid" id="lead">
        <p>another test</p>
        <img src="/icon.png" data-image="responsive"/>
    </div>
</body>
</html>

часть я уже написал, но ещё не известно правильно или нет, т.к. немогу оформить сохранение файла в html в классе HTML...
ПАМАГИТЕ...

У функции
print есть параметр "file", который позволяет делать вывод не в консоль, а в файл. Пример:

with open('file.txt', 'wt') as file:
    print('Hello!', file=file)

В вашем случае нужно добавить чтобы файл передавался при создании объекта и передавался в print-ы (нужно добавить
file=self.file во все print-ы):

import sys

...
class Tag:
    def __init__(self, tag, is_single=False, file=sys.stdout):
        self.file = file

    ...

    def __exit__(self, *args, **kwargs):
        ...
            print("<{tag} {attrs}/>".format(tag=self.tag, attrs=attrs), file=self.file)

Работать будет примерно так:

with open('file.html', 'wt') as file:
    with Tag('html', file=file):
        pass


Как сделать нумерацию списка пользователей
Подскажите пожалуйста, как сделать нумерацию списка?
Вот код:

for first, last, nickname, user_id in Cursor.fetchall():

        num0 = 1
        num1 = int(num0) + 1
        mess += str(num1) + '' + f"@id{user_id}({first}\t{last}) - \t{nickname}" + '\n'

    vk.messages.send(
        chat_id=chat_id,
        message=mess,
    )

Вывод:

2 Пользователь
2 Пользователь
2 Пользователь

Что не так?

Может так?

for num, (first, last, nickname, user_id) in enumerate(Cursor.fetchall()):
    mess += f"{num}@id{user_id}({first}\t{last}) - \t{nickname}" + '\n'

enumerate - означает "пронумеровать". Работает это так:

for n, (x, y) in enumerate([[1, 2], [3, 4], [5, 6]]):
    print(n, ':', x, y)

Результат:

0 : 1 2
1 : 3 4
2 : 5 6


Регулярные выражения в python
Господа, помогите плз.
Есть три ссылки
<code>
a = "realty.ru/offers/kvartiry
     avito.ru/uhta
     avito.ru/mowsow"

li2 = re.findall("\w+\.\w+/\w+", a)
print(li2)
</code>
При таком коде он ищет тока последние две сылки. Не получается сделать чтобы можно скока угодно групп он искал, пример слеш слово, слеш слово, слеш слово и так до бесконечности


Как замаскировать значения в строке датарфейма?
Пусть дан датафрейм:

1) 2 3 3 2
2) 4 5 5 5
3) 0 9 8 1

Как получить такое:

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

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

Примените pd.factorize() к транспонированому DataFrame:
<code>
In [30]: df
Out[30]:
   a  b  c  d
0  2  3  3  2
1  4  5  5  5
2  0  9  8  1

In [31]: df.T.apply(lambda x: pd.factorize(x)[0]+1).T
Out[31]:
   a  b  c  d
0  1  2  2  1
1  1  2  2  2
2  1  2  3  4
</code>


Как вывести emoji смайлики в python?
Какой модуль можно использовать для вывода emoji в python?

Выводимый текст надо помещать в кавычки:

print("😎")

Или так

x = "😎"
print(x)


Ошибка TypeError: 'int' object is not subscriptable
Начинаю изучать питон, столкнулся с такой проблемой как TypeError: 'int' object is not subscriptable. Прошу помощи, т.к. перерыл все похожие вопросы и ничего не понял.
Задача, которую я решаю:
Имеется набор данных, состоящий из пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма всех выбранных чисел не делилась на 4 и при этом была максимально возможной. Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0.
<code>
n = int(input())
a = [0] * 4
b = [0] * 4
r = c = 0
for i in range(n):
    s = input().split()
    s[0] = int(s[0])
    s[1] = int(s[1])
    for j in range(len(a)):
        a[j] = 0
    for k in range(2):
        for p in range(len(a)):
            r = (b[p] + s[k]) % 4
            if a[r] < (b[p] + s[k]):
                a = b[p] + s[k]
    b = a
print(max(a[1], a[2], a[3]))
</code>

Нужно быть внимательнее с именами переменных и что они означают. Давать переменным имена из одной буквы - очень плохо (допустимо разве что в качестве итератора в цикле, да и то лучше и там так не делать), сам потом забудешь где что.
В строчке
a = b[p] + s[k] переменная
а из списка превращается в число и на второй итерации в стрчоке
if a[r] < (b[p] + s[k]): возникает ошибка, потому что
a[r] становится недопустимой операцией.
Точно такая же ошибка возникнет на второй итерации внешнего цикла в строчке r =
(b[p] + s[k]) % 4 потому что строка
b = a делает из списка
b число.


Проблема с 'int' object is not subscriptable
Задача - вывести средний балл для каждого класса. Но python выдаёт:

File "main.py", line 28, in <module>
    print(middle_class("9a"))
  File "main.py", line 21, in middle_class
    for grade in grades[x['scores']]:
TypeError: 'int' object is not subscriptable

        grades = [
            {"school_class" : "9a" , "scores" : [5, 3, 4, 5, 5]},
            {"school_class" : "9b" , "scores" : [4, 4, 5, 2, 2]},
            {"school_class" : "9c" , "scores" : [3, 2, 5, 3, 5]},
            {"school_class" : "9d" , "scores" : [2, 3, 4, 5, 5]}
        ]

        def middle_class(class_number):
            if class_number == "9a":
                x = 0
            elif class_number == "9b":
                x = 1
            elif class_number == "9c":
                x = 2
            elif class_number == "9d":
                x = 3

            grade2 = 0

            for grade in grades[x['scores']]:
                grade1 = grade
                grade2 += grade1
            middle_class = grade2/5
            return middle_class

        print(middle_class("9a"))

Вот так должно работать:
<code>
grades = [
            {"school_class" : "9a" , "scores" : [5, 3, 4, 5, 5]},
            {"school_class" : "9b" , "scores" : [4, 4, 5, 2, 2]},
            {"school_class" : "9c" , "scores" : [3, 2, 5, 3, 5]},
            {"school_class" : "9d" , "scores" : [2, 3, 4, 5, 5]}
        ]

def middle_class(class_number):
            if class_number == "9a":
                x = 0
            elif class_number == "9b":
                x = 1
            elif class_number == "9c":
                x = 2
            elif class_number == "9d":
                x = 3

            grade2 = 0

            for grade in grades[x]['scores']:  # Поменял место скобки
                grade1 = grade
                grade2 += grade1
            middle_class = grade2/5
            return middle_class

print(middle_class("9a"))
</code>
Ошибка была в том, что Вы перепутали место квадратной скобки. Скорее всего, это просто опечатка, но у Вас получалось, что Вы пытались обратиться к числу, как к словарю, вместо того, чтобы сделать это число одним из ключей словаря.