Почему удаляются кнопки, а не виджеты Label и Entry?
<code>
from tkinter import *

root=Tk()
root.title("Нумерация")

fr=Frame(root)
fr.grid()
kom_kv=Label(root,text='Введите номер квартиры с несколькими собственниками:')
kom_kv.grid(row=1,column=0, sticky=W)
kom_kv1=Entry(root)
kom_kv1.grid(row=1,column=1, sticky=W)

sobs=Label(root,text='Введите колличество собственников:')
sobs.grid(row=2,column=0,sticky=W)
sobs1=Entry(root)
sobs1.grid(row=2,column=1,sticky=W)

def addFlat():
    fr=Frame(root)
    fr.grid()
    kom_kv=Label(fr,text='Введите номер квартиры с несколькими собственниками:')
    kom_kv.grid(row=1,column=0, sticky=W)
    kom_kv1=Entry(fr)
    kom_kv1.grid(row=1,column=1, sticky=W)

    sobs=Label(fr,text='Введите колличество собственников:')
    sobs.grid(row=2,column=0,sticky=W)
    sobs1=Entry(fr)
    sobs1.grid(row=2,column=1,sticky=W)

def deleteFlat():
    fr.grid_remove()
    kom_kv.grid_remove()
    kom_kv1.grid_remove()
    sobs.grid_remove()
    sobs1.grid_remove()

plus=Button(fr,text='Добавить квартиру', command=addFlat)
plus.grid(row=10, column=1, sticky=W)

plus=Button(fr,text='Удалить квартиру', command=deleteFlat)
plus.grid(row=10, column=2, sticky=W)

root.mainloop()
</code>

Что работало неправильно: Функция удаления всегда ссылалась на последний фрейм с его компонентами

def deleteFlat():
    fr.grid_remove()
    kom_kv.grid_remove()
    kom_kv1.grid_remove()
    sobs.grid_remove()
    sobs1.grid_remove()

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

class UI:
    sobsList = []
    sobs1List = []

    komKvList = []
    komKv1List = []

    frList = []

    def __init__(self):
        self.root = Tk()
        self.root.title("Нумерация")

        self.fr = Frame(self.root)
        self.fr.grid()

        self.plus = Button(self.fr, text='Добавить квартиру', command=self.addFlat)
        self.plus.grid(row=10, column=1, sticky=W)

        self.plus = Button(self.fr, text='Удалить квартиру', command=self.deleteFlat)
        self.plus.grid(row=10, column=2, sticky=W)

        self.addFlat()

    def addFlat(self):
        fr = Frame(self.root)
        fr.grid()
        self.frList.append(fr)
        self.fr = fr

        kom_kv = Label(self.fr, text='Введите номер квартиры с несколькими собственниками:')
        kom_kv.grid(row=1, column=0, sticky=W)
        self.komKvList.append(kom_kv)

        kom_kv1 = Entry(self.fr)
        kom_kv1.grid(row=1,column=1, sticky=W)
        self.komKv1List.append(kom_kv1)

        sobs = Label(self.fr,text='Введите колличество собственников:')
        sobs.grid(row=2,column=0,sticky=W)
        self.sobsList.append(sobs)

        sobs1=Entry(self.fr)
        sobs1.grid(row=2,column=1,sticky=W)
        self.sobs1List.append(sobs1)

    def deleteFlat(self):
        self.frList.pop().grid_remove()
        self.komKvList.pop().grid_remove()
        self.komKv1List.pop().grid_remove()
        self.sobsList.pop().grid_remove()
        self.sobs1List.pop().grid_remove()

if __name__ == '__main__':
    ui = UI()
    ui.root.mainloop()

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


Python 3 постепенное вытаскивание из функции map()
Как сделать так, чтобы при работе функции map(), я мог бы работать с уже обработанными им данными. В данном случае лишь эскиз кода. А уже с большими данными приходится ждать довольно долго. Как можно реализовать такую схему?

def powers(x):
    return x*x

box = [0,1,2,3,4,5,6,7,8,9]
box_mapped = map(powers, box)
print(?)

или конкретно мой случай:

def get_kp():
    # some code

box = [1,2,3,...]
with Pool() as p:
    box_mapped = p.map(get_kp, box)
print() # по одному готовому элементу (необязательно print())

def foo(a):
    print(f'sqrt {a}')
    return a ** 2

data = [1, 2, 3, 4, 5]

mapped = map(foo, data)

for i in mapped:
    print(i)

Рзультат:

sqrt 1
1
sqrt 2
4
sqrt 3
9
sqrt 4
16
sqrt 5
25

Как видим исполнение идёт не сразу, а по мере необходимости.
А теперь с процессами:

from multiprocessing import Pool

if __name__ == '__main__':
    with Pool(processes=3) as pool:
        for i in pool.imap(foo, data):
            print(i)

Реультат:

sqrt 1
sqrt 2
sqrt 3
sqrt 4
sqrt 5
1
4
9
16
25


Не знаю как реализовать, нужно реализовать нестандартную пагинацию Djangо. Помогите
В Django и Python я новичок, пишу пока основываясь на видео уроках и скромных познаниях. Решил потренироваться и переписать сайт написанный ранее на Yii 2, но столкнулся с проблемой которую не могу пока никак решить. Надеюсь на помощь опытных программистов.
Есть модель статьи, есть вьюха в которой я вывожу конкретную статью в шаблоне, где в конце есть нестандартная пагинация, в ней выводится ссылка на следующую либо предыдущую статьи, название статьи и изображение.
Во view я использую класс, вот такой код:

from django.shortcuts import render
from django.views.generic import View
from blog.forms import SubscriberForm
from blog.models import Article
from blog.utils import ObjectDetailMixin

class ArticleDetail(ObjectDetailMixin, View):
    model = Article
    template = 'blog/article_detail.html'

вот такой код в миксине:

from django.shortcuts import render
from django.shortcuts import get_object_or_404

class ObjectDetailMixin:
model = None
template = None

def get(self, request, slug):
#тут я получаю из базы статью по slug
    obj = get_object_or_404(self.model, slug__iexact=slug)
#отсюда пытаюсь реализовать нестандартную пагинацию, я по id категории
#дергаю из базы все статьи с таким же categoty_id

    articles = self.model.objects.filter(category_id=obj.category.id)

#отсюда затык, мне нужно получить что-то типа prev_article_page и
#next_article_page с данными, мой код не работает при каждой итерации
#не добавляет единицу

    for article in articles:
        if article.category_id == obj.category_id:
            z = 0
            next_article = articles[z + 1]
            z += 1
            prev_article = articles[z - 1]
            break
    return render(request, self.template, context= {self.model.__name__.lower(): obj, 'next_article': next_article, 'prev_article': prev_article})

в HTML-шаблоне код пагинатора такой:

<div id="single-pagination" class="img-pagination">
            <ul>
                    <li class="prev">
                        <a href="{% url 'articles_list_url' %}{{ prev_article.slug }}" style="background-image:{{ MEDIA_URL }}({{ prev_article.article_image }});">
                            <div class="overlay-caption">
                                <span>Previous Post</span>
                                <h4 class="post-name"><strong>The Right Thing To Do</strong></h4>
                            </div>
                        </a>
                    </li>
                    <li class="next">
                        <a href="{% url 'articles_list_url' %}{{ next_article.slug }}" style="background-image:url(files/uploads/900x600-light.jpg);">
                            <div class="overlay-caption">
                                <span>Next Post</span>
                                <h4 class="post-name"><strong>Life Spent Living Across the Country</strong></h4>
                            </div>
                        </a>
                    </li>
            </ul>
        </div>

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

Для себя нашел следующее решение, вдруг кому пригодиться.В файле views.py использую встроенный класс-контроллер DetailViev, в котором переопределил метод get_context_data:

from django.core.paginator import Paginator, InvalidPage
from django.views.generic import View, DetailView, TemplateView
from blog.models import Article, Tag, Category

class ArticleDetailView(DetailView):
model = Article
template_name = 'blog/article_detail.html'
slug_url_kwarg = 'slug'

def get_context_data(self, **kwargs):
    context = super(ArticleDetailView, self).get_context_data(**kwargs)
        if self.object.category is not None:
        context['articles'] = Article.objects.filter(category=self.object.category).order_by('id')
        for n, article_page in enumerate(context['articles']):
            if article_page.id == self.object.id:
                try:
                    context['prev_page'] = context['articles'][n-1]
                except AssertionError:
                    context['prev_page'] = None
                try:
                    context['next_page'] = context['articles'][n+1]
                except IndexError:
                    context['next_page'] = None
                break
         return context

Мне нужно было получить списка QuerySet отфильтрованную предыдущую и последующие статьи, фильтрация происходила по категории.
в HTML-шаблоне код следующий:

 <div id="single-pagination" class="img-pagination">
            <ul>
                {% if prev_page %}
                <li class="prev">
                    <a href="{% url 'articles_list_url' %}{{ prev_page.slug }}" style="background-image:url({{ prev_page.article_cover_image.url }});">
                        <div class="overlay-caption">
                            <span>Предыдущая статья</span>
                            <h4 class="post-name"><strong>{{prev_page.title }}</strong></h4>
                        </div>
                    </a>
                </li>
                    {% else %}
                    <li class="prev">&nbsp;</li>
                {% endif %}
            {% if next_page %}
                <li class="next">
                        <a href="{% url 'articles_list_url' %}{{ next_page.slug }}" style="background-image:url({{ next_page.article_cover_image.url }});">
                            <div class="overlay-caption">
                                <span>Следующая статья</span>
                                <h4 class="post-name"><strong>{{ next_page.title }}</strong></h4>
                            </div>
                        </a>
                    </li>
                {% else %}
                <li class="next">&nbsp;</li>
            {% endif %}
            </ul>
        </div>


'map' object is not subscriptable (Python)
<code>
N,M = map(int, input().split())
a = map(int, input().split())
b = [0] * N
c = 0
d = 0
e = []
for i in range (M):
    b[a[i]] += 1
for i in range (N + 1):
    if b[i] >= c:
        c = b[i]
        e[d] = i
        d += 1
print(*e)
</code>
В строчке b [a[i]] почему-то вылезает ошибка, хотя b - массив созданный из нулей и в принципе мне казалось, что все должно работать

При вызове
a[i] оператор
[i] транслируется в вызов метода
a.__getitem__(i).
У объекта типа
map не существует такого метода:

In [14]: type(a)
Out[14]: map

In [15]: a.__getitem__(0)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-15-82c105a3393c> in <module>
----> 1 a.__getitem__(0)

AttributeError: 'map' object has no attribute '__getitem__'

Оберните все вызовы
map() конструктором
list():

N,M = list(map(int, input().split()))
a = list(map(int, input().split()))


Как работает "global" в Python? [дубликат]

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

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

                                (4 ответа)

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

скажите пожалуйста как работает зарезервированное слово "global" в Python

Когда внутри функции создаются новые переменные, они имеют локальную область видимости. То есть такие переменные определены только в пределах тела функции, и они уничтожаются, когда функция возвращает управление вызывающей программе. Чтобы иметь возможность изменять глобальные переменные внутри функции, эти переменные следует определить в теле функции с помощью инструкции global
<code>
count = 0
...
def foo():
    global count
    count += 1  # Изменяет значение глобальной переменной count
</code>


Определение возраста сотрудников и обработка
Имеются сведения о датах рождения сотрудников учреждения.
а) Определите самого молодого сотрудника.
б) Определите самого старшего сотрудника.
в) Получите список всех сотрудников, родившихся весной.
мой код:
<code>
f=open('1.txt','rt')
q=f.read()
in_list=list(filter(lambda x: x != '', q.split('\n')))
out_list=[]
for string in in_list:
    item=list(map(int,string.split(' ')[2].split('.')))
    out_list.append(item)
print(out_list)
</code>
Дальше, я понимаю что нужно вычислить разницу между сегодняшней датой и датами рождения сотрудников -> наибольшее кол-во дней в разнице - старший сотрудник, наименьшее - младший. Но как это реализовать? Подскажите пожалуйста]1

Для этих целей идеально подходит модуль Pandas.
Читаем CSV файл в Pandas DataFrame и парсим даты:

import pandas as pd  #  pip install pandas

fn = r'C:\temp\1.txt'

df = pd.read_csv(fn, delim_whitespace=True, header=None,
                 parse_dates=['DOB'],
                 names=['FirstName','LastName','DOB'])

получилось:

In [55]: df
Out[55]:
  FirstName LastName        DOB
0         А        Б 2001-06-23
1         В        Г 2000-11-13
2         Д        Е 2001-09-17
3         Ж        3 2002-04-07
4         И        К 2000-12-27

Определите самого молодого сотрудника

In [56]: df.nlargest(1, 'DOB')
Out[56]:
  FirstName LastName        DOB
3         Ж        3 2002-04-07

Определите самого старшего сотрудника

In [57]: df.nsmallest(1, 'DOB')
Out[57]:
  FirstName LastName        DOB
1         В        Г 2000-11-13

Получите список всех сотрудников, родившихся весной.

In [58]: df[df['DOB'].dt.month.between(3, 5)]
Out[58]:
  FirstName LastName        DOB
3         Ж        3 2002-04-07

Чтобы установить Pandas (при помощи
pip):

pip install pandas

или при помощи
conda (менеджер пакетов из дистрибутива
Anaconda):

conda install pandas


Запись hex в бинарный файл [закрыт]

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

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

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

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

Как можно записать hex в бинарный файл?
Т.е задача такая: есть hex строка бинарного файла, мне надо с помощью скрипта записать эту hex строку в .exe файл.
Типа такой строки:
4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000000100000e1fba0e00b409cd21b8014ccd215468


Python вычитание дат
Требуется вычесть из заданного времени, настоящее.

test = datetime.today().strftime("%H:%M")
test2 = timedelta(hours=22, minutes=30)
print(test-test2)

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

Надеюсь, то, что нужно.  И надеюсь понятно.
<code>
>>> import math
>>> from datetime import *
>>> tmp = datetime.today();
>>> static_date = datetime(tmp.year, tmp.month, tmp.day, 22, 5);
>>> static_date
datetime.datetime(2019, 3, 17, 22, 5)
>>> current_date = datetime.today()
>>> current_date
datetime.datetime(2019, 3, 17, 17, 2, 34, 792760)
>>> delta = static_date - current_date
>>> delta
datetime.timedelta(seconds=18145, microseconds=207240)
>>>  #  Если секунды нужно "отсекать", можно вместо math.ceil() юзать просто int(), тогда и библиотеку лишнюю подключать не придётся.
>>> if ( delta.days == -1 ):
    out_minutes = math.ceil(delta.seconds / 60) - 24 * 60;
else:
    out_minutes = math.ceil(delta.seconds / 60);
>>> out_minutes
303  #  Количество минут от текущего до заданного
>>> test_date = datetime(tmp.year, tmp.month, tmp.day, 23, 35)
>>> delta = static_date - test_date
>>> delta
datetime.timedelta(days=-1, seconds=81000)
>>> if ( delta.days == -1 ):
    out_minutes = math.ceil(delta.seconds / 60) - 24 * 60;
else:
    out_minutes = math.ceil(delta.seconds / 60);

>>> out_minutes
-90  #  Отрицательное число, если текущее время больше заданного
</code>


Обнаружение и исключение выбросов в dataframe [закрыт]

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

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

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

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

Подскажите как можно удалить выбросы в данных?

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

def Maxstd(df, alpha=0.97):
    X = df
    Zero = pd.DataFrame(0, index=X.index, columns=X.columns)
    numbers = np.empty([0])
    ResArray = X.copy()
    OperatingArray = X.copy()

    while True:
        m = OperatingArray.mean()
        s = OperatingArray.std()
        XX = (OperatingArray - m) / s
        L = paired_distances(XX, Zero)
        maxindex = np.argmax(L)
        XX.ix[maxindex] = np.nan
        ss = XX.std()
        if ss.min() >= alpha:
            break;
        numbers = np.append(numbers, maxindex)
        OperatingArray.ix[maxindex] = m

    ResArray.ix[numbers] = np.nan
    Result = pd.DataFrame(columns=X.columns)
    Result = Result.append(X.mean(), ignore_index=True)
    Result = Result.append(ResArray.mean(), ignore_index=True)
    Result = Result.append(X.std(), ignore_index=True)
    Result = Result.append(ResArray.std(), ignore_index=True)
    Result = Result.append(X.min(), ignore_index=True)
    Result = Result.append(ResArray.min(), ignore_index=True)
    Result = Result.append(X.max(), ignore_index=True)
    Result = Result.append(ResArray.max(), ignore_index=True)

    Result.index = ['Mean (before)', 'Mean (after)', 'Standard deviation (before)', 'Standard deviation (after)', 'Minimum (before)',
        'Minimum(after)', 'Maximum (before)', 'Maximum(after)']
    return ResArray, Result, numbers

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

def Mahalanobis(df, alpha=0.9):
    X = df
    mean = X.mean()
    L = pd.DataFrame(pairwise_distances(X, mean.reshape(1, -1), metric='mahalanobis'))
    upper_bound = L.values.max() * alpha

    numbers = L.loc[L[0] > upper_bound]
    XX = X.copy()
    XX.ix[numbers.index.values] = np.nan

    Result = pd.DataFrame(columns=X.columns)
    Result = Result.append(X.mean(), ignore_index=True)
    Result = Result.append(XX.mean(), ignore_index=True)
    Result = Result.append(X.std(), ignore_index=True)
    Result = Result.append(XX.std(), ignore_index=True)
    Result = Result.append(X.min(), ignore_index=True)
    Result = Result.append(XX.min(), ignore_index=True)
    Result = Result.append(X.max(), ignore_index=True)
    Result = Result.append(XX.max(), ignore_index=True)

    Result.index = ['Mean (before)', 'Mean (after)', 'Standard deviation (before)', 'Standard deviation (after)', 'Minimum (before)',
        'Minimum(after)', 'Maximum (before)', 'Maximum(after)']
    return XX, Result, numbers.index.values

В методе Resampling Half Means (RHM) несколько раз случайным образом выбирается половина всех векторов в исходной выборке. У отобранных векторов вычисляется среднее и стандартное отклонение. Вся исходная выборка масштабируется на основе вычисленных значений среднего и стандартного отклонения. Для каждого вектора выборки вычисляется расстояние между вектором и нулём. Все вычисленные расстояния заносятся в список для дальнейшей обработки.

def RHM(df, alpha=0.9):
    X = df
    L = pd.DataFrame()
    Zero = pd.DataFrame(0, index=np.arange(X.shape[0]), columns=X.columns)

    for i in range(X.shape[0] * 2):
        #Random sampling
        rows = random.sample(X.index, X.shape[0] / 2)
        Xsami = X.ix[rows]

        #Calculate mean and standard deviation
        mi = Xsami.mean()
        si = Xsami.std()
        #Scale data frame
        Xi = (X - mi) / si

        #Calculate vectors length
        Li = paired_distances(Xi, Zero)
        L['X'+str(i)] = Li

    upperBound = L.values.max() * alpha
    counts = L.gt(upperBound).sum(axis=1)
    numbers = counts.loc[counts > 0]
    XX = X.copy()
    XX.ix[numbers.index.values] = np.nan

    Result = pd.DataFrame(columns=X.columns)
    Result = Result.append(X.mean(), ignore_index=True)
    Result = Result.append(XX.mean(), ignore_index=True)
    Result = Result.append(X.std(), ignore_index=True)
    Result = Result.append(XX.std(), ignore_index=True)
    Result = Result.append(X.min(), ignore_index=True)
    Result = Result.append(XX.min(), ignore_index=True)
    Result = Result.append(X.max(), ignore_index=True)
    Result = Result.append(XX.max(), ignore_index=True)

    Result.index = ['Mean (before)', 'Mean (after)', 'Standard deviation (before)', 'Standard deviation (after)', 'Minimum (before)',
        'Minimum(after)', 'Maximum (before)', 'Maximum(after)']
    return XX, Result, numbers.index.values

В случае, если речь идёт не о нормально распределённой выборке, а о данных, изменяющихся в реальном времени, задача усложняется. В этом случае можно рекомендовать использование метода опорных векторов, атрибутами в котором являлись бы вектора разности между i-м и (i+1)-м элементом, i-м и (i+2)-м и т.д. Я писал этот код для определения того, присутствует ли в выборке шум, но вы можете доработать его под вашу задачу.

def find_minmax(column):
    coldif1 = np.array(0)
    for i in range(0, column.size - 1):
        coldif1 = np.append(coldif1, np.absolute(column[i] - column[i + 1]))
    coldif1 = np.delete(coldif1, 0, 0)

    coldif2 = np.array(0)
    for i in range(0, column.size - 2):
        coldif2 = np.append(coldif2, np.absolute(column[i] - column[i + 2]))
    coldif2 = np.delete(coldif2, 0, 0)

    coldif3 = np.array(0)
    for i in range(0, column.size - 3):
        coldif3 = np.append(coldif3, np.absolute(column[i] - column[i + 3]))
    coldif3 = np.delete(coldif3, 0, 0)

    coldif4 = np.array(0)
    for i in range(0, column.size - 4):
        coldif4 = np.append(coldif4, np.absolute(column[i] - column[i + 4]))
    coldif4 = np.delete(coldif4, 0, 0)

    coldif5 = np.array(0)
    for i in range(0, column.size - 5):
        coldif5 = np.append(coldif5, np.absolute(column[i] - column[i + 5]))
    coldif5 = np.delete(coldif5, 0, 0)

    return [np.amax(coldif1), np.amax(coldif2), np.amax(coldif3), np.amax(coldif4), np.amax(coldif5)]

xls = pd.ExcelFile('noise_sensor.xlsx')
df = pd.read_excel(io=xls, sheet=0, header=0)
df = df.drop(['A', 'B'], axis=1)

X_train = np.array([np.zeros(5)])
for i in range(0, 16):
    column = df.as_matrix(columns=df.columns[i:i+1])
    #print(column)
    X_train = np.append(X_train, [find_minmax(column)], axis=0)

X_train = np.delete(X_train, 0, axis=0)
print(X_train)

Y_train = np.array([0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])

clf = SVC()
clf.fit(X_train, Y_train)

test_df = pd.read_excel(io=xls, sheetname=2, header=0)
test_df = test_df.drop(['A', 'B'], axis=1)

X_test = np.array([np.zeros(5)])
for i in range(0, 16):
    column = test_df.as_matrix(columns=test_df.columns[i:i+1])
    X_test = np.append(X_test, [find_minmax(column)], axis=0)

X_test = np.delete(X_test, 0, axis=0)

print(clf.predict(X_test))


Парсинг Python: поиск элемента у которого нет потомков
Всем привет, необходимо вытащить p, где имеется текст 5-10, и 11-17
Код:

  <td>
        <br>
        <p>
            <font class="font-subject">Основы автоматизации проектно-конструкторских работ</font>
            <br>
            <font class="font-classroom">
                <a href="#" onclick="return false" onmouseup="GoToTheLink(2, 3, 192)">2-120</a>
            </font>
            <font class="font-teacher"></font>
        </p>
        <p>
            <font class="font-teacher">Лекция + практика</font>
        </p>
        <font class="font-teacher">
            <a href="#" onclick="return false" onmouseup="GoToTheLink(2, 1, '2318!ФАДЭТ!3')">АС-306</a>
        </font>
        <p>5-10</p>
        <br>
        <p>
            <font class="font-subject">Основы автоматизации проектно-конструкторских работ</font>
            <br>
            <font class="font-classroom">
               <a href="#" onclick="return false" onmouseup="GoToTheLink(2, 3, 339)">2-510</a>
            </font>
            <font class="font-teacher"></font>
        </p>
        <p>
            <font class="font-teacher">Лекция + практика</font>
        </p>
        <font class="font-teacher">
            <a href="#" onclick="return false" onmouseup="GoToTheLink(2, 1, '2318!ФАДЭТ!3')">АС-306</a>
        </font>
        <p>11-17</p>
    </td>

Так как имеются и другие элементы p, единственным возможным найти эти элементы, это поиск у родителя элементы p, у которых нет потомков.
Вопрос: можно ли его найти с помощью css-селектора? (ну если нельзя, то хотя бы Xpath, если возможно).
Для парсинга использую lxml (cssselect)
Update
Возможные шаблоны текста:

5-10
1, 2-10, 12-15
2, 4, 8
2
4-6, 8, 10-14

Через чистый css-инструментарий сейчас нет возможности выцепить элемент, в котором отсутствуют дочерние элементы: к сожалению, :empty в данном случае не подходит.
Решение через xpath:
//p[not(child::*)]


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

1  3  1  2  5040
6  3  2  1  5040
1  3  1  2  320
8  3  3  0  1680

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

1  3  1  2  5360
6  3  2  1  5040
8  3  3  0  1680

У меня получилось удалить дубликаты по первым четырем значениям таким образом(pandas):

datalst = pd.DataFrame(smlst3, columns = ["1","2","3","4","all"])
datalst = datalst.drop_duplicates(["1","2","3","4"],keep='first')

Но не понимаю как можно сохранить значения из пятой колонки в уникальную строку.

Просто группируем фрейм по всем столбцам кроме столбца
all
 и суммируем:

In [63]: res = df.groupby(df.columns.drop('all').tolist(), as_index=False).sum()

In [64]: res
Out[64]:
   1  2  3  4   all
0  1  3  1  2  5360
1  6  3  2  1  5040
2  8  3  3  0  1680


Переписал код с Python на c++, но где-то ошибся [закрыт]

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

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

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

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

код на python:

a = int(input())
q = 0
we = 0
j = 0
if len(str(a)) == 1:
    print(a)
else:
    for i in range(10,a):
        q = i
        we = i
        s = 0
        while len(str(q)) != 1:
            for e in range(len(str(q))):
                p = int(str(q)[e])
                we += p
                s += p
            q = s
            s = 0
        if we == a:
            print(i)
            j = 1
            break
    if j != 1:
        print(-1)

код на c++:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
    int a;
    int q;
    int we;
    int j;
    int s;
    int p;
    j = 0;
    string cv;
    string asdf;
    cin >> a;
    cv = to_string(a);
    if (cv.size() == 1)
    {
        cout << a;
    }
    else {
        for (int i = 10; i < (a + 1); i++) {
            q = i;
            we = i;
            s = 0;
            asdf = to_string(i);

            while (asdf.size() != 1)
            {
                for (int e = 0; e < asdf.size(); e++)
                {
                    p = asdf[e];
                    we += p;
                    s += p;

                }

                q = s;
                s = 0;
                asdf = to_string(q);

            }
            if (we == a)
            {
                cout << i;
                j = 1;
                break;

            }
        }
    }
    if (j != 1)
    {
        cout << "-1";
    }
    return 0;
}

Помогите найти ошибку, пожалуйста, во втором коде цикл становится бесконечным, f а такого быть не должно, как это исправить?

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

#include <iostream>

using namespace std;

unsigned int sum(unsigned int n)
{
    if (n < 10) return n;
    unsigned int m = 0, s = n;
    while(s)
    {
        m += s%10;
        s /= 10;
    }
    return n + sum(m);
}

int main(int argc, const char * argv[])
{
    unsigned int B;
    cin >> B;
    for(unsigned int a = 1; a <= B; ++a)
    {
        if (sum(a) == B)
        {
            cout << a << endl;
            return 0;
        }
    }
    cout << -1 << endl;
}

А вот если подумать о возможном диапазоне и изменить перебор - то вполне можно успеть, если заменить

for(unsigned int a = 1; a <= B; ++a)

на

for(unsigned int a = (B > 110) ? B-110 : 1 ; a <= B; ++a)


Как создать новый столбец в DF по категории?
Есть исходный DF:

dD
0,05
0,15
0,25
0,95

И второй DF с категориями значений:

Ot  Do  SP
0   0,1 0,6
0,1 0,2 0,6
0,2 0,3 0,8
0,3 0,4 1,25
0,4 0,5 1,6
0,5 0,6 2,5
0,6 0,7 4,5
0,7 0,8 5,5
0,8 0,9 6,5
0,9 1   8

Правая граница нестрогая!
Нужно в соответствии со значением в первом DF поставить значение SP.
То есть, на выходе нужно получить нечто такое:

dD      SP
0,05    0,6
0,15    0,6
0,25    0,8
0,95    8

Сначала избавимся от дупликатов в первом DF (данный шаг можно пропустить если все значения в столбце
d2['SP'] уникальные):

In [161]: t = d2.groupby('SP')[['Ot','Do']].agg({'Ot':'min', 'Do':'max'}).reset_index()

In [162]: t
Out[162]:
     SP   Ot   Do
0  0.60  0.0  0.2
1  0.80  0.2  0.3
2  1.25  0.3  0.4
3  1.60  0.4  0.5
4  2.50  0.5  0.6
5  4.50  0.6  0.7
6  5.50  0.7  0.8
7  6.50  0.8  0.9
8  8.00  0.9  1.0

теперь подготовим границы интервалов:

In [163]: bins = t[['Ot','Do']].stack().drop_duplicates()

In [164]: bins
Out[164]:
0  Ot    0.0
   Do    0.2
1  Do    0.3
2  Do    0.4
3  Do    0.5
4  Do    0.6
5  Do    0.7
6  Do    0.8
7  Do    0.9
8  Do    1.0
dtype: float64

и соответствующие категории:

In [165]: labels = t['SP']

In [166]: labels
Out[166]:
0    0.60
1    0.80
2    1.25
3    1.60
4    2.50
5    4.50
6    5.50
7    6.50
8    8.00
Name: SP, dtype: float64

наконец воспользуемся функцией pd.cut() для категоризации значений:

In [180]: d1['SP'] = pd.cut(d1['dD'], bins=bins, labels=labels, right=False)

In [181]: d1
Out[181]:
     dD   SP
0  0.05  0.6
1  0.15  0.6
2  0.25  0.8
3  0.95  8.0
4  0.00  0.6

PS: для отладки бывает полезным не указывать категории (
labels), чтобы увидеть получившиеся интервалы:

In [182]: pd.cut(d1['dD'], bins=bins, right=False)
Out[182]:
0    [0.0, 0.2)
1    [0.0, 0.2)
2    [0.2, 0.3)
3    [0.9, 1.0)
4    [0.0, 0.2)
Name: dD, dtype: category
Categories (9, interval[float64]): [[0.0, 0.2) < [0.2, 0.3) < [0.3, 0.4) < [0.4, 0.5) ... [0.6, 0.7) < [0.7, 0.8) < [0.8, 0.9) < [0.9, 1.0)]


Нужна помощь с заданием [закрыт]

Закрыт. На этот вопрос невозможно дать объективный ответ. Ответы на него в данный момент не принимаются.

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

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

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

В логе службы есть N записей, в которых указано, что в i-й момент времени Васина программа потребляла Ai мегабайт памяти. Если в какой-то момент времени потребление памяти программой выросло в два раза или больше по сравнению с предыдущим моментом, значит произошла утечка памяти. Если в какой-то момент времени потребление памяти программой упало в два раза или больше по сравнению с предыдущим моментом, значит программа аварийно завершилась и была перезапущена. Помогите Пете посчитать количество утечек памяти и аварийных завершений его программы.

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int n;
    cin >> n;

    vector < int > v(n);
    for(int i = 0; i < n; ++i) cin >> v[i];

    int a = 0;
    int b = 0;
    for(int i = 1; i < n; ++i)
    {
        if(v[i] / v[i-1] >= 2) ++a;
        else if(v[i-1] / v[i] >= 2) ++b;
    }
    cout << a << ' ' << b;
    return 0;

}


Фильтр по столбцу с поиском по тому же столбцу
Нужно сохранить те строки, которые отстоят одна от другой на некоторое расстояние по одному и тому же полю. Здесь пример по полю 'quantity':

import pandas as pd
df_work = pd.DataFrame({'key':["a01","a01","b03","a01","a01","a01"],
                            'category':["good","good","broken","good","broken","good"],
                            'quantity':[33,32,11,13,2,5],
                        })
df_result = pd.DataFrame(columns = df_work.columns, data = None)
for i in df_work.index:
        q = df_work['quantity'][i]
        for k in df_work.index:
            if i!=k:
                if abs(q-df_work['quantity'][k])<3:
                    df_result = df_result.append(df_work[i:i+1], ignore_index=True)
df_result

выдает желаемое:

    key category quantity
0   a01 good     33
1   a01 good     32
2   b03 broken   11
3   a01 good     13

то есть я хочу получить DataFrame, в котором есть только те строки df_work, значение поля quantity в которых  отстоят от значений в том же поле в других строках "недалеко". В данном случае по модулю на 2 и менее отстоят строки с 33,32 и 11,13.
Есть ли более изящный (Python-стиль) способ отфильтровать DataFrame желаемым образом за пару строк?

Для начала перетасуем DF - исключительно для наглядности (т.к. в оригинальном DF заданным условиям удовлетворяют первые четыре строки идущие подряд).

In [56]: d = df_work.sample(frac=1)

In [57]: d
Out[57]:
   key category  quantity
2  b03   broken        11
0  a01     good        33
4  a01   broken         2
3  a01     good        13
5  a01     good         5
1  a01     good        32

Решение:
создаем матрицу абсолютных разниц для столбца
quantity, воспользовавшись np.subtract.outer():

In [70]: r = np.abs(np.subtract.outer(d['quantity'], d['quantity'].unique(), dtype='int16'))

In [71]: r
Out[71]:
array([[ 0, 22,  9,  2,  6, 21],
       [22,  0, 31, 20, 28,  1],
       [ 9, 31,  0, 11,  3, 30],
       [ 2, 20, 11,  0,  8, 19],
       [ 6, 28,  3,  8,  0, 27],
       [21,  1, 30, 19, 27,  0]], dtype=int16)

получаем индексы строк, удовлетворяющих условиям:

In [72]: idx = ((r > 0) & (r < 3)).nonzero()[0]

In [73]: idx
Out[73]: array([0, 1, 3, 5], dtype=int64)

выбираем строки по индексам:

In [74]: res = d.iloc[idx]

In [75]: res
Out[75]:
   key category  quantity
2  b03   broken        11
0  a01     good        33
3  a01     good        13
1  a01     good        32


Добавление столбца в DataFrame с вычислением значений для него
Ниже приведенный скрипт, который подсчитывает частоту появление лоторейных шаров в играх, сортирует результат по убыванию по частоте и разбивает полученную стастику на категории по 3 шара.
Вопрос - как правильно добавить столбец в DataFrame и расчитать для него  значение не используя цикл? Результат должен соотвествовать результату работы ниже приведенного скрипта.
Исходный код

import pandas as pd
import argparse as ap
import numpy as np
from itertools import combinations
from prettytable import PrettyTable
from collections import Counter
import json
from random import randint
from itertools import chain
import operator
from functools import reduce

def ArgParser():
    parser = ap.ArgumentParser(description='Description of your program')
    parser.add_argument('-d','--draws', help='Test result', required=True)
    args = vars(parser.parse_args())
    return args

def main():

    lastNDraws = 20

    args = ArgParser()
    draws = pd.read_csv(args['draws'], sep=';',header=0, index_col='draw_id')

    bc = (draws.stack().value_counts()).to_frame()

    print(bc)

    bc['category'] = 0
    bc.columns = (['count','category'])

    for i in range(0, len(bc)):
        bc.values[i][1] = i // 3

    print(bc)

    print('The End')

if __name__ == '__main__':

    main()

1) Результат работы скрипта

    count  category
32     28         0
6      27         0
27     26         0
1      25         1
22     24         1
13     24         1
4      23         2
30     23         2
9      23         2
23     23         3
12     23         3
15     23         3
29     22         4
8      22         4
28     21         4
16     21         5
25     21         5
11     21         5
7      20         6
18     20         6
33     20         6
19     19         7
21     19         7
24     19         7
26     19         8
17     18         8
35     18         8
5      18         9
14     17         9
31     16         9
3      16        10
2      15        10
10     14        10
36     12        11
34     11        11
20     10        11

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

draw_id;ball1;ball2;ball3;ball4;ball5;ball6;ball7
1;9;11;17;29;30;33;36
2;5;6;9;11;15;33;28
3;4;5;10;14;20;30;8
4;4;21;22;25;26;36;6
5;1;11;13;17;24;29;36
6;2;17;22;24;27;30;1
7;4;15;26;28;29;35;34
8;12;22;24;26;31;33;2
9;6;9;16;24;33;34;17
10;3;8;12;19;27;31;1
11;4;5;7;9;14;20;25
12;9;20;32;33;35;36;22
13;16;19;23;25;29;32;12
14;6;10;11;17;33;35;15
15;1;5;16;19;22;28;33
16;3;6;7;8;16;29;12
17;1;3;10;19;24;32;23
18;9;25;27;29;33;35;22
19;7;13;17;18;21;34;6
20;7;14;18;20;27;33;28
21;1;3;5;8;22;23;25
22;4;5;13;19;28;34;11
23;3;24;26;32;35;36;14
24;2;7;18;22;30;32;4
25;5;22;28;30;31;33;3
26;1;4;6;28;31;32;13
27;7;10;15;18;23;30;8
28;6;10;12;16;18;19;4
29;9;12;16;21;23;27;3
30;6;15;18;19;25;29;2
31;4;7;22;28;29;30;15
32;3;7;14;18;33;35;29
33;4;14;21;23;28;29;30
34;2;5;9;21;26;27;20
35;1;3;9;11;13;17;27
36;11;13;15;28;32;35;18
37;3;11;16;21;28;35;15
38;1;2;12;13;14;15;6
39;5;10;13;16;18;21;20
40;1;4;18;23;32;36;7
41;6;9;13;17;18;35;23
42;11;13;19;23;24;27;12
43;2;3;8;14;32;35;25
44;1;5;12;14;21;25;9
45;2;4;15;25;28;31;9
46;19;21;23;26;30;35;2
47;11;16;22;23;24;30;8
48;8;9;11;27;30;35;32
49;1;15;22;26;31;32;25
50;3;5;8;12;16;21;7
51;7;8;13;21;22;32;30
52;1;4;8;14;27;30;12
53;2;16;20;22;27;30;21
54;1;5;16;25;27;36;22
55;4;26;28;30;32;33;6
56;5;10;13;18;24;27;29
57;1;4;5;8;22;25;28
58;3;11;24;27;29;34;17
59;1;2;6;9;14;23;32
60;5;10;12;15;24;33;22
61;5;12;15;23;24;32;18
62;2;5;11;13;25;28;10
63;8;13;18;19;27;31;12
64;7;9;11;23;32;34;22
65;2;4;7;15;27;30;26
66;4;12;15;16;17;19;11
67;6;7;9;12;17;19;27
68;12;17;25;27;32;33;36
69;6;19;20;26;27;35;21
70;6;15;21;32;34;35;1
71;4;7;9;10;14;23;26
72;6;21;26;30;31;32;28
73;3;8;13;22;29;31;12
74;6;8;13;15;27;34;5
75;8;13;24;29;31;33;6
76;6;14;17;23;26;32;21
77;4;9;15;16;23;32;13
78;1;8;13;23;27;33;24
79;1;13;16;26;29;32;6
80;9;12;16;22;24;35;32
81;8;9;18;19;23;28;20
82;1;6;7;20;28;29;32
83;8;17;22;25;26;31;11
84;3;11;18;24;26;29;1
85;10;11;13;21;27;30;6
86;2;13;23;25;30;35;29
87;14;16;17;25;29;30;4
88;7;8;12;22;25;31;16
89;16;23;24;27;32;33;19
90;6;16;18;25;27;28;7
91;13;15;17;19;24;32;6
92;1;12;15;19;27;34;36
93;3;6;7;9;18;33;31
94;6;11;12;14;21;29;23
95;8;11;14;15;29;36;22
96;1;9;14;25;30;32;26
97;4;10;25;31;35;36;17
98;9;16;27;32;35;36;23
99;10;21;28;29;31;34;17
100;1;12;13;24;26;33;22
101;2;4;15;18;19;30;8
102;4;7;10;19;30;33;34
103;1;11;15;18;28;31;26

Чтобы создать новый столбец - просто присвойте фрейму
список или
1D numpy array  длина которого соответствует длине DataFrame'а :

df['new_column_name'] = [...]

Код:

bc = (draws.stack().value_counts()).to_frame(name='count')
bc['category'] = np.arange(len(bc)) // 3

результат:

In [54]: bc
Out[54]:
    count  category
32     28         0
6      27         0
27     26         0
22     24         1
13     24         1
1      24         1
9      23         2
..    ...       ...
3      16         9
31     15        10
2      15        10
10     13        10
36     12        11
20     10        11
34     10        11

[36 rows x 2 columns]


zip_command, как она работает в данном коде
Кто сможет объяснить 6-ую строку данного кода?
<code>
1.import os
2.import time
3.source = ['"C:\Program Files\WinRAR"']
4.target_dir = 'D:\\Backup' # Подставьте тот путь, который вы будете использовать.
5.target = target_dir + os.sep + time.strftime('%Y%m%d%H%M%S') + '.zip'
6.zip_command = "zip -qr {0} {1}".format(target, ' '.join(source))
7.if os.system(zip_command) == 0:
8.    print('Резервная копия успешно создана в', target)
9.else:
10.    print('Создание резервной копии НЕ УДАЛОСЬ')
</code>

В строку на место
{0} подставляется первый аргумент метода format, на место
{1} второй, а потом получившаяся строка присваивается переменной
zip_command.


Как получить имя пользователя во всех падежах | VK_API Python
Всем привет! Есть такая необходимость, что в некоторых местах надо бы использовать другой
name_case для одного и того же пользователя.

Каждый раз выполнять
vk.users.get как минимум не красиво (как максимум - приведёт к более долгому выполнению кода), а делать что-то на подобие такого(ниже) - приведёт либо к возврату с ошибкой "слишком много запросов за секунду", либо вообще работать не будет:

# Что это за завтрак из макарон?
def get_all_namecases_user(user_id):
    return {
        'nom' : {
            'first_name' : vk.users.get (
                user_ids = user_id,
                name_case = 'nom'
                )[0]['first_name'],
            'last_name' : vk.users.get (
                user_ids = user_id,
                name_case = 'nom'
                )[0]['last_name']
            },
        'gen' : {
            'first_name' : vk.users.get (
                user_ids = user_id,
                name_case = 'gen'
                )[0]['first_name'],
            'last_name' : vk.users.get (
                user_ids = user_id,
                name_case = 'gen'
                )[0]['last_name']
            },
        'dat' : {
            'first_name' : vk.users.get (
                user_ids = user_id,
                name_case = 'dat'
                )[0]['first_name'],
            'last_name' : vk.users.get (
                user_ids = user_id,
                name_case = 'dat'
                )[0]['last_name']
            },
        'acc' : {
            'first_name' : vk.users.get (
                user_ids = user_id,
                name_case = 'acc'
                )[0]['first_name'],
            'last_name' : vk.users.get (
                user_ids = user_id,
                name_case = 'acc'
                )[0]['last_name']
            },
        'ins' : {
            'first_name' : vk.users.get (
                user_ids = user_id,
                name_case = 'ins'
                )[0]['first_name'],
            'last_name' : vk.users.get (
                user_ids = user_id,
                name_case = 'ins'
                )[0]['last_name']
            },
        'abl' : {
            'first_name' : vk.users.get (
                user_ids = user_id,
                name_case = 'abl'
                )[0]['first_name'],
            'last_name' : vk.users.get (
                user_ids = user_id,
                name_case = 'abl'
                )[0]['last_name']
            }
        }

Как можно выйти из этой ситуации?

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

var user_id = 1,
    i = 0;

var inp = ["nom", "gen", "dat", "acc", "ins", "abl"],
    out = [];

while (i < inp.length)
{
    out = out + API.users.get({
        user_ids: user_id,
        name_case: inp[i]
    });

    i = i + 1;
}

return out;

В результате мы получим массив объектов со всеми значениями в нужных падежах.


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

    <ul>
        {% for topic in topics %}
                <li><a href="/topic/{{ topic.pk }}">{{ topic.subject}}<br />
                { topic.text}}</a></li>
        {% endfor %}
    </ul>

Я хочу добавить около каждого элемента кнопку, при нажатии которой topic.subject, topic.text данной конкретной ячейки будут добавляться в другую раннее созданную таблицу.
Используя только Django при этом.
Можно вызывать функцию во
views.py по нажатию кнопки, но как передать в неё subject u text? Может, можно как-то построить пост-запрос, используя используя эти данные. У меня пока ничего не вышло.
Всем заранее спасибо.

Отвечу сам, мужики. Сделал не без помощи одного хорошего разработчика.

<input type="checkbox" name="{{topic.pk}}">

такой или подобный код засовываем в цикл. А после всего списка делаем кнопку с
input type="submit". Весь цикл и кнопку оборачиваем в
<form> ... </form>. После чего POST-запросом по нажатию отправляем отмеченные элементы в функцию во
views.py. А там уже можно с ними делать что угодно.
Такие дела.


Как задать конкретную длину строкового атрибута класса на python?
Необходимо написать класс, каждый экземпляр которого имеет обязательный строковый атрибут (например 'str_attr') длиной ровно 10 символов. Как наложить такое ограничение на атрибут?

Использовать свойства:
<code>
class SomeClass:
    def __init__(self):
        self._str_attr = None

    @property
    def str_attr(self):
        return self._str_attr

    @str_attr.setter
    def str_attr(self, value):
        if not isinstance(value, str):
            raise ValueError('Значение должно быть строкой')
        if len(value) > 10:
            raise ValueError('Слишком длинная строка')
        self._str_attr = value

some_obj = SomeClass()
some_obj.str_attr = 'Hello'
</code>


На самом деле, все правильно.
Когда интерпретатор обрабатывает строку
for x in range(1,10): вычисляются все значения
x по которым надо пройти.
То есть, список выражений вычисляется один раз, а затем набор выполняется один раз для каждого элемента,
В вашем случае список выражений будет
1, 2, 3 ...
Потом вы меняете
x внутри цикла, но на новой итерации цикла
x снова принимает значения из заранее вычисленного списка выражений, и вы снова его увеличиваете.
Первая итерация:

for x in range(1,10): # x = 1
    x += 7 # x = 1 + 7 = 8
    logging.info('X = {}'.format(x))

Вторая итерация:

for x in range(1,10): # x = 2
    x += 7 # x = 2 + 7 = 9
    logging.info('X = {}'.format(x))

Ну и ссылка на доку


logger: одновременный вывод в консоль и в файл
Нужно логирование и в консоль, и в файл, но если указать, что надо логировать в файл, то логи в консоль не выводятся.
К примеру такой код:

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-
import logging

def main():
    logging.basicConfig(format = '[%(asctime)s | %(levelname)s]: %(message)s', datefmt='%m.%d.%Y %H:%M:%S', level=logging.INFO)

    logging.info('Info message??))')

if __name__ == '__main__':
    main()

Всё нормально, логи выводятся в консоль.

А вот если указать
filename, то логи пишутся только в файл:

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-
import logging

def main():
    logging.basicConfig(filename = 'Log.log', format = '[%(asctime)s | %(levelname)s]: %(message)s', datefmt='%m.%d.%Y %H:%M:%S', level=logging.INFO)

    logging.info('Info message??))')

if __name__ == '__main__':
    main()

Хотелось бы вывод и туда(консоль) и туда(файл), как это можно сделать?

import logging

file_log = logging.FileHandler('Log.log')
console_out = logging.StreamHandler()

logging.basicConfig(handlers=(file_log, console_out),
                    format='[%(asctime)s | %(levelname)s]: %(message)s',
                    datefmt='%m.%d.%Y %H:%M:%S',
                    level=logging.INFO)

logging.info('Info message??))')


Найти общие элементы во вложенных списках
Цель такова: найти общие элементы среди элементов в
list.
Допустим, имеется список:

x = [['c', 'p', 'd', 'a', 'b'], ['p', 'v', 'b'], ['s', 'p', 'v', 'b']]

Нужно сделать что-то такое, чтобы найти общие элементы в листах, которые в листе. Аналогично
x[0] & x[1] & x[2] (возвращает
{'p', 'b'}).
Лист используется не просто так, а потому, что неизвестно, сколько элементов в нем будет (от 1 до n).
Помогите найти самое простое решение, спасибо.

Решение через set.intersection:
<code>
>>> x = [['c', 'p', 'd', 'a', 'b'], ['p', 'v', 'b'], ['s', 'p', 'v', 'b']]
>>> set.intersection(*map(set, x))
{'b', 'p'}
</code>


Биннинг (категоризация) количественной переменной на категории
На примере набора данных Титаник, нужно создать столбец
Age_Cathegory который соответствует столбцу
Age по маппингу:

0-10 лет
Child,

10-20 лет
Teen,

20-max лет
Adult,
Нужно использовать функцию
map()

Для этого сущесвует специальная функция pd.cut():

df = pd.read_csv(r'C:\download\data\titanic\train.csv')

bins = [0, 10, 20, 150]
labels = ['Child','Teen','Adult']

df['age_cat'] = pd.cut(df['Age'], bins=bins, labels=labels)

результат:

In [124]: df[['Age','age_cat']].sample(frac=1)
Out[124]:
      Age age_cat
788   1.0   Child
67   19.0    Teen
593   NaN     NaN
343  25.0   Adult
446  13.0    Teen
310  24.0   Adult
74   32.0   Adult
..    ...     ...
879  56.0   Adult
817  31.0   Adult
438  64.0   Adult
217  42.0   Adult
693  25.0   Adult
498  25.0   Adult
326  61.0   Adult

[891 rows x 2 columns]


Как работает данная строка?
Объясните пожалуйста как работают эти 2 строки:

query = form.cleaned_data['query']
results = Post.objects.annotate(search=SearchVector('title', 'body')).filter(search=query)

views.py

def post_search(request):
    form = SearchForm()
    query = None
    results = []
    if 'query' in request.GET:
        form = SearchForm(request.GET)
        if form.is_valid():
            query = form.cleaned_data['query']
            results = Post.objects.annotate(search=SearchVector('title', 'body')).filter(search=query)
    return render(request,'blog/post/search.html',{'form': form,
                                                    'query': query,
                                                    'results': results})

forms.py

class SearchForm(forms.Form):
    query = forms.CharField()

query = form.cleaned_data['query']
Очень просто, получаем строку поиска. Например, пришел запрос следующего вида:
uri?tab=1&key=value&query=то%20что%20ввели%20в%20строку%20поиска
после валидации формы, то есть после вызова
form.is_valid() form.cleaned_data будет содержать словарь:
{'query': 'то что ввели в строку поиска'}
подробнее здесь.
annotate указывает как нужно составить SQL  запрос. SearchVector указывает по каким полям нужно проводить полнотекстовый поиск. Через filter передаем "аргументы" для SQL запроса.
Подробнее здесь и здесь.


read_sql превращает большие целые числа в числа с плавающей точкой - как этого избежать?
Всем привет.
Я беру данные из БД с помощью функции Pandas
read_sql().
В ней хранятся id, представляющие собой целое число из 20 знаков и которые могут быть null.
Особенность функции read_sql состоит в том, что если данные в поле содержат null, то тип данных поля переводится из int во float. В результате число переводится в экспоненциальный формат, но самое главное - теряется точность (а это неприемлемо):

    Код:
    print(int(float(10000000000000000000 + 1)))

    Результат:
    10000000000000000000

Я пытался использовать аргумент coerce_float = False, но это не работает.
Как можно с этим справиться?

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

qry = """SELECT cast(id as varchar), ... FROM table_name WHERE ..."""
df = pd.read_sql(qry, conn)


Django. Как в ModelAdmin в поле prepopulated_fields передать pk
Использую для генерации url поле SlugField в модели в связке с prepopulated_fields в админке, и для того чтобы поле slug было уникально решил передать параметр id в prepopulated_fields. Но Django выдает мне ошибку и говори что это поле нельзя использовать в prepopulated_fields. Как можно slug сделать уникальным(применение id в конце не обязательно), при том что поле с которого оно генерируется не уникально?
models.py

class Product(models.Model):
    title = models.CharField(max_length=50)
    slug = models.SlugField(unique=True)
    id = models.AutoField(primary_key=True)

admin.py

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title","id")}

Генерация slug по id
Вариант 1

class Product(models.Model):
    title = models.CharField(max_length=50)
    slug = models.SlugField(unique=True, blank = True, null=True)

    def save(self):
        super(Product, self).save()
        if not self.slug:
            self.slug = slugify(self.title) + '-' + str(self.id)
            super(Product, self).save()

В таком случае вам не нужно использовать
prepopulated_fields
Вариант 2
admin.py

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}

models.py

def save(self):
    super(Product, self).save()
    if not self.slug.endswith('-' + str(self.id)):
        self.slug += '-' + str(self.id)
        super(Product, self).save()


Python почему происходит AttributeError в цикле while?

import imaplib
import email

def main():
    mail = imaplib.IMAP4_SSL('imap.gmail.com')
    mail.login('********@gmail.com', '********')
    mail.list()
    while(True):
        # Ниже строка из-за которой ошибка!
        mail.select("inbox")  # Подключаемся к папке "входящие".
        result, data = mail.search(None, "ALL")

        ids = data[0]  # Получаем сроку номеров писем
        id_list = ids.split()  # Разделяем ID писем
        latest_email_id = id_list[-1]  # Берем последний ID

        result, data = mail.fetch(latest_email_id, "(RFC822)")  # Получаем тело письма (RFC822) для данного ID

        raw_email = data[0][1]  # Тело письма в необработанном виде
        # включает в себя заголовки и альтернативные полезные нагрузки

        mail = email.message_from_bytes(raw_email)

        a = mail.get_payload()[ 0 ].get_payload(decode=True)
        print(a.decode('utf-8'))

if __name__ == '__main__':
    main()

Почему срабатыавет
AttributeError: 'Message' object has no attribute 'select'?
При этом программа нормально продолжает работать и даже выводит последнее полученное на почту письмо.

mail = email.message_from_bytes(raw_email)
После первой итерации вы перезаписывете переменную mail
А она должна быть хэндлером для imap
mail = imaplib.IMAP4_SSL('imap.gmail.com')


AttributeError: 'int' object has no attribute 'get'
Не понимаю как исправить код, чтобы все заработало? Выдает эту ошибку: AttributeError: 'int' object has no attribute 'get'
<code>
from tkinter import *
from tkinter import messagebox

def spin():
    v=0
    if v.get()<10:
        v='0'+str(v.get())
    elif v.get()>9:
        v=str(v.get())

root=Tk()
root.title("Нумерация")
v=IntVar()

mes=Label(root,text='Выберите месяц')
mes.pack()
mes_1=Spinbox(root, textvariable=v, from_=1, to=12, command=spin)
mes_1.pack()
root.mainloop()
</code>

У числа нет метода
get(), который вы пытаетесь выполнить. Исправить нужно так:

if v < 10:
    v = '0'+str(v)
else:
    v = str(v)

А учитывая, что прямо перед этим вы присваиваете v = 0, то можно все сократить до

def spin():
    v = "00"

Второй вариант (то, что вам на самом деле нужно):

mes_1=Spinbox(root, values=("01", "02", "03", "04", "05", "06" и т.д.))

А функцию
spin() вообще удалить.


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

from PIL import Image, ImageDraw, ImageFont

class Blank():
    def __init___(self):
        self.loadImage()
        self.txt = Image.new('RGBA', self.img.size, (255,255,255,0))
        self.draw = ImageDraw.Draw(self.txt)

    def loadImage(self):
        try:
            self.img = Image.open('sts.png').convert("RGBA")
        except IOError:
            print("Unable to load image")
            sys.exit(1)

    def setSerialNumber(self, serial_number):
        (x, y) = (900, 50)
        message = serial_number
        font_serial = ImageFont.truetype('2057.ttf', size=43)
        self.draw.text((x, y), message, fill=(200, 0, 0, 255), font=font_serial)

    def saveImage(self):
        combined = Image.alpha_composite(self.img, self.txt)
        combined.save('sts_new.png')

вот так его вызываю

   sts = Blank()
   if request.method == 'POST':
      sts.setSerialNumber(request.form.get("serial_number"))
   sts.saveImage()

Но выдается ошибка

AttributeError: 'Blank' object has no attribute 'draw'

Почему он не видит этот атрибут, ведь он задается при создании класса?

Инициализация класса не выполняется, потому что в методе
__init___(self) слишком много подчеркиваний в названии, а именно - сзади три. Вот так правильно:

class Blank:
    def __init__(self):


Проверка наличия виджета во Фрейме
Всем привет, пишу небольшую программку с интерфейсом на Tkinter и столкнулся со сложностью.
Условно, при вызове функции (клике по значениям во Frame А), условные параметры передаются в соседний фрейм (Frame B) и визуализируются, каждый раз обновляясь в виджете Entry.
В зависимости от значения переданного параметра (например "OMS"), необходимо предоставить возможность выбора выполнить еще какую-то операцию (функцию), и для этого отрисовывается кнопка ("Do Smt").
Но после выбора следующего значения кнопка остается "висеть" во фрейме В.
Подскажите можно ли как-то реализовать проверку в функции user_choice наличия кнопки во Фрейме В и удаления ее.
Понимаю, что можно перед каждым вызовом user_choice() удалять все виджеты Frame B и отрисовывать их заново, но данное решение кажется костылем, хочется найти более деликатное решение
Код примера:
<code>
import tkinter as tk
from tkinter import ttk

class main_interface():
    def __init__(self):
        self.window = tk.Tk()
        self.window.geometry("20x450")
        self.create_widgets()

    def create_widgets(self):

        self.window['padx'] = 10
        self.window['pady'] = 10

        entry = ttk.Entry(self.window, width=30)
        entry.grid(row=1, column=1, sticky=tk.W, pady=3)

        frame1 = ttk.LabelFrame(self.window, text="Frame A", relief=tk.RIDGE, width=200, height=200)
        frame1.grid(row=1, column=1, sticky=tk.E + tk.W + tk.N + tk.S)

        frame2 = ttk.LabelFrame(self.window, text="Frame B", relief=tk.RIDGE, width=200, height=200)
        frame2.grid(row=1, column=2, sticky=tk.E + tk.W + tk.N + tk.S)

        entry = ttk.Entry(frame2, width=30)
        entry.grid(row=1, column=1, sticky=tk.W, pady=3)

        request = {"NSK": "9383XXXX",
                   "OMS": "9381XXXX",
                   "TMN": "9345XXXX",
                   "KZN": "9843XXXX",
                   "NNV": "9831XXXX"}

        for row, (key, value) in enumerate(request.items()):
            formated_text = " {} - {}".format(key, value)
            found_result_label = ttk.Label(frame1, text=formated_text)

            selected_string = key, value
            found_result_label.bind("<Button-1>", func=lambda event, text=selected_string: user_choice(text))
            found_result_label.grid(row=row, column=1, sticky=tk.W)

        def user_choice(text):

            entry.delete(0, "end")
            entry.insert(0, text)

            if text[0] == "OMS":
                button = ttk.Button(frame2, text="Do Smt", command=lambda: fx())
                button.grid(row=2, column=1, sticky=tk.W)

        def fx():
            pass

program = main_interface()
program.window.mainloop()
</code>

Можно записывать кнопку в поле объекта, при необходимости ее удалять
<code>
    self.button = None

    def user_choice(text):

        entry.delete(0, "end")
        entry.insert(0, text)

        if self.button:  # Если кнопка уже существует -
            self.button.destroy()  # уничтожить!!!
            self.button = None

        if text[0] == "OMS":
            self.button = ttk.Button(frame2, text="Do Smt", command=lambda: fx())
            self.button.grid(row=2, column=1, sticky=tk.W)
</code>


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

path = [0] * 2
sourcefile = 0
destinationfile = 0

print("Please write your source path:")
input(path[0])
print("Please write your destination path:")
input(path[1])
print("Source name of your file is ")
input(sourcefile)
print("Destination name of your file is ")
input(destinationfile)

with open(r"%s"+"%s" % (path[0], sourcefile), 'r') as file_in:

Проблема начинается на моменте
with open. Кто знает, прошу помочь.

Вот здесь

print("Please write your source path:")
input(path[0])

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

path[0] = input("Please write your source path: ")

И остальные инпуты переписать аналогично.


Можно ли при наследовании класса выполнить какой-то код?
Вот есть класс

class A:
    initialize = False

Есть другой класс

class B(A):
    initialize = True

Так вот мне нужно, если наследуется класс от класса A и initialize = True выполнить определенный код, так сказать __init__только как classmethod

class MyMeta(type):
    def __new__(cls, name, bases, attrs):
        print(f"{name}, initialize={attrs['initialize']}")

        if attrs['initialize']:
            attrs['SUPER_VALUE'] = 42
            attrs['run'] = lambda self=None: print('run!')

        attrs['reverse_initialize'] = not attrs['initialize']

        return super().__new__(cls, name, bases, attrs)

class A(metaclass=MyMeta):
    initialize = False

class B(A):
    initialize = True

print(hasattr(A, 'SUPER_VALUE'))  # False
print(hasattr(B, 'SUPER_VALUE'))  # True
print()

print(A.initialize, A.reverse_initialize)  # False True
print(B.initialize, B.reverse_initialize)  # True False
print()

print(B.SUPER_VALUE)  # 42
B.run()               # run!

b = B()
print(b.SUPER_VALUE)  # 42
b.run()               # run!


Не могу поймать логи в python
Пытаюсь компилировать файлы С через
os.system, а потом ловить логи с ошибками. Пробовал такое решение:

import os
import sys

class Logger(object):
    def __init__(self, filename="logfile.log"):
        self.terminal = sys.stdout
        self.log = open(filename, "a")

    def __getattr__(self, attr):
        return getattr(self.terminal, attr)

    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)

    def flush(self):
        pass

def compile_c(file_name: str):
    """
    Compile C file
    """
    os.system(f"gcc {file_name}")

if __name__ == "__main__":
    sys.stdout = Logger()
    compile_c("a.c")
    # print("Hello world")

Ошибки, которые появлялись в результате компиляции a.c не ловились и не записывались в файл. Пробовал везде менять
stdout на
stderr, но результата такая замена не дала.
Еще интересно узнать, куда оправляются логи при правильной работе программы (допустим, когда происходит сборка проекта с помощью
make), и как определить, какие логи содержать информацию об ошибке (следовательно компиляция не удалась).

Вызов системной команды через
os.system выполняется в
shell - подпроцессе и не дает возможности получить код возврата и содержимое потоков вывода. Для таких задач необходимо использовать функционал модуля subprocess.
В самом простом случае скрипт, вызывающий компилятор, выглядит так:

import subprocess
subprocess.run(['gcc', 'test.c']).check_returncode()

Поток вывода компилятора будет направлен в терминал, из которого вызван скрипт (общий вывод для вызываемой команды и интерпретатора).
Вызов
subprocess.run возвращает объект типа
CompletedProcess, метод
check_returncode которого бросает исключение в том случае, если код возврата выполняемой команды отличен от 0. Можно добавить обработчик исключения для совершения дополнительных действий.
У самой функции subprocess.run есть параметры для более гибкого управления потоками
I/O.
Еще более расширенным функционалом обладает менее высокоуровневый класс subprocess.Popen.

P.S. Если реальная задача - это не освоение принципов и способов совершения вызовов системных функций из питона, а именно сборка проектов на
C/C++, то полезно будет обратить внимание на готовые системы сборки.

Waf
SCons
Обзор систем сборки SCons и Waf


AttributeError: 'LinkedList' object has no attribute 'length' Не могу понять, как исправить ошибку
Ошибка возникает в этой строке self.length += 1
<code>
class Node:
    def init(self, value=None, next=None):
        self.value = value
        self.next = next
class LinkedList:
    def init(self):
        self.first = None
        self.last = None
        self.length = 0
    def str(self):
        if self.first != None:
            current = self.first
            out = 'LinkedList [\n' + str(current.value) + '\n'
            while current.next != None:
                current = current.next
                out += str(current.value) + '\n'
            return out + ']'
        return 'LinkedList []'

    def clear(self):
        self.init()

#добавление элементов в конец
    def add(self, x):
        a = timeit.default_timer()
        self.length += 1
        if self.first == None:
            # self.first и self.last будут указывать на одну область памяти
            self.last = self.first = Node(x, None)
        else:
            # здесь, уже на разные, т.к. произошло присваивание
            self.last.next = self.last = Node(x, None)
            print(timeit.default_timer() - a)

L = LinkedList()
L.add(1)

print(L)
L.add(15)
print(L)
</code>

Метод
__init__ должен иметь именно такое имя - с двойными подчёркиваниями в начале и в конце. Только при таком написании он будет автоматически срабатывать при создании объекта.
У вас же написано просто
init - такой метод не будет срабатывать автоматически, и если вы не запустите его явно, то он никогда и не выполнится.
Поэтому все атрибуты, которые в нём создаётся, не будут созданы, и у объекта не будет атрибута
.length


Python.Ожидание запроса
У меня есть основной цикл вида:

while True:
    for event in longpoll.listen():
        if event.type == VkBotEventType.MESSAGE_NEW:
              if sms == '!':
                   mes('Бла бла бла ответ')

Он ловит новые сообщения которому приходят боту, всё миленько и работает, но появилась нужна более сложных команд, то есть пользователь пишет к примеру "настройки" бот ему пишет вроде
"1-включить аниме,2-включать аниме всегда,3-автоматически убивать анимешников" пользователь отвечает и бот понимает, что цифра
2 это ответ на предыдущее сообщение, а не новая команда в основном цикле
Была идея реализовать через
time.sleep() Вроде засыплять бота и после конца засыпки смотреть что ответил человек, но идея в корне бредовая
Я нырнул в многопоточность:

def quest():
  t2 = threading.Thread(target=quest)
  t2.start()
  yt = 1
  while yt < 2:
     for event in longpoll.listen():
         if event.type == VkBotEventType.MESSAGE_NEW:
             if sms == 'подкоманда 1':
                 mes('ответ на подкоманду 1')
             if sms == 'конец настроек':
                 yt = yt +1
                 t2.join()

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

Чат-ботов удобно реализовывать на конечных автоматах.
Например:
<code>
from enum import Enum

# Допустимые состояния диалога
class State(Enum):
    INITIAL = 1
    SETTINGS = 2

# Допустимые настройки
class Anime(Enum):
    PLAY_ANIME = 1
    PLAY_ANIME_ALWAYS = 2
    AUTO_KILL_OTAKU = 3

# Текущее состояние
state = State.INITIAL

# Текущие настройки
settings = Anime.PLAY_ANIME

while True:
    for event in longpoll.listen():
        if event.type == VkBotEventType.MESSAGE_NEW:
            if state == State.INITIAL: # состояние INITIAL
                if sms == 'настройки':
                    state = State.SETTINGS # переходим в состояние SETTINGS
                    mes('1-включить аниме,2-включать аниме всегда,3-автоматически убивать анимешников')
                else:
                    mes('неверная команда')
            elif state == State.SETTINGS: # состояние SETTINGS
                if sms == '1':
                    settings = Anime.PLAY_ANIME
                    state == State.INITIAL # переходим в состояние INITIAL
                elif sms == '2':
                    settings = Anime.PLAY_ANIME_ALWAYS
                    state == State.INITIAL # переходим в состояние INITIAL
                elif sms == '3':
                    settings = Anime.AUTO_KILL_OTAKU
                    state == State.INITIAL # переходим в состояние INITIAL
                else:
                    mes('неверная команда')
</code>


VkBotLongPoll игнорирует сообщения из беседы
Попробовал написать чат-бота для вк, используя LongPoll. В чём проблема: на личные сообщения он реагирует, а сообщения из конференции игнорирует. Код:
<code>
import vk_api
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
import random

def main():
    replies = [ "ответ1", "ответ2", "ответ3" ]
    bot_session = vk_api.VkApi(token="Токен сообщества-бота, доступ ко всему")
    bot_api = bot_session.get_api()
    longpoll = VkBotLongPoll(bot_session, "id сообщества-бота")
    for event in longpoll.listen():
        print("got event")
        if event.type == VkBotEventType.MESSAGE_NEW:
            print("message")
            bot_api.messages.send(
                random_id   =   random.getrandbits(32),
                peer_id     =   event.obj.peer_id,
                message     =   random.choice(replies)
                )

if __name__ == '__main__':
    main()
</code>
При написании сообщений в беседе в консоли даже не появляется "got event". В настройках LongPoll сервера указано реагирование только на входящие сообщения и добавления записей на стену.

Решение: Бота необходимо было упомянуть (например,
@club66666 Эй ты), либо администратор беседы должен дать ему полный доступ к переписке. Также добавлю, что слушание Long Poll сервера следует обернуть в
try except, ибо в случае простоя он валится и бросает исключение таймаута. В коде это выглядит так:

import requests

bot_session = vk_api.VkApi(token="Токен сообщества-бота, доступ ко всему")
bot_api = bot_session.get_api()
while True:
    longpoll = VkBotLongPoll(bot_session, "id сообщества-бота")
    try:
        for event in longpoll.listen():
            #...
    except requests.exceptions.ReadTimeout as timeout:
        continue


Получаю ошибку при попытке отправки сообщения в беседу через VK_API Python
Играюсь с ботостроением и решил отправить сообщение в беседу, делаю такой код:

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-
import time
import vk_api
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
from vk_api.utils import get_random_id

def main():
        vk_session = vk_api.VkApi(token='ТОКЕН')
        vk = vk_session.get_api()
        longpoll = VkBotLongPoll(vk_session, 'ИД ГРУППЫ')

        for event in longpoll.listen():

                if event.obj.text == '[clubСКРЫТО|*СКРЫТО] ответь':
                    vk.messages.send(
                        random_id=get_random_id(),
                        chat_id = 111,
                        #peer_id = 2000000111,
                        message='Heh'
                        )

if __name__ == '__main__':
    main()

Но на выходе получаю:

Traceback (most recent call last):
  File "./2pb.py", line 24, in <module>
    main()
  File "./2pb.py", line 20, in main
    message='Heh'
  File "/home/boss/.local/lib/python3.5/site-packages/vk_api/vk_api.py", line 671, in __call__
    return self._vk.method(self._method, kwargs)
  File "/home/boss/.local/lib/python3.5/site-packages/vk_api/vk_api.py", line 636, in method
    raise error
vk_api.exceptions.ApiError: [10] Internal server error

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

Ключ сгенерирован на полный доступ.

В чем проблема? Подскажите пожалуйста.

Решение: в методе
messages.send получателя указать, как
peer_id = event.obj.peer_id

vk.messages.send(
    random_id   =   get_random_id(),
    peer_id     =   event.obj.peer_id,
    message     =   'Heh'
    )

В таком случае бот будет отвечать, если: 1 - ему написали в личку, 2 - его упомянули в беседе. По хорошему ещё стоит проверять, что за событие мы ловим из
longpoll.listen():

if event.type == VkBotEventType.MESSAGE_NEW:
    vk.messages.send(
        random_id   =   get_random_id(),
        peer_id     =   event.obj.peer_id,
        message     =   'Heh'
        )


Нужно отличать str и int в input() Python 3.7.2
Нужно чтобы input() получал только строку и ничего больше кроме строк.

While True:
  text = input()
  print(type(text))

>> 12345
>> <class 'str'>
>> hello
>> <class 'str'>

В этом и проблема, нужно разграничивать их, а как это сделать что-то не доходит. Знаю про
raw_input() который был убран из python и переименован в
input(), он вроде как получал только строку. И еще пытался писать всякие исключения по типа

try:
   text = str(input())
except ValueError:
   print('Enter only string, please')

Это не работает, можно ввести как строку так и числа. А нужно только строку :) Помогите!

Всё, что вводится в
input() на выходе является строкой. Если вам не нужны числа, то можно проверить введенную строку функцией isalpha():

while True:
    text = input(" ")
    if text.isalpha():
        break
    else:
        print('Enter only string, please')

Если во введенной строке разрешены пробелы и знаки препинания, то пригодится isnumeric():

if not text.isnumeric():


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

        CREATE TABLE some_name (
fv int,
sv int,
tv int)
CLUSTERED BY (fv,
              sv,
              tv)
SORTED BY (fv,
           sv,
           tv) INTO 2 BUCKETS;
-- more text afterwards

Мне нужно сделать так, чтобы скрипт стирал все слова от Clustered включительно до Buckets включительно, но точку с запятой к примеру не стирал. Как можно реализовать код? Мне предлагали такой:

start_word = "CLUSTERED"
end_word = "BUCKETS"

result_lines = []

with open(target_file, 'r') as f:
    erasing = False
    for line in f:
        if not erasing and start_word in line:
            // begin erasing lines
            erasing = True
            continue

        if erasing and end_word in line:
            // finished erasing lines
            erasing = False
            continue

        if erasing:
            // we are between the start and end of the section we want to erase
            continue
        else:
            // either we haven't started erasing or we have already finished
            result_lines.append(line)

print('\n'.join(result_lines))

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

 CREATE TABLE some_name (
fv int,
sv int,
tv int)
-- more text afterwards;

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

import re

#text = """
#CREATE TABLE some_name (
#fv int,
#sv int,
#tv int)
#CLUSTERED BY (fv,
#              sv,
#              tv)
#SORTED BY (fv,
#           sv,
#           tv) INTO 2 BUCKETS;
#-- more text afterwards
#"""

with open(target_file, 'r') as f:
    text = f.read()
res = re.sub('CLUSTERED[\s\b\n\r]+[^;]*', '', text)
print(res)

CREATE TABLE some_name (
fv int,
sv int,
tv int)
;
-- more text afterwards


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

    nums = int(input("Сколько чисел: "))
    for number in range(1, nums+1):
        nums2 = int(input(f"Введите число {number}: "))
        numbers.append(nums2)
    numbers.sort()
    for num in numbers:
        num2 = int(num)
        while delitels != num:
            delimiy = 1
            while delimiy < num2:
                delimiy += 1
                if num2 % delimiy == 0:
                    break
            num2 /= delimiy
            delitels = delitels * delimiy
            deliteli2 += str(delimiy)
        alldels3.append(deliteli2)
        delitels = 1
        deliteli2 = []
        print(alldels3)

Дело в этой строке

deliteli2 += str(delimiy)

Если вы делаете
+= для списка, то это даёт тот же результат, что и метод
extend. Подробнее можно прочитать здесь.
Таким образом ваша строка не добавляется к списку, как один элемент. Вместо этого интерпретатор посимвольно итерируется по строке, и добавляет к списку каждый символ как отдельный элемент.
Чтобы ваш код работал так, как вы хотите, замените эту строку на

deliteli2.append(delimiy)

PS: И в будущем когда приводите в вопросе код, убедитесь, что он вообще запускается. Иначе вероятность того, что вам помогут, сильно снижается.


При записывании отрицательного числа пишет "not all arguments converted during string formatting"
При записывании отрицательного числа пишет “not all arguments converted during string formatting”
<code>
import math
print("y=3,4x^2 при x<0, y=6√x при x>0")
x = float(input("x = "))
if x<0:
     y=3,4*x*x
elif x==0:
     y=0
else:
     y=6*math.sqrt(x)
print('y = %.2f' % y)
</code>

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

y=3.4*x*x

Если там стоит запятая, то в
y сохраняется не одно число, а кортеж из двух чисел -
(3, 4*x*x).

Подсказка на будущее: если происходит что-то непонятное, то просто выводите на печать содержимое переменных. Например, в этом случае строчка
print (y) после
if...elif...else показала бы, что в
y сохраняется не число, а кортеж.


Как посчитать количество слов в введенном тексте?
<code>
from tkinter import *
from tkinter.filedialog import askopenfilename, asksaveasfilename
from tkinter.messagebox import *
import fileinput
import subprocess

sa = None

def _open():
    global sa
    sa = askopenfilename()
    print(sa)
    f = open(sa, "r", encoding='utf-8')
    content = f.read()
    txt.delete(1.0, END)
    txt.insert(END, content)

def _save():
    global sa
    global content
    content = txt.get(1.0, END)
    f = open(sa, "w", encoding='utf-8')
    f.write(content)
    f.close()

def _about():
    win = Toplevel(root)
    win.iconbitmap('First_String.ico')
    win.geometry('300x200')
    lab = Label(win, text="First string version 1.4\n"
                          "Developer:NewModernSoft\n"
                          "2019.02.16\n"
                          "Copyrighted by NewModernSoft©")
    lab.pack()

def _exit():
    global sa
    if askyesno("Exit", "Saved changes?"):
        if sa is None:
            sa = asksaveasfilename(defaultextension=".txt", filetypes=(("text file", "*.txt"), ("All Files", "*.*")))
        _save()
    root.destroy()

def _newwindow():
    subprocess.call('First_String.exe')

root = Tk()
scrollbar = Scrollbar(root)
scrollbar.pack(side=RIGHT, fill=Y)

root.geometry("1000x800")

root.iconbitmap('First_String.ico')

root.title("First String")

txt = Text(root, width=110, height=500, font='14', yscrollcommand=scrollbar.set)

frame = Frame(root, height=30)
l1 = Label(frame, text="Word count:")
l2 = Label(frame, )
frame.pack(side=BOTTOM)
l1.pack(side=LEFT)
l2.pack(side=LEFT)

txt.pack(side=LEFT, fill=BOTH)
scrollbar.config(command=txt.yview)
scrollbar.bind('<MouseWheel>')

m = Menu(root)
root.config(menu=m)

fm = Menu(m)
m.add_cascade(label="File", menu=fm)
fm.add_command(label="New", command=_newwindow)
fm.add_command(label="Open", command=_open)
fm.add_command(label="Save", command=_save)

hm = Menu(m)
m.add_cascade(label="Help", menu=hm)
hm.add_command(label="About Program", command=_about)
hm.add_command(label="Exit", command=_exit)

root.protocol("WM_DELETE_WINDOW", _exit)

root.mainloop()
</code>

Можно регуляркой сделать разбиение символом, но чтобы в результат не попали знаки пунктуации и т.п. придется сделать дополнительную обработку или использовать другую регулярку -- для поиска определенной последовательности символов (например
findall(r'\b[\S]+\b', txt)):

from re import split

txt = """First string version 1.4
         Developer:NewModernSoft
         2019.02.16
         Copyrighted by NewModernSoft©
      """

# filter уберет пустые элементы
words = list(filter(None, split(r'\s+', txt)))
print(words)
# ['First', 'string', 'version', '1.4', 'Developer:NewModernSoft',
#  '2019.02.16', 'Copyrighted', 'by', "NewModernSoft©"]

print(len(words))  # 9

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


Pandas - как отфильтровать DataFrame по значению,присутствующему в другом DataFrame?
Задача. Есть два DataFrame. В одном список того, что нас интересует, в другом - некоторые операционные данные, возможно содержащие интересующие нас строки:

import pandas as pd
df_report = pd.DataFrame({'key':["a01","a02","b07"], 'lookup':[True,False,True]})
df_work = pd.DataFrame({'key':["a01","a01","b03","a01","a01","a01"],
                            'category':["good","good","broken","good","broken","good"],
                            'quantity':[3,2,1,1,2,5],
                           })
df_result = pd.DataFrame(columns = df_work.columns, data = None)
for key in set(df_report['key']):
    slice = df_work[df_work['key']==key]
    if not slice.empty:
        df_result = df_result.append(slice, ignore_index=True)
df_result

выдает желаемое:

   key  category quantity
0 a01    good       3
1 a01    good       2
2 a01    good       1
3 a01   broken      2
4 a01    good       5

то есть я хочу получить DataFrame, в котором есть только те строки
df_work, поле
key в которых встречается в поле
key из
df_report.
Весь этот огород я написал, т.к.

df_work.query('"key" in df_report["key"]')

выдает ошибку
UndefinedVariableError: name 'df_report' is not defined.
Есть более изящный способ отфильтровать DataFrame желаемым образом за пару строк?

Можно с помощью метода
isin():

df_work[df_work.key.isin(df_report.key)].reset_index(drop=True)

С помощью
query (переменные обозначаются знаком
@):

df_work.query("key in @df_report.key").reset_index(drop=True)


name 'sift_down' is not defined [закрыт]

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

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

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

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

<code>
class Heap():

    def __init__(self, array):
        self.array = array

    def add(self, elem_with_priority):
        self.array.append(elem_with_priority)
        sift_up(len(self.array) - 1)

    def build_heap(self):
        for idx in reversed(range(int(len(self.array) / 2 - 1))):
            sift_down(idx)

    def sift_down(self, idx):
        left, right = 2 * idx + 1, 2 * idx + 2
        largest = idx
        if left < len(self.array) and self.array[left][1] > self.array[idx][1]:
            largest = left
        if right < len(self.array) and self.array[right][1] > self.array[idx][1]:
            largest = right
        if largest != idx:
            self.array[idx], self.array[largest] = self.array[largest], self.array[idx]
            sift_down(largest)

    def sift_up(self, idx):
        while idx > 0:
            parent = int(idx - 1) / 2
            if self.array[idx][1] <= self.array[parent][1]:
                return
            self.array[idx], self.array[parent] = self.array[parent], self.array[idx]
            idx = parent

a = Heap([(1,2), (3,4), (5,4), (13,3), (175, 80), (22,17)])

a.build_heap()
</code>

Функции
sift_down и ей подобные объявлены не глобально, а внутри класса, поэтому нужно их вызывать от текущего объекта
self:

self.sift_down(idx)

Это касается и
sift_up


Форматирование вывода в numpy?
Стало интересно, как производится форматирование в numpy as np. При генерации рандомной строки / массива, необходимо оставить два знака после запятой, но хотелось бы сохранить их для дальнейшего вывода.
Собственно сам код:
<code>
import numpy as np
def randoms():
    return np.random.uniform(65.0, 70.0, 4)
exchange_1 = randoms()
exchange_1_twosigns = []
for i in exchange_1:
    x = round(i, 2)
    exchange_1_twosigns.append(x)
</code>
Код получился длинный и не красивы, я только учусь. Возможно есть решение и проще, но я не смог его подобрать / найти.
Спасибо большое!

Воспользуйтесь методом ndarray.round():

In [4]: exchange_1.round(2)
Out[4]: array([65.43, 65.44, 69.92, 67.57])

UPDATE:  опции вывода на печать можно установить в рамках контекста - пример:

In [43]: print(exchange_1)
[68.42909774 67.97871401 66.90487171 68.89564863]

In [44]: with np.printoptions(precision=2):
    ...:     print(exchange_1)
    ...:
[68.43 67.98 66.9  68.9 ]

после выхода из блока
with ... действуют старые опции:

In [45]: print(exchange_1)
[68.42909774 67.97871401 66.90487171 68.89564863]


Как работает set()?
Есть код:

p1 = [4, 9, 12, 6]
p2 = [4, 9, 12, 6, 8]
print(set(p1))
print(set(p2))

Вывод:

{9, 4, 12, 6}
{4, 6, 8, 9, 12}

Почему p1 - не сортирован, а p2 - отсортирован ?
Спасибо!

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


Методы шифровки и дешифровки строки
Как сделать метод рабочий метод дешифровки

from Cryptodome.Cipher import DES

key = b'abcdefgh'
text = 'hdjfhjh'

def encrypt(key, text):
    des = DES.new(key, DES.MODE_ECB)
    l_text = b'{text}'
    while len(l_text) % 8 != 0:
        l_text += b' '
    padded_text = l_text
    encrypted_text = des.encrypt(padded_text)
    return encrypted_text

print(encrypt(key, text))

Результат:
b'[d\x81\xe5\xda\xc8\x8c,'
и можно ли получить чисто строку без " b' ' "

HEX.
Переменная
encrypted_text является байтовым массивом (
bytes) для читабельного представления байтов можно их показывать в виде HEX строки, используя bytes.hex.
Например, строка в вопросе станет такой:

print(b'[d\x81\xe5\xda\xc8\x8c'.hex())  # 5b6481e5dac88c

А чтобы это работало в функции
encrypt из вопроса:

return encrypted_text.hex()

Для обратного получения байтов из HEX строки используйте метод bytes.fromhex:

print(bytes.fromhex('5b6481e5dac88c'))  # b'[d\x81\xe5\xda\xc8\x8c'

Base64.
Еще можно вернуть строку закодированную как Base64. Для этого используйте метод base64.b64encode:

import base64

data = b'[d\x81\xe5\xda\xc8\x8c'

# Результат будет в виде байтов
print(base64.b64encode(data))                  # b'W2SB5drIjA=='

# Результат в виде строки
print(base64.b64encode(data).decode('utf-8'))  # W2SB5drIjA==

А чтобы это работало в функции
encrypt из вопроса (возвращая строку):

return base64.b64encode(encrypted_text).decode('utf-8')

Для получения байтов из base64 строки используйте метод base64.b64decode:

# Получение байтов из Base64 строки
print(base64.b64decode(b'W2SB5drIjA=='))       # b'[d\x81\xe5\xda\xc8\x8c'

PS.
Что-то я увлекся темой представления байтов и не заметил вопрос о расшифровки.
Попробуйте:

from Cryptodome.Cipher import DES

def pad(s: bytes, bs=8) -> bytes:
    pad_size = bs - (len(s) % bs)
    return s + bytes([pad_size] * pad_size)

def unpad(s: bytes) -> bytes:
    pad_size = s[-1]
    return s[:-pad_size]

def encrypt(key: bytes, text: str) -> bytes:
    des = DES.new(key, DES.MODE_ECB)
    l_text = bytes(text, 'utf-8')
    padded_text = pad(l_text)
    encrypted_text = des.encrypt(padded_text)
    return encrypted_text

def decrypt(key: bytes, cipher_text: bytes) -> str:
    des = DES.new(key, DES.MODE_ECB)
    text = des.decrypt(cipher_text)
    return unpad(text).decode('utf-8')

key = b'abcdefgh'
text = 'hdjfhjh'

cipher_text = encrypt(key, text)
print(cipher_text)                # b'\xce{\x17\xdd\xf7\xe3\xef\xe1'
print(decrypt(key, cipher_text))  # hdjfhjh

Код для
pad и
unpad взял отсюда.


Python вычисление евклидова расстояния в большой базе
Собрал многомиллионную базу лиц с признаками 128 векторов. Для поиска похожих лиц использую векторы искомого лица вычисляя с каждой записью базы алгоритмом евклидова расстояния:
<code>
math.sqrt(pow(sv1 - v1, 2) + pow(sv2 - v2, 2) + ...[128 векторов])
</code>

результат если меньше 0,6 значит похожее лицо. где sv - вектора
  искомого лица, и v - вектора каждой записи из базы.

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

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


перебор из БД по разным необязательным параметрам в Python
Есть программа, которая ищет по БД перебором сотрудников, проверяя их по необязательным параметрам, например:

position = input('enter position')
sex = input('sex')
age = input('age')
...etc

далее программа перебором (по определенным причинам нужен именно перебор) проверяет каждого сотрудника на соответствие введенным критериям, и если совпадает- выводит сотрудника например в
print().
Вся загвоздка в том, что параметры не обязательные, и если ничего не введено- переменной присваивается
null.
первое что приходит в голову- проверять по всем комбинациям параметров, например:

if position != null and sex != null and age != null:
    print('yep!')
elif position == null and sex != null and age != null:
    print('yep2!')
...etc

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

Для начала я бы посоветовал присваивать пустым переменным не null, a None - в этом случае будут корректно работать предикаты. А затем делаете простейший итератор:

sex = None
position = "blah"
age=96

for elem in (position, sex, age):
    if elem:
        print(elem)

Получим:

blah
96

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

params={}
params["sex"] = None
params["position"] = "queen"
params["age"] = 96

for elem in params.keys():
    if params[elem]:
        print(params[elem])

Получим:

queen
96


Python зависание multiprocessing
Установил Анаконду с Спайдером. Беру код из туториала
<code>
    from multiprocessing import Pool
    def f(x):
        return x*x
    print(pool.map(f, range(10)))
</code>
В итоге ничего не выполняется и все зависает. Что делать?

Вдруг поможет.
Note Functionality within this package requires that the main module be importable by the children. This is covered in Programming guidelines however it is worth pointing out here. This means that some examples, such as the multiprocessing.pool.Pool examples will not work in the interactive interpreter. For example:

>>> from multiprocessing import Pool
>>> p = Pool(5)
>>> def f(x):
...     return x*x
...
>>> p.map(f, [1,2,3])
Process PoolWorker-1:
Process PoolWorker-2:
Process PoolWorker-3:
Traceback (most recent call last):
AttributeError: 'module' object has no attribute 'f'
AttributeError: 'module' object has no attribute 'f'
AttributeError: 'module' object has no attribute 'f'

(If you try this it will actually output three full tracebacks interleaved in a semi-random fashion, and then you may have to stop the master process somehow.)
Вот ваш пример ---

The following example demonstrates the use of a pool:

from multiprocessing import Pool
import time

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(processes=4) as pool:         # start 4 worker processes
        result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously in a single process
        print(result.get(timeout=1))        # prints "100" unless your computer is *very* slow

        print(pool.map(f, range(10)))       # prints "[0, 1, 4,..., 81]"

        it = pool.imap(f, range(10))
        print(next(it))                     # prints "0"
        print(next(it))                     # prints "1"
        print(it.next(timeout=1))           # prints "4" unless your computer is *very* slow

        result = pool.apply_async(time.sleep, (10,))
        print(result.get(timeout=1))        # raises multiprocessing.TimeoutErro


Вк-бот отвечает в ЛС, но не отвечает в беседах, что делать?
Написал коротенького бота для тестирования функций. Загвоздка в том, что он отвечает только в сообщениях группы, но не в чаты. Не могу найти причину, не появляется никакой ошибки.
<code>
from vk_api.longpoll import VkLongPoll, VkEventType
import vk_api
from datetime import datetime
import time

def write_msg(user_id, random_id, message):
    vk_session.method('messages.send', {'user_id': user_id, "random_id":
random_id, 'message': message})

token = "тут мой токен"
vk_session = vk_api.VkApi(token=token)

session_api = vk_session.get_api()
longpoll = VkLongPoll(vk_session)

for event in longpoll.listen():
    if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
        if event.from_user:
            write_msg(event.user_id, event.random_id, "первая фраза")
        elif event.from_chat:
            write_msg(event.сhat_id, event.random_id, "вторая фраза")
    time.sleep(1)
</code>

Бот должен быть добавлен в беседу (Для этого необходимо включить
Возможности ботов (
Управление->Сообщения->Настройки для бота) и разрешить добавлять его в беседы (там же)).
Для использования
Long Poll необходимо включить
Long Poll Api (
Управление->Настройки->Работа с API->Long Poll API) и указать, какие события Вы хотите ловить (
Типы событий).
Для бота-сообщества следует использовать
vk_api.bot_longpoll.
Чтобы бот увидел сообщение, его необходимо упомянуть (например, @club666666), либо администратор беседы должен дать ему полный доступ к переписке.

Советую посмотреть: Получаю ошибку при попытке отправки сообщения в беседу через VK_API Python
Вчера сам столкнулся с такой проблемой, сегодня описал решение: VkBotLongPoll игнорирует сообщения из беседы


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

I/SystemServiceManager(  954): Starting com.android.server.usb.UsbService$Lifecycle
I/auditd  (  954): type=1400 audit(0.0:141): avc: denied { read } for comm="system_server" name="u:object_r:usb_config_prop:s0" dev="tmpfs" ino=2361 scontext=u:r:system_server:s0 tcontext=u:object_r:usb_config_prop:s0 tclass=file permissive=1
I/auditd  (  954): type=1400 audit(0.0:142): avc: denied { open } for comm="system_server" path="/dev/__properties__/u:object_r:usb_config_prop:s0" dev="tmpfs" ino=2361 scontext=u:r:system_server:s0 tcontext=u:object_r:usb_config_prop:s0 tclass=file permissive=1
I/auditd  (  954): type=1400 audit(0.0:143): avc: denied { getattr } for comm="system_server" path="/dev/__properties__/u:object_r:usb_config_prop:s0" dev="tmpfs" ino=2361 scontext=u:r:system_server:s0 tcontext=u:object_r:usb_config_prop:s0 tclass=file permissive=1
D/UsbDeviceManager(  954): setEnabledFunctions functions=null, forceRestart=false
I/UsbDeviceManager(  954): Setting USB config to adb
D/UsbDeviceManager(  954): setUsbConfig(none)
I/ActivityManager(  954): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.settings/.CryptKeeper} from uid 0 on display 0

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

with open('log.txt') as input_file, open('allows.txt', 'w') as output_file:
    text = input_file.read()
    for prop in re.findall(': (.+?) {', text):
        newline = '{} \n'.format(prop)
        output_file.write(newline)

но это получается довольно криво, т.к проходят и другие строки без
avc: denied), а затем сделать проверку, мол, если
avc: denied в строке есть, то она полностью копируется в файл, только додуматься к этому я не смог. Я правильно понимаю принцип?

with open('log.txt') as input_file, open('allows.txt', 'w') as output_file:
    output_file.writelines(i for i in input_file if 'avc: denied' in i)