как записать словарь в csv?
всем привет! Небольшая проблемка. Есть csv, его нужно считать и данные с определённых полей записать в другой csv. Исходный файл я зачитал в словарь, но при записи в конечный файл записывается только последня строка исходго файла, но во все строки где должны быть другие данные. Немогу понять что не так.
<code>
import csv

d = {}

with open("dhl.csv", "r") as f:
    reader = csv.DictReader(f, delimiter = ";")
    for row in reader:
        d.update(row)

        with open("DHL-VLS-Export.csv", "w", newline = "") as output:
            names = ['Sendungsnummer', 'Sendungsdatum', 'Absender Name 1', 'Absender Name 2', 'Absender Name 3', 'Absender Straße', 'Absender Hausnummer', 'Absender PLZ', 'Absender Ort', 'Absender Provinz', 'Absender Land', 'Absenderreferenz', 'Absender E-Mail-Adresse', 'Absender Telefonnummer', 'Empfänger Name 1', 'Empfänger Name 2 / Postnummer', 'Empfänger Name 3', 'Empfänger Straße', 'Empfänger Hausnummer', 'Empfänger PLZ', 'Empfänger Ort', 'Empfänger Provinz', 'Empfänger Land', 'Empfängerreferenz', 'Empfänger E-Mail-Adresse', 'Empfänger Telefonnummer', 'Gewicht', 'Länge', 'Breite', 'Höhe', 'Produkt- und Servicedetails', 'Retourenempfänger Name 1', 'Retourenempfänger Name 2', 'Retourenempfänger Name 3', 'Retourenempfänger Straße', 'Retourenempfänger Hausnummer', 'Sendungsreferenz', 'Retourenempfänger Ort', 'Retourenempfänger Provinz', 'Retourenempfänger Land', 'Retourenrempfänger E-Mail-Adresse', 'Retourenempfänger Telefonnummer', 'Retouren-Abrechnungsnummer', 'Abrechnungsnummer', 'Service - Versandbestätigung - E-Mail Text-Vorlage', 'Service - Versandbestätigung - E-Mail-Adresse', 'Service - Nachnahme - Kontoreferenz', 'Service - Nachnahme - Betrag', 'Service - Nachnahme - IBAN', 'Service - Nachnahme - BIC', 'Service - Nachnahme - Zahlungsempfänger', 'Service - Nachnahme - Bankname', 'Service - Nachnahme - Verwendungszweck 1', 'Service - Nachnahme - Verwendungszweck 2', 'Service - Transportversicherung - Betrag', 'Service - Weltpaket - Vorausverfügungstyp', 'Service - DHL Europaket - Frankaturtyp', 'Sendungsdokumente - Ausfuhranmeldung', 'Sendungsdokumente - Rechnungsnummer', 'Sendungsdokumente - Genehmigungsnummer', 'Sendungsdokumente - Bescheinigungsnummer', 'Sendungsdokumente - Sendungsart', 'Sendungsdokumente - Beschreibung', 'Sendungsdokumente - Entgelte', 'Sendungsdokumente - Gesamtnettogewicht', 'Sendungsdokumente - Beschreibung (WP1)', 'Sendungsdokumente - Menge (WP1)', 'Sendungsdokumente - Zollwert (WP1)', 'Sendungsdokumente - Ursprungsland (WP1)', 'Sendungsdokumente - Zolltarifnummer (WP1)', 'Sendungsdokumente - Gewicht (WP1)', 'Sendungsdokumente - Beschreibung (WP2)', 'Sendungsdokumente - Menge (WP2)', 'Sendungsdokumente - Zollwert (WP2)', 'Sendungsdokumente - Ursprungsland (WP2)', 'Sendungsdokumente - Zolltarifnummer (WP2)', 'Sendungsdokumente - Gewicht (WP2)', 'Sendungsdokumente - Beschreibung (WP3)', 'Sendungsdokumente - Menge (WP3)', 'Sendungsdokumente - Zollwert (WP3)', 'Sendungsdokumente - Ursprungsland (WP3)', 'Sendungsdokumente - Zolltarifnummer (WP3)', 'Sendungsdokumente - Gewicht (WP3)', 'Sendungsdokumente - Beschreibung (WP4)', 'Sendungsdokumente - Menge (WP4)', 'Sendungsdokumente - Zollwert (WP4)', 'Sendungsdokumente - Ursprungsland (WP4)', 'Sendungsdokumente - Zolltarifnummer (WP4)', 'Sendungsdokumente - Gewicht (WP4)', 'Sendungsdokumente - Beschreibung (WP5)', 'Sendungsdokumente - Menge (WP5)', 'Sendungsdokumente - Zollwert (WP5)', 'Sendungsdokumente - Ursprungsland (WP5)', 'Sendungsdokumente - Zolltarifnummer (WP5)', 'Sendungsdokumente - Gewicht (WP5)', 'Sendungsdokumente - Beschreibung (WP6)', 'Sendungsdokumente - Menge (WP6)', 'Sendungsdokumente - Zollwert (WP6)', 'Sendungsdokumente - Ursprungsland (WP6)', 'Sendungsdokumente - Zolltarifnummer (WP6)', 'Sendungsdokumente - Gewicht (WP6)', 'Sendungsnummer', 'Sendungsreferenz (Retoure)', 'Absender Adresszusatz 1', 'Absender Adresszusatz 2', 'Absender Zustellinformation', 'Absender Ansprechpartner', 'Empfänger Adresszusatz 1', 'Empfänger Adresszusatz 2', 'Empfänger Zustellinformation', 'Empfänger Ansprechpartner', 'Retourenempfänger Adresszusatz 1', 'Retourenempfänger Adresszusatz 2', 'Retourenempfänger Zustellinformation', 'Retourenempfänger Ansprechpartner', 'Service - Wunschnachbar - Details', 'Service - Wunschort - Details', 'Service - Alterssichtprüfung - Altersgrenze', 'Service - Sendungshandling', 'Service - beliebiger Hinweistext', 'Service - Zustelldatum', 'Service - Zustellzeitfenster', 'Service - Vorausverfügung', 'Sendungsdokumente - Einlieferungsstelle', 'Sendungsnummer (Retoure)']
            writer = csv.DictWriter(output, delimiter = ";", fieldnames = names)
            writer.writeheader()
            for i in d.items():
                writer.writerow({

                    'Sendungsnummer':d["TRACKINGNR"],
                    'Empfänger Name 1': d["EMPF_NAME1"],
                    'Sendungsdatum': d["AUSGANGDATETIME"],
                    'Absender Name 1': "TS Autoteiel UG",
                    'Absender Name 2': "(haftungsbeschränkt)",
                    'Absender Straße': "Scheideweg",
                    'Absender Hausnummer': "42",
                    'Absender PLZ': "26121",
                    'Absender Ort': "Oldenburg",
                    'Absender Land': "DEU",
                    'Absender E-Mail-Adresse': "[email protected]",
                    'Absender Telefonnummer': "0176-72165481",
                    'Empfänger Name 1': d["EMPF_NAME1"],
                    'Empfänger Name 2 / Postnummer': d["EMPF_NAME2"],
                    'Empfänger Name 3': d["EMPF_NAME3"],
                    'Empfänger Straße': d["EMPF_STRASSE"],
                    'Empfänger PLZ': d["EMPF_PLZ"],
                    'Empfänger Ort': d["EMPF_ORT"],
                    'Empfänger Land': "DEU",
                    'Produkt- und Servicedetails': "V01PAK",
                    'Sendungsreferenz': d["REFERENZNR"],
                    'Abrechnungsnummer': "52052678290101",
                    'Sendungsnummer': d["TRACKINGNR"]})
</code>

Упрощенное решение с использованием модуля Pandas:
<code>
import pandas as pd  # pip install pandas

# __all__ column names in the source CSV file
names = ['Sendungsnummer', 'Sendungsdatum', 'Absender Name 1', 'Absender Name 2', 'Absender Name 3', 'Absender Straße', 'Absender Hausnummer', 'Absender PLZ', 'Absender Ort', 'Absender Provinz', 'Absender Land', 'Absenderreferenz', 'Absender E-Mail-Adresse', 'Absender Telefonnummer', 'Empfänger Name 1', 'Empfänger Name 2 / Postnummer', 'Empfänger Name 3', 'Empfänger Straße', 'Empfänger Hausnummer', 'Empfänger PLZ', 'Empfänger Ort', 'Empfänger Provinz', 'Empfänger Land', 'Empfängerreferenz', 'Empfänger E-Mail-Adresse', 'Empfänger Telefonnummer', 'Gewicht', 'Länge', 'Breite', 'Höhe', 'Produkt- und Servicedetails', 'Retourenempfänger Name 1', 'Retourenempfänger Name 2', 'Retourenempfänger Name 3', 'Retourenempfänger Straße', 'Retourenempfänger Hausnummer', 'Sendungsreferenz', 'Retourenempfänger Ort', 'Retourenempfänger Provinz', 'Retourenempfänger Land', 'Retourenrempfänger E-Mail-Adresse', 'Retourenempfänger Telefonnummer', 'Retouren-Abrechnungsnummer', 'Abrechnungsnummer', 'Service - Versandbestätigung - E-Mail Text-Vorlage', 'Service - Versandbestätigung - E-Mail-Adresse', 'Service - Nachnahme - Kontoreferenz', 'Service - Nachnahme - Betrag', 'Service - Nachnahme - IBAN', 'Service - Nachnahme - BIC', 'Service - Nachnahme - Zahlungsempfänger', 'Service - Nachnahme - Bankname', 'Service - Nachnahme - Verwendungszweck 1', 'Service - Nachnahme - Verwendungszweck 2', 'Service - Transportversicherung - Betrag', 'Service - Weltpaket - Vorausverfügungstyp', 'Service - DHL Europaket - Frankaturtyp', 'Sendungsdokumente - Ausfuhranmeldung', 'Sendungsdokumente - Rechnungsnummer', 'Sendungsdokumente - Genehmigungsnummer', 'Sendungsdokumente - Bescheinigungsnummer', 'Sendungsdokumente - Sendungsart', 'Sendungsdokumente - Beschreibung', 'Sendungsdokumente - Entgelte', 'Sendungsdokumente - Gesamtnettogewicht', 'Sendungsdokumente - Beschreibung (WP1)', 'Sendungsdokumente - Menge (WP1)', 'Sendungsdokumente - Zollwert (WP1)', 'Sendungsdokumente - Ursprungsland (WP1)', 'Sendungsdokumente - Zolltarifnummer (WP1)', 'Sendungsdokumente - Gewicht (WP1)', 'Sendungsdokumente - Beschreibung (WP2)', 'Sendungsdokumente - Menge (WP2)', 'Sendungsdokumente - Zollwert (WP2)', 'Sendungsdokumente - Ursprungsland (WP2)', 'Sendungsdokumente - Zolltarifnummer (WP2)', 'Sendungsdokumente - Gewicht (WP2)', 'Sendungsdokumente - Beschreibung (WP3)', 'Sendungsdokumente - Menge (WP3)', 'Sendungsdokumente - Zollwert (WP3)', 'Sendungsdokumente - Ursprungsland (WP3)', 'Sendungsdokumente - Zolltarifnummer (WP3)', 'Sendungsdokumente - Gewicht (WP3)', 'Sendungsdokumente - Beschreibung (WP4)', 'Sendungsdokumente - Menge (WP4)', 'Sendungsdokumente - Zollwert (WP4)', 'Sendungsdokumente - Ursprungsland (WP4)', 'Sendungsdokumente - Zolltarifnummer (WP4)', 'Sendungsdokumente - Gewicht (WP4)', 'Sendungsdokumente - Beschreibung (WP5)', 'Sendungsdokumente - Menge (WP5)', 'Sendungsdokumente - Zollwert (WP5)', 'Sendungsdokumente - Ursprungsland (WP5)', 'Sendungsdokumente - Zolltarifnummer (WP5)', 'Sendungsdokumente - Gewicht (WP5)', 'Sendungsdokumente - Beschreibung (WP6)', 'Sendungsdokumente - Menge (WP6)', 'Sendungsdokumente - Zollwert (WP6)', 'Sendungsdokumente - Ursprungsland (WP6)', 'Sendungsdokumente - Zolltarifnummer (WP6)', 'Sendungsdokumente - Gewicht (WP6)', 'Sendungsnummer', 'Sendungsreferenz (Retoure)', 'Absender Adresszusatz 1', 'Absender Adresszusatz 2', 'Absender Zustellinformation', 'Absender Ansprechpartner', 'Empfänger Adresszusatz 1', 'Empfänger Adresszusatz 2', 'Empfänger Zustellinformation', 'Empfänger Ansprechpartner', 'Retourenempfänger Adresszusatz 1', 'Retourenempfänger Adresszusatz 2', 'Retourenempfänger Zustellinformation', 'Retourenempfänger Ansprechpartner', 'Service - Wunschnachbar - Details', 'Service - Wunschort - Details', 'Service - Alterssichtprüfung - Altersgrenze', 'Service - Sendungshandling', 'Service - beliebiger Hinweistext', 'Service - Zustelldatum', 'Service - Zustellzeitfenster', 'Service - Vorausverfügung', 'Sendungsdokumente - Einlieferungsstelle', 'Sendungsnummer (Retoure)']

# list of __required__ columns
cols = ['Sendungsnummer', 'Empfänger Name 1', ..., 'Abrechnungsnummer']

(pd.read_csv("dhl.csv", sep=";", header=None, names=names, usecols=cols)
   .to_csv("DHL-VLS-Export.csv", sep=";", index=False))
</code>


Ошибка при создании DataFrame
У меня есть код, который считает отток.

import numpy as np
import pandas as pd
import random

churned_array = []

previous =  pd.read_excel('previous.xlsx')

current = pd.read_excel('current.xlsx')

churned_idx = np.isin(current, previous, invert=True)

churned = current[churned_idx]

churned_array.append(len(churned))

churn_table = pd.DataFrame({'churn':churned
                           }, columns=['churn'])

churn_table.to_csv('churn.csv',index=False)

после выполнения строки

churn_table = pd.DataFrame({'churn':churned
                               }, columns=['churn'])

получаю ошибку

ValueError: If using all scalar values, you must pass an index

Как можно решить данную проблему?

UPDATE: также данная ошибка возникает если передать 2D матрицу при вызове конструктора, когда конструктор ожидает 1D вектор:

In [1]: churned = np.array([[1], [2], [3]])

In [2]: churned.shape
Out[2]: (3, 1)

In [3]: pd.DataFrame({'churn':churned}, columns=['churn'])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
...
ValueError: If using all scalar values, you must pass an index

Нужно правильно вызывать конструктор - либо передавать в качестве значений столбца 1D вектор:

In [4]: pd.DataFrame({'churn':churned.ravel()})
Out[4]:
   churn
0      1
1      2
2      3

In [5]: churned.ravel().shape
Out[5]: (3,)

либо передать конструктору 2D матрицу и наименования столбцов:

In [8]: pd.DataFrame(churned, columns=['churn'])
Out[8]:
   churn
0      1
1      2
2      3

Данная ошибка возникает в том случае если все переданные конструктору значения являются скалярами. В вашем случае это обозначает, что переменная
churned - содержит скалярное значение, например
3.14, вместо
list /
numpy.ndarray /
pandas.Series / etc.

churned = np.pi
df = pd.DataFrame({'churn':churned}, columns=['churn'])

выдаёт:

ValueError: If using all scalar values, you must pass an index

В этом случае надо явно задать индекс:

In [106]: df = pd.DataFrame({'churn':churned}, index=[0])

In [107]: df
Out[107]:
      churn
0  3.141593


Как сделать так ,чтобы окно было прозрачным, а виджет — нет tkinter?
При запуске следующего кода
<code>
try:
    from Tkinter import*
except ImportError:
    from tkinter import*
root=Tk()
button=Button(root,text='example')
button.pack()
root.wm_attributes('-alpha',0.5)
root.mainloop()
</code>
Помимо самого окна кнопка тоже становится прозрачной(на половину).Как сделать так ,чтобы окно было прозрачным, а виджет — нет.

Важно помнить, что tkinter плохо приспособлен к кроссплатформенности.
Windows 8.1:

from tkinter import *

root = Tk()

root.overrideredirect(True)
root.lift()
root.wm_attributes("-topmost", True)
root.wm_attributes("-disabled", True)
root.wm_attributes("-transparentcolor", "white")

root.geometry("+250+250")

button=Button(root, text='example')
button.pack()

root.mainloop()

macOS:

import tkinter as tk

root = tk.Tk()

root.overrideredirect(True)
root.wm_attributes("-topmost", True)
root.wm_attributes("-transparent", True)
root.config(bg='systemTransparent')

root.geometry("+250+250")

button = tk.Button(root, text='example')
button.pack()

root.mainloop()


Можно ли в Python создать экземпляр класса имея только его переменную?
Допустим есть переменная типа
str

a = 'test'

можно ли допустим создать экземпляр класса при помощи значения "тест"
Что я имею ввиду:

'test'.название_класса

Можно используя
__class__.

class A():
    pass

obj = A()
new_obj = obj.__class__()


Как перезапустить таймер python
Цель: Запустить таймер для внутреннего цикла и в случае не успевании завершить внутренний цикл.
<code>
import threading

crit = False

def Timeout():
   crit = True

my_timer = threading.Timer(60.0, Timeout)

while True:
    #code...
    my_timer.start()
    while True:
        if crit == True:
            #code...
            my_timer.cancel()
            break
</code>
Ошибка:

threads can only be started once.

threading.Timer выполняется только один раз, а
cancel() только отменяет вызов таймера, поэтому попробуйте создавать и запускать таймер на каждой итерации:

import threading

crit = False

def on_timeout():
    global crit
    crit = True
    print('on_timeout:', crit)

while True:
    my_timer = threading.Timer(5, on_timeout)
    my_timer.start()

    while True:
        if crit:
            print('Crit!')

            crit = False
            break

Сделал таймер на основе threading.Timer и теперь он в цикле выполняет вызов указанной функции:

import threading

crit = False

class LoopTimer(threading.Thread):
    def __init__(self, interval, function, args=None, kwargs=None):
        super().__init__()
        self.interval = interval
        self.function = function
        self.args = args if args is not None else []
        self.kwargs = kwargs if kwargs is not None else {}
        self.finished = threading.Event()

    def cancel(self):
        """Stop the timer if it hasn't finished yet."""
        self.finished.set()

    def run(self):
        while not self.finished.is_set():
            self.finished.wait(self.interval)
            self.function(*self.args, **self.kwargs)

def on_timeout():
    global crit
    crit = True
    print('on_timeout:', crit)

my_timer = LoopTimer(5, on_timeout)
my_timer.start()

while True:
    if crit:
        print('Crit!')

        crit = False
        # my_timer.cancel()

А вызов
my_timer.cancel() завершит выполнение потока


Как найти индекс списка в списке, который содержит точку, ближайшую (по расстоянию) к точке "n"?
Ответ должен быть 1, т.к. ближайшее значение в 1 по индексу списке.
<code>

point = [
    [(540, 420), (620, 300), (370, 140), (250, 390)],
    [(60, 30), (550, 310), (50, 520)],
    [(200, 500), (370, 390), (170, 200)]
]

n = (20, 15)

items = []
for idx, area in enumerate(point):
            for x, y in area:
                items.append((idx, x, y))
</code>

def squared_dist(p1, p2):
     return ((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)

def dist(p1, p2):
     return squared_dist(p1, p2) ** .5

items = [(i,x,y) for i,r in enumerate(point) for x,y in r]

nearest_point = min(items, key=lambda x: squared_dist(n, x[1:]))

результат:

In [95]: nearest_point
Out[95]: (1, 60, 30)

In [96]: nearest_point[0]
Out[96]: 1

items - список точек (кортежей), где первый элемент представляет собой индекс строки / списка, содержащего данную точку, а остальные два - координаты
x и
y:

In [17]: items
Out[17]:
[(0, 540, 420),
 (0, 620, 300),
 (0, 370, 140),
 (0, 250, 390),
 (1, 60, 30),
 (1, 550, 310),
 (1, 50, 520),
 (2, 200, 500),
 (2, 370, 390),
 (2, 170, 200)]


Как убрать title bar в tkinter?
Многие програмы при загрузке создают окно без title bar'а.
Kак это сделать в Ткинтере.
Нe
<code>
 root.overrideredirect(1)
</code>
Oн просто дизактивиpyeт кнопки закрытия,cворачивания и разворачивания ,а мне надо полностью убрать title bar.

Python 3.X на Windows:

from tkinter import *

root=Tk()
root.overrideredirect(True)
root.mainloop()

Python 3.X на macOS:

import tkinter as tk

root = tk.Tk()
root.attributes('-type', 'dock')
root.geometry('1600x800')
tk.Entry(root).pack()
root.focus_force()
root.mainloop()


Как распарсить JSON в таблицу с 3 колонками при помощи MS SQL?
Есть json следующей стуктуры:

{
    "target": "A",
    "datapoints": [
      [ 1404.5, 1547596800 ],
      [ 1536.5, 1547683200 ],
      [ 1683.6666666666667, 1548115200 ],
      [ 1789.75, 1548201600 ]
    ]
  },
  {
    "target": "B",
    "datapoints": [
      [ 1518.0, 1547596800 ],
      [ 1547.5, 1547683200 ],
      [ 1580.6666666666667, 1548115200 ],
      [ 1593.0, 1548201600 ]
    ]
  }

Как мне распарсить это в таблицу с тремя колонками при помощи SQL? Если с SQL  невозможно сделать, то подскажите, пожалуйста, как сделать это на Python?
Примерно так должно быть:

Target|Value|Time
A|1404.5|1547596800
A|1536.5|1547683200
...........
B|1593.0|1548201600

Буду благодарен за любую помощь. Спасибо!

На Python, с использованием модуля Pandas:

import json
import pandas as pd  # pip install pandas

with open(json_file_name) as f:
    d = json.load(f)

res = (pd.io.json.json_normalize(d, "datapoints", meta=["target"])
         .rename(columns={0:"Value", 1:"Time"}))

результат:

In [42]: res
Out[42]:
         Value        Time target
0  1404.500000  1547596800      A
1  1536.500000  1547683200      A
2  1683.666667  1548115200      A
3  1789.750000  1548201600      A
4  1518.000000  1547596800      B
5  1547.500000  1547683200      B
6  1580.666667  1548115200      B
7  1593.000000  1548201600      B

PS при помощи метода
df.to_sql("sql_tab_name", sqlalchemy_engine, ...) можно сохранить Pandas DataFrame в таблицу БД.


Python cравнение моделей регрессии
При построении моделей регрессии задался вопросом, как их лучше сравнивать? Какой параметр выбрать и как его найти на питоне?
Например я построил, обучил и попробовал предсказать
<code>
train = pd.read_csv('state_1.csv',";",header=None)
X_train = train.drop([16,17],axis=1)
Y_train = train[16]

test_data = pd.read_csv('state_2.csv',";",header=None)
X_test = test_data.drop([16,17],axis=1)
Y_test = test_data[16]

normalized_X_train = preprocessing.normalize(X_train)
normalized_X_test = preprocessing.normalize(X_test)

model1 = svm.SVR(kernel='linear', C=1.0)
cl1 = model1.fit(normalized_X_train,Y_train)
predictions1 = cl1.predict(normalized_X_test)

model2 = RandomForestRegressor(n_estimators=200, max_depth=5)
cl2 = model2.fit(normalized_X_train,Y_train)
predictions2 = cl2.predict(normalized_X_test)
</code>
На основании каких параметров стоит сравнивать модели? И как их найти с помощью питона(на питон перешел недавно)?

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

MSE - Mean Squared Error - среднеквадратичное отклонение
MAE - Mean Absolute Error - среднее абсолютного значения ошибки

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


Вроде все правильно,а на Stepik выдает ошибку.В чем проблема?
Задача:

Напишите программу, на вход которой подаётся список чисел одной
строкой. Программа должна для каждого элемента этого списка вывести
сумму двух его соседей. Для элементов списка, являющихся крайними,
одним из соседей считается элемент, находящий на противоположном конце
этого списка. Например, если на вход подаётся список "1 3 5 6 10", то
на выход ожидается список "13 6 9 15 7" (без кавычек).

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

Sample Input 1:
1 3 5 6 10
Sample Output 1:
13 6 9 15 7
Sample Input 2:
10
Sample Output 2:
10

Мое решение:

num = str(input()).split(" ")
numlen = len(num)
for i in num:
 if numlen == 1:
      print(i)
      break
 elif  i == num[0]:
       a = int(num[-1]) + int(num[1])
 elif i == num[1]:
      b = int(num[2]) + int(num[0])
 elif i == num[2]:
      c = int(num[3]) + int(num[1])
 elif i == num[3]:
      d = int(num[4]) + int(num[2])
 elif i == num[4]:
      w = int(num[0]) + int(num[3])
      print(a,b,c,d,w)

Интерпретатор Python 3.7 выдает все верно. Сайт же не принимает решение и выдает вот такую вот ошибку:

b = int(num[2]) + int(num[0])
IndexError: list index out of range

Ваш код не работает при 2 элементах.
Вот работающий код:

li = input().split()      # split() то же самое, что и split(' ')

len_li = len(li)
if len_li == 1:           # Если 1 элемент, просто печатаем его и завершаем программу
    print(li[0])
    exit()

res = []                  # В этот список будем добавлять вычисленные значения
for i in range(len_li):
    if i == len_li - 1:   # см. сноска №2
        b = int(li[0])
    else:
        b = int(li[i+1])
    a = int(li[i-1])      # см. сноска №1

    res.append(a + b)     # Добавляем в наш массив очередной результат

print(*res)               # см сноска №3

UPD:
Сноска №1:
В Python можно обращаться к элементу списка по отрицательному индексу, таким образом
li[-1] то же самое, что
li[len(li) - 1]. Мы так можем получить соседний с первым элемент (последний).
Сноска №2:
Нельзя выходить за пределы. Когда мы дойдём до
li[len(li) - 1] элемента, строка
b = int(li[i+1]) выведет нас за пределы массива, будет ошибка. Мы должны её исключить.
Сноска №3:
Почти аналогично:

for x in res:
    print(x, end=' ')

Вот только код выше напечатает лишний пробел в конце.


PyQT5 как для двух и более QTextBox -ов назначить фильтр событий?
подскажите пожалуйста как назначить один и тот же фильтр событий для нескольких QTextBox -ов. Хочется сделать переключение между несколькими текстовыми полями клавишей Tab, сам виджет перехватывает нажатие и получается табуляция. QWidget.setTabOrder c QTextBox почему то у меня не заработал, а вот с QLineEdit работает. Спасибо!

Попробуйте у вашего QTextEdit / QPlainTextEdit вызвать setTabChangesFocus
<code>
text.setTabChangesFocus(True)
</code>

Описание setTabChangesFocus:

This property holds whether Tab changes focus or is accepted as input.
In some occasions text edits should not allow the user to input
  tabulators or change indentation using the Tab key, as this breaks the
  focus chain. The default is false.


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

"data": [
    ["str", "str", "str", 1, 1, 1, "str", "str", 1, "str", null, "str", "str", "str", 0.5, 137, "str", "date", 98000184, "str", "str", "date", 137, 137, "str", "str", 3, "date"],
Этих массивов 300 шт.

У меня есть большой набор данных в массивах.
Мне нужно, чтобы эти массивы стали объектами.
Делаю я это следующим образом:

def array_to_obj(self, url):
    asset = assets()

    for array in self.read_assets(url):
        if array[0] != None:
            asset.SECID = str(array[0])
        if array[1] != None:
            asset.BOARDID = str(array[1])
        if array[2] != None:
            asset.SHORTNAME = str(array[2])
        if array[3] != None:
            asset.PREVPRICE = float(array[3])
      ............................. И т.д.

Свойств там 28 штук, а каждое писать не хочется.
Так вот, что можно с этим сделать?

Для этого удобно вынести имена нужных атрибутов в список, и использовать его в цикле вместе с setattr, а также getattr и hasattr. Пример:

class MyClass:
    property_names = ['ab', 'cd', 'ef', 'other', 'gh', 'ij']

    def __init__(self):
        # Если начальные данные не важны, то здесь тоже
        # можно присвоить все значения в цикле
        self.ab = 1
        self.cd = 2
        self.ef = 3
        self.other = 4
        self.gh = 5
        self.ij = 6

    def set_data(self, array):
        if len(array) != len(MyClass.property_names):
            raise ValueError('Bad data length!')
        for i in range(len(array)):
            value = array[i]
            # В коде вопроса None пропускаются
            if value is not None:
                key = MyClass.property_names[i]
                setattr(self, key, value)

    def __str__(self):
        return 'MyClass(%s)' % ','.join([str(getattr(self, key)) for key in MyClass.property_names])

    def __repr__(self):
        return str(self)

Загрузка данных:

o = MyClass()
print(o)
o.set_data([None, -2, 'ef', None, 3.1415, 2.7182])
print(o)

Получается:

MyClass(1,2,3,4,5,6)
MyClass(1,-2,ef,4,3.1415,2.7182)

И это можно легко обернуть в цикл по массиву со множеством объектов.

Альтернативы
Советую посмотреть в сторону Named Tuples, которые позволяют легко обращаться к полям объекта как по индексу, так и по имени, а имена полей задаются списком (но это тьюпл, соответственно, неизменяемый объект, что недостаток в данном случае). Или
Data Classes из Python 3.7.


Число - палиндром
Новичок в Python, взялся за реализацию кода на нахождение палиндрома для числа 9009. Решил все сделать через цикл while, но код не работает так, как надо. (
Вот мой код:
<code>
 def is_palindrom(purpose):
     const = 0
     count = 0
     appear = 9009
     while purpose >= const:
        news = count * appear
        if news > purpose:
           break
        news = str(news)
        news2 = news[::-1]
        if news == news2 and len(str(news)) == 2 and len(str(news2)) == 2:
            print(count, appear)
       count+=1
       purpose-=1
 is_palindrom(9009)
</code>
Не могу разобраться, где что упустил. Могли ли бы Вы поделиться советом, как этот код доработать, или же вовсе  мне нужно его переписать? Большое спасибо за ответы!

import math
def is_palindrom(purpose):
    for i in range(2,int(math.sqrt(purpose))):
        if purpose % i == 0:
            print(i, purpose//i)
is_palindrom(9009)


запросы в бд на джанго
Ребята, я только начинаю работать с питоном и джанго. Задача, нужно посчитать кол-во не выполненных задач по всем пользавателям. Вот мой код:
<code>
from datetime import datetime, timezone
from django.core.management import BaseCommand
from django.contrib.auth.models import User
from tasks.models import TodoItem
from django.db.models import Count

class Command(BaseCommand):
    help = "Count TopUsers"

    def add_arguments(self, parser):
        parser.add_argument("--top-rated", dest='top-users', type=int, default=25)

    def handle(self, *args, **options):
        for u in User.objects.all():
            u.tasks.filter(is_completed=True).count():
</code>
но я немогу их суммировать!


Разница в написании Python - кода
Изучаю Python пару месяцев, и, естественно, у меня накопилось несколько глупых вопросов. Один из них - скобки в циклах, условных операторах и прочее. Не могли ли вы мне объяснить, есть ли разница в написании со скобками или без?
Пример:

 while (a > n):
    print(n)

Или же:

 while a > n:
    print(n)

Есть ли разница между ними, и если есть, то какая? Заранее благодарю за ответ)

Ваши примеры одинаковы и выполняют одно и то же.
Скобки могут пригодиться Вам, когда будут сложные условия, например, математические выражения:
<code>
while (a + b) * c > n:
    print(n)
</code>


Почему происходит сортировка списка?
Как-то я писал довольно простой код, лабораторную работу для учебного заведения.
Писал дома, на Python 3.7.3 (win 8.1 64-bit), в учебном заведении была же версия 3.7.0 (win 7 64-bit).
Я частично в курсе про разницу
sorted() и
List.sort(), но при этом не понял, почему 3.7.3 выдала мне отсортированный список без повторяющихся элементов, а 3.7.0 выдала просто список без повторяющихся элементов. Почему же это произошло?
Часть кода, выдавшего такой результат:

def Add(updateLabs, Data):
    Labs = Data["Tasks"]
    Labs.extend(updateLabs)
    Data.update({
        "Tasks": sorted(list(set(Labs)))
    })
    writeFile('json', Data, 'Magazine.json')

В итоговый вариант пошло:

def Add(updateLabs, Data):
    Labs = Data["Tasks"]
    Labs.extend(updateLabs)
    Labs.sort()
    Data.update({
        "Tasks": list(set(Labs))
    })
    writeFile('json', Data, 'Magazine.json')

Но пока я игрался, пытаясь понять проблему, у меня вышел такой код:
(Python 3.7.3 запуск из IDLE, как и весь остальной код)

Labs = [7, 9, 18, 2, 5, 1]
Test = list(set(Labs))
print(Test)

И его я уже точно не понял. Почему Test идет отсортированным?

Хэш целого числа - это само значения этого числа, поэтому по множеству числа распределятся последовательно. Но ожидать такого поведения не стоит, так как множества упорядоченности не гарантируют.


Почему ошибка dict expected at most 1 arguments, got 2 в данном случае?
Имеются логи, пытаюсь сформировать
dict так, чтоб на выходе получить ip адрес и количество раз, которое этот ip адрес встретился в тексте.
При исполнение возникает ошибка
dict expected at most 1 arguments, got 2.
uwsgi.log:

192.168.101.4 - - ...
  192.168.102.3 - - ...
  192.168.102.3 - - ...
  192.168.7.46 - - ...

parser.py:

from collection import Counter

file_path = '/../data/uwsgi.log'

x = counter('parted_row')
ip_counter = dict(['parted_row[0]'],[x])

with open(file_path, 'r',encoding='utf8') as f:
    for row in f:
        parted_row = row.split(' ')
        if len(parted_row)>1:
    print(ip_counter)

Как я понял, Вам нужно сканировать ip, от которых пришли запросы на сервер.
Это можно сделать без сторонних библиотек так:

c = {}

with open('/../data/uwsgi.log') as f:
    for row in f:
        ip = row.split()[0]
        try:
            c[ip] += 1
        except KeyError:
            c[ip] = 1

print(c)

Или же с помощью
collections.Counter вот так:

import collections

c = collections.Counter()

with open('/../data/uwsgi.log') as f:
    for row in f:
        ip = row.split()[0]
        c[ip] += 1

print(c)

Увы, не могу понять, что делает Ваш пример кода, но ошибка возникает из-за то, что Вы передаёте функции
dict 2 аргумента вместо 1. Подробнее о ней можете прочитать в документации


Как замапить значения колонки в датафрейме только те, которые есть в словаре map'а?
Мы не создаём новую колонку, а всего лишь заменяем значения другими соответствующими значениями из словаря.
pandas.Series.map() меняет нетронутые значение на
NaN, чего делать не требуется.

Вы можете передать в
map() функцию, которая будет менять только те значения, которые есть в словаре.

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([['apple',2],['orange',3],['banana',3]], columns=['fruit', 'quantity'])

In [3]: df
Out[3]:
    fruit  quantity
0   apple         2
1  orange         3
2  banana         3

In [4]: fruits_map = {'apple': 'APPLE', 'banana': 'BANANA'}

In [5]: df['fruit'].map(lambda x: fruits_map.get(x, x))
Out[5]:
0     APPLE
1    orange
2    BANANA
Name: fruit, dtype: object


Поиск хэштега в тексте по паттерну
Есть текст, в нем слова с хэштегами. Я бы хотел найти слова с хэштегами. Написал функцию, которая принимает на вход текст и выдает строчку с найдеными хэштегами:
<code>
def hashtag(text):
    res = re.findall('#.+', text)
    return res
</code>
Но есть проблема, если мне на вход придет текст, где слово в хэштеге будет не в конце, то эта функция не поймает слово, а выдаст кусок текста целиком.
Как сделать правильно?

In [51]: s = "blah-blah, #tag1 blah-blah, #tag2, blah-blah"

In [52]: tags = re.findall(r'(#\w+)', s)

In [53]: tags
Out[53]: ['#tag1', '#tag2']


Как добавиться тень под кнопку в Tkinter'e?
Как добавить тень под  кнопку в Tkinter, чтобы получилось, как будто кнопка над поверхностью? Как кнопки в tvml, например.

Можно добавить Label черного цвета под кнопкой:
<code>
import tkinter as tk

root = tk.Tk()

button = tk.Button(root, text='Some text')
button.place(x=0, y=0)

root.update()  # обновляем окно, чтобы размер кнопки обновился

shadow = tk.Label(root, background='black')
# Делаем размеры тени совпадающими с размерами кнопки, располагаем с небольшим смещением
shadow.place(x=10, y=10, width=button.winfo_width(), height=button.winfo_height())
shadow.lower(button)  # помещаем тень под кнопкой

root.mainloop()
</code>


Оптимизация кода написанного с использованием Pandas DataFrame
Ниже приведен рабочий и корректный код.
Меня интересует на сколько его еще можно оптимизировать по объему кода использую best practice при работе с pandas dataframe.
Суть решаемой задачи.
Приведенный код генерирует все возможные комбинации для лотореи 6x36.
Из сгенерированных комбинаций, мы последовательно исключаем комбинации для которых выполняется условие - остаток от деления 2 для всех значений шести шаров одной игры одинаковый. Такую же операцию делаем для деления на 3 и на 5
<code>
Например:
{1,3,5,7,9,11}%2 = {1,1,1,1,1,1} - исключаем, поскольку остаток от деления на 2 для всех значений шаров равен 1.
{3,6,9,12,15,18}%3 = {0,0,0,0,0,0} - исключаем, поскольку остаток от деления на 3 для всех значений шаров равен 0

import pandas as pd
import numpy as np
from itertools import combinations
a = np.arange(1,37)
c = combinations(a, 6)
df = pd.DataFrame(list(c))

r2 = df.apply(lambda x: x%2).stack().reset_index()
r3 = df.apply(lambda x: x%3).stack().reset_index()
r5 = df.apply(lambda x: x%5).stack().reset_index()

f2 = r2.groupby([r2.columns[0], r2.columns[2]]).agg(['count'])
z2 = f2[f2.values == 6].reset_index().level_0

f3 = r3.groupby([r3.columns[0], r3.columns[2]]).agg(['count'])
z3 = f3[f3.values == 6].reset_index().level_0

f5 = r5.groupby([r5.columns[0], r5.columns[2]]).agg(['count'])
z5 = f5[f5.values == 6].reset_index().level_0

z = pd.concat([z2,z3,z5], axis=0, join='outer', join_axes=None, ignore_index=False,
          keys=None, levels=None, names=None, verify_integrity=False,
          copy=True)

s = df[~df.index.isin(z)]
print(s)
</code>

попробуйте так:
<code>
In [16]: def modulo_all(df, num):
    ...:     a = (df % num).values
    ...:     return (a == a[:, [0]]).all(axis=1)
    ...:

In [17]: mask2 = df.pipe(modulo_all, 2)

In [18]: mask3 = df.pipe(modulo_all, 3)

In [19]: mask5 = df.pipe(modulo_all, 5)

In [20]: res = df[~(mask2 | mask3 | mask5)]

In [21]: res.shape
Out[21]: (1907842, 6)
</code>


Объясните как работает метод super,а так-же конструкция super().__init__() в python? [закрыт]

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

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

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

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

Объясните как работает метод
super, а так-же конструкция
super().__init__() в python?
super часто используется в классах. Желательно объяснить как можно проще и на простых примерах.

super() - это функция, которая обращается к классу, от которого наследуется текущий.
Сначала немного кода:

class A:
    def some_method(self):
        print('Spam, eggs!!1')

class B(A):
    def some_method(self):
        print('Hello, World!')

x = B()
x.some_method()

stdout:

Hello, World!

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

class A:
    def some_method(self):
        print('Spam, eggs!!1')

class B(A):
    def some_method(self):
        super().some_method()
        print('Hello, World!')

x = B()
x.some_method()

stdout:

Spam, eggs!!1
Hello, World!

С помощью
super().some_method() мы вызвали родительский метод, а после дополнили свой. Именно для этого чаще всего используется эта функция.

__init__() - это метод инициализации класса, следовательно
super().__init__() вызывает метод инициализации из родительского класса. Например, чтобы дополнить его.


Почему не вызывается класс из пакета?
У меня есть файл main.py рядом есть папка engine, в которой пустой
__init__.py и модуль
starter.py с классом
Starter()
Вопрос, почему я не могу вызвать класс из starter.py?
Мой код main.py:

import engine
engine.Starter()

Мой код engine/starter.py:

class Starter():
   pass

Ошибка:

AttributeError: module 'engine' has no attribute 'Starter'

Объясните что я делаю не так.
У меня получилось достать класс только так:

from engine.starter import Starter

Но разве так должны вызываться пакеты? Разве я не могу просто сделать import и использовать его классы?

В модуле
engine нет класса
Starter, он находится в
engine.starter, поэтому Вы должны использовать это:

from engine import starter
starter.Starter()

или это:

import engine.starter
engine.starter.Starter()

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

import engine.starter as p
p.Starter()

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

from engine.starter import *
Starter()


Поиск по динамически изменяемому словарю
Имеется словарь вида

world = {'city':{'Moscow':{'person':{'Name': 'Max', 'LastName': 'Sidorov'}, 'person1':{'Name': 'Nikita', 'LastName': 'Petrov'}}, 'London':{'person':{'Name': 'John', 'LastName': 'Stones'}, 'person1':{'Name': 'Wayne', 'LastName': 'Rooney'}}}}

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

def get_all_dicts(seq_or_mapping, predicate):
if hasattr(seq_or_mapping, 'values'):
    if predicate(seq_or_mapping):
       yield seq_or_mapping
    values = seq_or_mapping.values()
else:
    values = seq_or_mapping

for value in values:
    if isinstance(value, (dict, list)):
        yield from get_all_dicts(value, predicate)

for d in get_all_dicts(world, lambda d: d.get('Name') == 'Andrey'):
    print(d)

world = {
    'city': {
        'Moscow': {
            'person': {
                'Name': 'Max',
                'LastName': 'Sidorov'
            },
            'person1': {
                'Name': 'Nikita',
                'LastName': 'Petrov'
            }
        },
        'London': {
            'person': {
                'Name': 'John',
                'LastName': 'Stones'
            },
            'person1': {
                'Name': 'Wayne',
                'LastName': 'Rooney'
            }
        }
    }
}

def find_name(data, name):
    for city in data:
        for key in data[city]:
            pack = data[city][key]
            if pack['Name'] == name:
                return pack
    # значение None, 0, или ошибка
    return None

print(find_name(world['city'], 'John'))  # {'Name': 'John', 'LastName': 'Stones'}
print(find_name(world['city'], 'Anton'))  # None


Как присвоить буквам вес независимо от регистра? [закрыт]

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

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

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

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

На вход программе (как вариант, из входного файла text.dat) подаётся текст на английском языке. Ввод этих символов заканчивается точкой (другие символы, отличные от «.» во входных данных отсутствуют; в программе на языке Бейсик символы можно вводить по одному в строке, пока не будет введена точка). Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет определять и выводить на экран, какая английская буква встречается во входной последовательности чаще всего и сколько именно раз. Строчные и прописные буквы при этом не различаются. Если таких букв несколько, то программа должна выводить на экран ту из них, которая стоит по алфавиту раньше.
  Например, пусть файл содержит следующую информацию:
  It is not a simple task. Yes!
  Тогда чаще всего встречаются буквы I, S, T. (слово Yes в подсчете не участвует, так как расположено после точки). Следовательно, в данном случае, программа должна вывести
  I 3.

Я хочу сделать так, чтобы в полученной строке  каждой букве  соответствовал определенный вес (Независимо от большой или маленькой буквы). Я пробовал реализовать через функцию
ord() - 96 (чтобы у маленьких букв был вес: 1,2....т.д), но у больших букв вес меньше и получается коряво

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

from string import ascii_lowercase                # 'abcdefghijklmnopqrstuvwxyz'

d = {}                                            # Частотный словарь букв
max_s = ['z', 0]                                  # Начальный максимум: z, встречается 0 раз

with open('text.dat') as f:
    raw_text = f.read().strip().lower()           # Читаем текст, удаляем лишние символы, приводим к нижнему регистру
    text = raw_text[:raw_text.find('.')]          # Отрезаем лишний текст после точки

    for x in ascii_lowercase:
        count = text.count(x)
        d[x] = count

        if count > max_s[1]:                      # Если встречается чаще текущего максимума:
            max_s = [x, count]
        elif count == max_s[1] and x < max_s[0]:  # Если встречается как максимум, но в алфавите раньше:
            max_s = [x, count]

print(*max_s)

text.dat:

It is not a simple task. Yes!

stdout:

i 3


Проблема с созданием словаря [закрыт]

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

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

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

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

Небоходимо сформировать объект класса dict, где ключ - это IP адрес, а значение - количество раз, которые этот ip встретился в тесте.
В итоге должно получиться что-то типа такого:
{'192.168.101.4': 1, '192.168.102.3': 2, '192.168.7.46': 1}

Допустим ip_list - это список с ip
<code>
result = {ip: ip_list.count(ip) for ip in set(ip_list)}
</code>


Запуск скриптов вместе с django
С django работаю не так давно. Возник вопрос: можно ли с запуском django запускать другие скрипты, находящиеся в приложениях? К примеру:
Структура проекта:

--MyProject
   --SettingsFolder
   --MyApp1
      --Script1
      --Script2
   --MyApp2

Необходимо, чтобы Script1 и Script2 запускались, желательно одновременно, при запуске django.

Примечание: использовал импорт настроек в Script1

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dmb.settings')
django.setup()

Но при добавление его в Script2, Script2 не выполнялся.

import django
from django.conf import settings
from MyApp1 import Script1, Script2

settings.configure(default_settings='MyApp1.apps.MyApp1Config', DEBUG=True)
django.setup()


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

       def fin_more(seq):  # [8,5,6,2,10]
           mini = seq[0]
           mini_val = 0
           for i in range(1, len(seq)):
               if seq[i] < mini:
                   mini = seq[i]
                   mini_val = i
           return mini_val

       def read(seq):
           new_list = []
           for j in range(len(seq)):
               mini = fin_more(seq)
               new_list.append(seq.pop(mini))
       return new_list

       print(read([8, 5, 6, 2, 10]))

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

       def prints(source):
           new_arr = list()
           new_arr.append(sorted(source))
           return print(*new_arr)
       prints([8, 5, 6, 2, 10])

Не могли бы Вы помочь мне понять конкретно пример из книги, и можно ли мне использовать свой вариант?

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


Как записывать значения в таблицу каждый раз в первую строку, имеющие значения опускать на строку ниже Python sqlite3
Есть данный код, который добавляет запись последовательно заполнению(последняя строчка), подскажите как можно реализовать заполнение, что бы записывалось в первую стр и данные которые уже есть опускались на строку вниз.
<code>
def records(self, name, attribute, old_size, new_size, compressed):
    self.db.insert_data(name, attribute, old_size, new_size, compressed)
    self.view_records()

def view_records(self):
    self.db.c.execute('''SELECT * FROM DataImg''')
    [self.tree.delete(i) for i in self.tree.get_children()]
    [self.tree.insert('', 'end', values=row) for row in self.db.c.fetchall()]
</code>

Добавьте поле с автоинкрементом, например
id INTEGER PRIMARY KEY AUTOINCREMENT. Вставляете данные без этого поля. Получаете данные через
select... order by id desc и получите значения в порядке "последнее сверху".


Нужно чтобы при нажатии на кнопку открывались 2 функции сразу если выделено 2 флажка
<code>
def check():
    if c1.get()==1:
        discr()
    elif c2.get()==1:
        FunCompute()

root=Tk()
c1 = IntVar(root)
c2 = IntVar(root)
c1.set(0)
c2.set(0)
che1 = Checkbutton(root,text="Discr",
variable=c1,onvalue=1,offvalue=0)
che2 = Checkbutton(root,text="FunCompute",
variable=c2,onvalue=1,offvalue=0)
but=Button(root,text='open',command=check)
but.pack()
che1.pack()
che2.pack()
root.mainloop()
</code>

elif в функции замените на
if (т.е. будет 2 независимых условия
if). Если будут включены оба чекбокса, то обе функции выполнятся, сначала одна, потом другая (надеюсь это подходит под условие "открывались 2 функции сразу").


Не работает kivy designer [закрыт]

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

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

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

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

Пишу:
<code>
(base) Mac-mini:~ admin$ kivy -m designer
-bash: kivy: command not found
</code>

A!Надо было так:
<code>
cd kivy-designer
python -m designer
</code>


Нужно чтобы при выборе радиокнопки и нажатию кнопки вызывалась соответствующая функция [закрыт]

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

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

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

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

<code>
def onOpen():
    if var.get()==0:
        but.bind('<Button-1>',discr)
    elif var.get()==1:
        but.bind('<Button-1>',FunCompute)

root=Tk()
var=IntVar(root)

rad0 = Radiobutton(root,text="Discr", variable=var,value=0)
rad1 = Radiobutton(root,text="FunCompute", variable=var,value=1)
but=Button(root,text='open',command=onOpen)
but.pack()
rad0.pack()
rad1.pack()
root.mainloop()
</code>

Просто вызывайте нужную функцию напрямую внутри обработчика:
<code>
def onOpen():
    if var.get()==0:
        discr()
    elif var.get()==1:
        FunCompute()
</code>


Немного не ясны условия выполнения задачи (ЕГЭ инфа) [закрыт]

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

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

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

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

Дан целочисленный массив из 40 элементов. Элементы массива могут принимать целые значения от 0 до 10 000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, который находит количество элементов массива, меньших 100, не делящихся на 3, после чего заменяет в массиве соответствующие значения на найденное количество. После чего выводит полученный массив на экран.

Python
# допускается также
# использовать две
# целочисленные
# переменные j, k
a = []
n = 40
for i in range(n):
     a.append(int(input()))
...

Вот прога

n = 5
a = []
k = 0
for i in range (n):
    a.append(int(input()))

for j in a:
    if j % 3 != 0 and j < 100:
        k += 1

for i in range (n):
    if a[i] % 3 != 0 and a[i] < 100:
        a[i] = k

print (a)

Я использовал i два раза, но не знаю, правильно ли это? Вопрос больше для тех, кто сдавал егэ.

А причем тут повторное использование i? В программировании любую переменную можно использовать повторно, если это не противоречит семантике алгоритма. У вас не противоречит. Значит формально - программа написана правильно.
Другое дело, что правильно - это еще не значит оптимально.
Ниже версия  вашей программы, в которой не три, а два цикла. Да, на 5 или 40 элементах -  ерунда, а вот если их 5 миллионов.... И надо в себе с самого начала развивать умение искать оптимальные или хотя-бы наиболее эффективные алгоритмы.

n = 5
a = []
k = 0
for i in range (n):
    a.append(int(input()))
    if a[i]% 3 != 0 and a[i] < 100:
        k += 1
for i in range (n):
    if a[i] % 3 != 0 and a[i] < 100:
        a[i] = k
print (a)

И да, специально для вас :-) с повторным использованием переменной.
Можно пойти еще дальше, и написать программу с (почти) одним циклом - правда для этого придется задействовать дополнительную память, а я не знаю, как к этому относится ЕГЭ:

n = 5
a = []
c=[]
k = 0
for i in range (n):
    a.append(int(input()))
    if a[i]% 3 != 0 and a[i] < 100:
        k += 1
        c.append(i)
for i in c:
    a[i]=k
print (a)

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


Преобразование JSON в "Пользовательский вид"
Получаю JSON такого вида:

{
    "one": "1",
    "two": [
        [1, 2, 3],
        ["1", "2", 3]
    ],
    "three": [
        [1, 2, 3],
        ["1", "2", 3]
    ]
}

Как достать данные из two, three в виде списка:

1 2 3
1 2 3

Я плохо понял, в каком именно формате вы хотите получить данные, поэтому приведу несколько примеров:
<code>
import json  # библиотека для работы с JSON

json_string = """
{
    "one": "1",
    "two": [
        [1, 2, 3],
        ["1", "2", 3]
    ],
    "three": [
        [1, 2, 3],
        ["1", "2", 3]
    ]
}
"""

parsed_string = json.loads(json_string)  # Создаём Python объект из JSON

print(parsed_string['two'])              # stdout: [[1, 2, 3], ['1', '2', 3]]

print(*parsed_string['two'])             # stdout: [1, 2, 3] ['1', '2', 3]

for x in parsed_string['two']:           # stdout: 1 2 3
    for n in x:                          #         1 2 3
        print(n, end=' ')
    print('')
</code>
Инструкция json.loads() возвращает Python словарь, поэтому Вы можете представить данные как Вам угодно.


Остановить работу функции если отменена загрузка страницы Flask
У меня в программе есть route, в котором выполняется долгая функция, приведу такой пример:

from flask import Flask, render_template
import time
app = Flask(__name__)

def my_func():
    for i in range(250):
        if not i % 2 == 0:
            print(i)
            time.sleep(5)

@app.route("/")
@app.route("/home")
def home():
    my_func()
    return render_template('home.html')

if __name__ == "__main__":
    app.debug = True
    app.run()

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

Прямой ответ: нет, нельзя.
Развёрнутый ответ. Дело в том, что так устроены WSGI и существующее ПО, работающее с HTTP – никто в них не закладывал высокоуровневый функционал обработки прерывания соединений. Они работают так, что приложение сначала пишет полный ответ, затем передаёт его на уровни ниже, а там уже по возможности отправляется ответ.

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

Google Groups 2009: Cancelling a request if client closes http socket
Reddit, Python 2015: Terminate Flask function when window closes
enSO 2015: Flask: What happens when a user closes the browser while a long process is being executed?

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

Варианты решения:

Есть упомянутая выше гипотетическая возможность залезь под капот.
Отправлять запрос уже загруженной страницей, а в ней можно ловить событие закрытия и отправлять соответствующий запрос, настройку которого можно реализовать на сервере.
Разбить задачу на несколько отдельных запросов – тогда по закрытию страницы последующие запросы просто не будут отправлены.
Произвести сложные вычисления заранее, отправляя в момент запроса готовый результат.
Реализовать большие запросы по WebSocket'ам – у них вроде есть обработка разрыва соединения.
Описанные варианты довольно сложны (особенно первые два) и не всегда возможны (следующие два), поэтому многие делают так:
Просто оставить всё как есть – ведь вычислительные ресурсы в наше время не слишком дорогие.


Бот сообщений сообщества не видит беседы
Решил я написать бота для сообщений в сообществе во ВКонтакте с помощью Python'а и хотел чтобы он работал в беседах, да вот незадача, все мои попытки были тщетны.
Сначала я пытался использовать VK API, но как показала практика, бот работал только в личных сообщениях сообщества, я пошёл дальше и попробовал метод прослушивания событий LongPoll, вот пример кода:
<code>
import vk
import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType
import random

vk = vk_api.VkApi(token="токен сообщества с полностью выданными правами")
vk._auth_token()

session_api = vk.get_api()
lp = VkLongPoll(vk)

while True:
    for event in lp.listen():
        if event.type == VkEventType.MESSAGE_NEW and event.text:
            if event.text == '1' or event.text == '2': #Если написать 1 или 2
                if event.from_user:                    #то бот ответит
                    vk.method("messages.send", {
                        "user_id":event.user_id,
                        "message":'ПРОГРАММИРОВАНИЕ ЗЛО',
                        "random_id": random.randomint(1, 2147123123)}
                    )
                elif event.from_chat:
                    vk.method("messages.send", {
                        "chat_id":event.chat_id,
                        "message":'ПРОГРАММИРОВАНИЕ ЗЛО',
                        "random_id": random.randomint(1, 2147123123)}
                    )
</code>
К сожалению данный код в теории должен работать и в беседах, однако беседы он не видит, хотя боту выдана привилегия Администратора.
И последняя моя попытка была это подключение к LongPoll-серверу и прослушивание каждого события по флагам, однако и тут мне сервер не помог, он тоже не видит беседы. Инструкцию по подключению к LongPoll-серверу брал на хабре здесь, но пришлось немного переписывать для того чтобы он работал. (в итоге сервер плохо сохранил файл с кодом и я потерял его).
Запускал код Python я на pythonanywhere.com
Если кто знает решение, пожалуйста подскажите, так как в поддержку ВКонтакте я написать не могу по непонятным тому причинам.

Попробуйте данный код, прямо сейчас у меня так запущен бот:
<code>
from random import random
from vk_api import VkApi
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType

vk_session = VkApi(token="[Ваш токен]")
longpoll = VkBotLongPoll(vk_session, "[id сообщества]")
vk = vk_session.get_api()

for event in longpoll.listen():
    if event.type == VkBotEventType.MESSAGE_NEW and event.from_chat:
        random_id = round(random() * 10 ** 9)
        chat_id = int(event.chat_id)
        message = "[Ваш ответ]"

        vk.messages.send(
            random_id=random_id,
            chat_id=chat_id,
            message=message,
        )
</code>


Python подтягивание названий предметов по id из второго массива
Первый массив хранит ид предмета и количество:

{'items': [
 {'item_id': 1, 'count': 127},
 {'item_id': 2, 'count': 123}
]}

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

[
 {'item_id': 1, 'title': 'Название предмета 1'},
 {'item_id': 2, 'title': 'Название предмета 2'}
]

Как я могу "соединить" эти данные и получить массив следующего вида? :

[
 {'title': 'Название предмета 1', 'count': 127, 'item_id': 1},
 {'title': 'Название предмета 2', 'count': 123, 'item_id': 2}
]

Может быть, вам проще сразу работать с дейтафреймами pandas?

import pandas as pd

a = {'items': [
    {'item_id': 1, 'count': 127},
    {'item_id': 2, 'count': 123},
    {'item_id': 8, 'count':None}
    ]}

b = [
    {'item_id': 1, 'title': 'Название предмета 1'},
    {'item_id': 2, 'title': 'Название предмета 2'},
    {'item_id': 5, 'title': 'Название предмета 5'}
    ]

dfa = pd.DataFrame(a['items'],columns=['item_id', 'count'])
dfb = pd.DataFrame(b, columns=['item_id', 'title'])
res = dfa.merge(dfb,on="item_id", how='outer')

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

   item_id  count                title
0        1  127.0  Название предмета 1
1        2  123.0  Название предмета 2
2        8    NaN                  NaN
3        5    NaN  Название предмета 5


Как можно доделать код? [закрыт]

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

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

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

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

<code>
import random

a = [random.randint(-100, 100) for x in range(random.randint(0, 100))]
</code>
помогите доделать пожалуйста доделать код.
Приняв положительные значения за радиусы окружностей, вычислить
соответствующие длины окружностей

Спасибо Qwertiy за объяснение.
Возможно это поможет:
<code>
import random
from math import pi

li = [random.randint(-100, 100) for x in range(random.randint(0, 100))]
res = [2*pi*x for x in li if x > 0]

print(res)
</code>


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

def solve_generator(k, s, res):
    if s == 0:
        yield res
    if k >= 0 and s - x[k - 1] >= 0:
        res.append(x[k - 1])
        solve_generator(k - 1, s - x[k - 1], res)
        res = res[:-1]
    if k >= 0:
        solve_generator(k - 1, s, res)

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

x = [1, 2, 2, 3, 5, 7, 8, 12, 14, 20, 25]

s = 22

g = solve_generator(len(x), s, [])
for k in g:
    print(k)

Моя проблема: мне бы зотелось на строке, на которой указан
yield произвести выход из стека рекурсии наружу (без итерации по стеку наверх), а при повторном вызове вернуться в то же место стека для продолжения построения решения. Вопрос: возможно ли это в питоне или требуется избавиться от рекурсии?
Для того, чтобы понять, что делает эта программа, Вам следует знать постановку задачи. Она звучит так:
По заданному числу
s и массиву
x, следует построить все возможные решения для задачи о разложении числа
s на слагаемые. Я делаю это итеративно и эксплуатирую идею задачи о рюкзаке.
В более простом варианте, данная задача может быть поставлена так: как написать рекурсивный генератор, который будет step-by-step возвращать пути в дереве?


Разработка простого учебного web приложения на Django с использование Docker (docker-compose)
Мне хотелось бы попрактиковаться в Django и Docker, создав небольшое приложение, которое разрасталось по мере осваивания технологий - так сказать учебный полигон для набивания шишек. Я планирую пока что собрать простую систему из двух docker контейнеров (docker-compose) для Postgres и Django. Позже перенести frontend например на Angular (с отдельным контейнером).
Какие пробемы у меня могут возникнуть (я уже запускал тестовые связки Django-Postgres в Docker) в процессе разрастания проекта? Пропадут ли данные из базы (пускай и заполненные "рыбой") при добавлении нового сервиса в docker-compose и т. д. Есть ли не очевидные подводные камни?
Вопрос несколько абстрактный, и за это можно попинать, но мне бы хотелось понять общую картину, перед тем как решать конкретные возникающие проблемы.

Вижу такой процесс обучения c учетом:

я уже запускал тестовые связки Django-Postgres в Docker)

Стараться использовать alpine based images

FROM python:3.7.0-alpine3.8

COPY requirements.txt /
RUN apk --update add --virtual .base build-base git && \
    apk add --no-cache postgresql-dev && \
    pip install -r requirements.txt && \
    rm requirements.txt && \
    apk del .base && \
    addgroup -g 1001 -S example && \
    adduser -D -S -u 1000 -G example -h /home/example \
      example && \
    rm -rf /tmp/* /var/tmp/* /usr/share/man /tmp/* /var/tmp/* \
        /var/cache/apk/* /var/log/* ~/.cache

COPY . /home/example/
RUN chown -R example:example /home/example

USER example
WORKDIR /home/example

CMD python server.py

Монтирование проекта в
/home/* даст преимущество для разработки таких как история python, sh, которая будет в корне проекта (их добавим в .dockerignore, .gitignore)

version: '3.4'
services:
  example
    image: example-development
    command: sh -c './wait-for pg.example_net:5432 -- python server.py'
    build:
      context: .
      dockerfile: Dockerfile.development
    networks:
      - net
    volumes:
      - .:/home/example
    ports:
      - '5000:5000'
    stdin_open: true
    tty: true
    depends_on:
      - pg
      - example__migrator
    environment:
      DEBUG: 'true'

Собирать только с нужными файлами c
.dockeringore

*
!src

Добавить reverse proxy (nginx) и понять как работают
bridge
Даже без
angular будет профит для отдачи статики.
При добавлении
angularсделать через multi-stage build.

FROM node:8.15.0-alpine

WORKDIR /app

COPY package.json /app/
RUN npm install

COPY . /app/
RUN npm build

FROM nginx:1.15.8-alpine
RUN rm -rf /usr/share/nginx/html/*

COPY config/default.conf /etc/nginx/conf.d/
COPY --from=0 /app/build /usr/share/nginx/html

CMD ["nginx", "-g", "daemon off;"]

Пропадут ли данные из базы (пускай и заполненные "рыбой")

Использовать docker volumes.

pg:
  image: postgres:10.0-alpine
  environment:
    PGDATA: /var/lib/postgresql/data/pg_data
  volumes:
    - pg_data:/var/lib/postgresql/data/pg_data
  networks:
    - net

Советую делать миграции отдельным контейнером '__migrator' (p.s. deploy опция для docker-swarm)

example__migrator:
  command: sh -c './wait-for pg:5432 -- python manage.py migrate'
  deploy:
    mode: replicated
    restart_policy:
      condition: none

Малость расписал про
development окружение. Как только нужно будет развернуть приложение и поддерживать добавляется
docker-swarm (идеально для одного сервера или при возможности можно масштабироваться в кластер).
Тут уже много подводных камней. Можно ознакомиться с моим проектом автоматизации деплоя.


Выбор нужной строки в sql [закрыт]

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

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

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

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

<code>
mark | material | pressure | id
"One"| "somemat"|"Pressure1"| 1
"Two"|"material2"|"Pressure2"|2
</code>
как мне выбрать необходимую строку со значением "One"?

Попробуйте
<code>
SELECT * FROM my_table WHERE mark = "One"
</code>


Python. Tkinter. Curselection
В общем, есть графический интерфейс, в котором есть однострочное поле для ввода(Entry), многострочное(Text), список(ListBox) и кнопка(Button). Кнопка и однострочное поле надо для ввода чего-либо в многострочное поле, а список содержит название txt файлов.
Как сделать так, чтобы когда я выбирал файл из списка, то все, что в нем есть, выводилось в многострочное поле, а после того как нажимал на другой файл в листбоксе, то прошлый файл, который был выбран, сохранял все, что есть в многострочном поле и закрывался, ну и соответственно открывался следующий выбранный.
Пока, есть только функция по определению индекса и значения выбраного файла в списке:
<code>
def onselect(evt):
    w = evt.widget
    index = int(w.curselection()[0])
    value = w.get(index)
</code>

Ну примерно так можно реализовать
P.s можно конечно создать отдельный класс
LisBox "для красоты", но слишком запористо :D

import tkinter as tk
import os

class Main(tk.Tk):
    open_close = True

    def __init__(self):
        super().__init__()
        self.entry = tk.Entry()
        self.text = tk.Text()
        self.list_box = tk.Listbox()
        self.list_box.bind("<Double-Button-1>", self.file_operation)
        for i in os.listdir(os.getcwd()):
            _, j = os.path.splitext(i)
            if j == ".txt":
                self.list_box.insert(tk.END, i)
        but = tk.Button(text="Добавить", command=self.add_item)
        self.entry.pack()
        but.pack()
        self.text.pack()
        self.list_box.pack()

    def file_operation(self, e):
        if self.open_close:
            self.file_name = self.list_box.get(e.widget.curselection())
            with open(self.file_name, encoding="utf-8") as file:
                self.text.delete("1.0", tk.END)
                self.text.insert(tk.END, file.read())
                self.open_close = False
        else:
            with open(self.file_name, "w", encoding="utf-8") as file:
                file.write(self.text.get("1.0", tk.END))
            self.open_close = True
            self.file_operation(e)

    def add_item(self):
        self.text.insert(tk.END, self.entry.get() + "\n")
        self.entry.delete(0, tk.END)

if __name__ == '__main__':
    Main().mainloop()


Промежуточные пустые элементы в .contents BS4
Допустим, я хочу получить некоторую информацию из блока, в котором так-же содержатся какие-то элементы.
Сначала я делаю запрос к этой странице, и, сразу использую BeautifulSoup для получения HTML кода:

req = requests.get(url)
soup = BeautifulSoup(req.text, 'lxml')

Затем,я выделяю интересный для меня блок:

data = soup.find_all('div', {'class':'_si_container'})

Далее, чтобы перемещаться по дереву вниз, я использую
.contents, но, этот метод предоставляет дерево через один элемент, т.е в виде:

data[0].contents[0] содержит в себе переход на новую строку:
000:'\n'
data[0].contents[1] же, уже содержит в себе некоторую информацию о дочернем блоке :
001:'div class=data ...'
Вопрос: могу ли я пропустить элементы, которые содержат в себе переход на новую строку, как в
000:'\n'?

Еще немного полистав документацию, понял, что элементы с
'\n' имеют тип NavigableString, и сделав списочное выражение следующего вида:
data2 = [x for x in data[0].contents if type(x) is not NavigableString] я получил список
data2 содержащий только полные элементы.


UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: invalid character
Хочу построчно считать пути из файла 'feautures_90.txt', по которым будут открыты файлы .csv и собраны построчно в один файл 'feautures.csv'. Появляется ошибка кодировки.
Как победить? Кодировки указал везде, где только можно, но ничего не выходит.
<code>
    # -*- coding: utf-8 -*-
import pandas as pd

def toFeaturesAnomalies(line):
    df = pd.read_csv(line, sep=',', encoding='utf-8')

    num_det = str(line[line.find('det_')+4:line.find('.csv')])
    num_def = str(line[line.find('defect№_')+8:line.find('_time_')])

    df = df.drop('row', 1).rename({'detector_' + num_det: 'A_' + num_def + '_' + num_det}, axis=1)
    tf = df.T

    with open('feautures.csv', 'a', encoding='utf-8') as f:
        tf.to_csv(f, header=False, encoding='utf-8')

with open('feautures_90.txt', encoding='utf-8') as f:
    for line in f.readlines():
            print(line)
            toFeaturesAnomalies(line)

Ошибка:
 Traceback (most recent call last):
  File "D:\Working\ML\Трещины CD\Train_data\DataForML\txt_csv.py", line 22, in <module>
    toFeaturesAnomalies(line)
  File "D:\Working\ML\Трещины CD\Train_data\DataForML\txt_csv.py", line 7, in toFeaturesAnomalies
    df = pd.read_csv(line, sep=',', encoding='utf-8')
  File "C:\Python\lib\site-packages\pandas\io\parsers.py", line 702, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Python\lib\site-packages\pandas\io\parsers.py", line 429, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "C:\Python\lib\site-packages\pandas\io\parsers.py", line 895, in __init__
    self._make_engine(self.engine)
  File "C:\Python\lib\site-packages\pandas\io\parsers.py", line 1122, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\Python\lib\site-packages\pandas\io\parsers.py", line 1853, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas\_libs\parsers.pyx", line 387, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas\_libs\parsers.pyx", line 686, in pandas._libs.parsers.TextReader._setup_parser_source
UnicodeEncodeError: 'mbcs' codec can't encode characters in position 0--1: invalid character
</code>

Данную проблему получилось решить следующим образом:
<code>
import pandas as pd

with open('feautures_90.txt') as f:
    for line in f.readlines():

        df = pd.read_csv(line.rstrip('\n'))
        num_det = str(line[line.find('det_')+4:line.find('.csv')])
        num_def = str(line[line.find('defect№_')+8:line.find('_time_')])
        df = df.drop('row', 1).rename({'detector_' + num_det: 'A_' + num_def + '_' + num_det}, axis=1)
        tf = df.T

        with open('feautures.csv', 'a') as f:
            tf.to_csv(f, header=False)
</code>
Правда, до сих пор не понял, что именно было причиной.


Параметры для RandomForestRegressor
При
RandomForestClassifier при подаче в обучение
fit(X, y),
X-это значения признаков,
y - метки класса.
А вот в
RandomForestRegressor
X и
y, что они означают?

z=np.array([70862.5000,70550.0000,70050.0000,67637.5000,67987.5000,69575.0000,69275.0000,67225.0000])#цены
F=z.reshape(-1, 1)

В задачах регрессии предсказываются числа (например цена). Соответственно
y - это вектор искомых чисел из обучающей выборки.

Пример из реальной жизни - "Housing Values in Suburbs of Boston" AKA Kaggle "Boston Housing".
В данном датасете есть следующие признаки (столбцы):

crim - per capita crime rate by town.

zn - proportion of residential land zoned for lots over 25,000 sq.ft.

indus - proportion of non-retail business acres per town.

chas - Charles River dummy variable (= 1 if tract bounds river; 0 otherwise).

nox - nitrogen oxides concentration (parts per 10 million).

rm - average number of rooms per dwelling.

age - proportion of owner-occupied units built prior to 1940.

dis - weighted mean of distances to five Boston employment centres.

rad - index of accessibility to radial highways.

tax - full-value property-tax rate per $10,000.

ptratio - pupil-teacher ratio by town.

black - 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town.

lstat - lower status of the population (percent).

и наконец искомый признак:

medv - median value of owner-occupied homes in $1000s.

Для данного датасета
X - это все признаки / столбцы, кроме искомого
medv,
y -
medv.


Странное положение окна при вызове QMessageBox.question
Пытаюсь вызвать модальный диалог с помощью
QMessageBox
Мой код:

res = QMessageBox.question(QMessageBox(currentWindow), "Question",  "Are you sure?", QMessageBox.Yes | QMessageBox.No)

Диалог открывается в непонятном месте, далеко от родительского окна currentWindow.
Такое же поведение прослеживается при других статических вызовах:
QMessageBox.warning
QMessageBox.critical и.т.д.
ОС: MacOS 10.12
Вопрос: возможно ли заставить модальное окно открываться поверх родителя, а не где попало?

Попробуйте указывать напрямую родителя (первый аргумент в методе):

res = QMessageBox.question(currentWindow, "Question",  "Are you sure?", QMessageBox.Yes | QMessageBox.No)

Если вызов диалога происходит внутри вашего класса-виджета, то указывайте
self:

res = QMessageBox.question(self, "Question",  "Are you sure?", QMessageBox.Yes | QMessageBox.No)


Как сделать групповую выборку файлов
Есть код, который выбирает 1 файл. Необходимо изменить код, чтобы можно было выбрать и использовать пути сразу нескольких файлов; чтобы их потом записать построчно в текстовый файл.
<code>
    import sys
    from PyQt5.QtWidgets
import QApplication, QWidget, QFileDialog

    def toFeatureAnomalies(part):

        with open('feautures.txt', 'a')as f:
            f.write(part + '\n')
            f.close()
            print(f)

    if __name__ == '__main__':

        app = QApplication(sys.argv)

        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        files, _ = QFileDialog.getOpenFileNames(None, "Выберите файлы данных (data.csv) ", "", "(*.csv)",
                                                options=options)

        part = None
        for _file in files:
            if 'data' in _file:
                part = _file

        if part:
            print(part)
            toFeatureAnomalies(part)
        else:
            print("Что-то пошло не так:")
</code>

Попробуйте вызывать ваш код с
toFeatureAnomalies на каждом файле из списка:

import sys
from PyQt5.QtWidgets import QApplication, QFileDialog

def toFeatureAnomalies(part):
    with open('feautures.txt', 'a') as f:
        f.write(part + '\n')
        print(f)

if __name__ == '__main__':
    app = QApplication(sys.argv)

    options = QFileDialog.Options()
    options |= QFileDialog.DontUseNativeDialog
    files, _ = QFileDialog.getOpenFileNames(None, "Выберите файлы данных (data.csv) ", "", "(*.csv)", options=options)

    for f in files:
        if 'data' in f:
            print(f)
            toFeatureAnomalies(f)
        else:
            print("Что-то пошло не так:")


Как соединить(замкнуть) ломаную? Без добавления первой точки в список
<code>
import sys

from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow, QGridLayout
from PyQt5.QtGui import QPainter, QPainterPath
from PyQt5.QtCore import Qt, QSize

platforms = [
    [(500, 420), (170, 300), (420, 140), (300, 390)],
    [(460, 230), (250, 310), (100, 520)],
    [(300, 500), (470, 390), (270, 200)]
]
...
...
        def draw_platform(platform):
            x, y = map_point(platform[0][0], platform[0][1])
            # print("platform_move_x:", x, "platform_move_y:", y)
            path.moveTo(x, y)
            for x, y in platform[1:]:
                x, y = map_point(x, y)
                # print("platform_line_x:", x, "platform_line_y:", y)
                path.lineTo(x, y)

        for platform in platforms:
            draw_platform(platform)
        qp.drawPath(path)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())```
</code>

import sys

from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow, QGridLayout
from PyQt5.QtGui import QPainter, QPainterPath
from PyQt5.QtCore import Qt, QSize

platforms = [
    [(500, 420), (170, 300), (420, 140), (300, 390)],
    [(460, 230), (250, 310), (100, 520)],
    [(300, 500), (470, 390), (270, 200)]
]
...
...
        def draw_platform(platform):
            x, y = map_point(platform[0][0], platform[0][1])
            path.moveTo(x, y)
            for x, y in platform[1:]:
                x, y = map_point(x, y)
                path.lineTo(x, y)

            # Просто добавьте ещё одну линию от конца к началу:
            x, y = map_point(platform[0][0], platform[0][1])
            path.lineTo(x, y)

        for platform in platforms:
            draw_platform(platform)
        qp.drawPath(path)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    sys.exit(app.exec_())


Если рядом со строкой
    results[i, sequence] =1
вы выведите значения самих
i и
sequence, то увидите, что обрабатываются не все элементы, а только те, номера которых содержатся в массиве test.
Например, для i=0 это будут 0, 1, 3, 4, 5, 6, 7 и 9, соответственно элементы с индексами 2, 8, 10, 11, 12 и 13 не обрабатываются и остаются нулевыми.


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

currentDir = os.path.dirname(__file__).
Я сделал функцию которая возвращает значение currentDir, и импортировал ее в другой файл, и конечно мне выдало путь до каталога, из которого я импортирую.
Как можно сделать функцию, которая при импортировании в другой файл, возвращала полный путь до этого, "другого", файла ?
Вопрос и описание немного не корректны мне нужно именно полный путь до каталога, и которого запускается файл.

Для этого Вам нужно найти вызывающий код и его файл, то есть, анализировать стек вызова текущей функции. Как раз для этого существует встроенный модуль inspect. Пример:
Файл
mytest.py:

import inspect

def task():
    # берём вызвавший эту функцию фрейм
    frm = inspect.stack()[1]
    # берём модуль Питона этого фрейма
    mod = inspect.getmodule(frm[0])
    # используем нужные переменные
    print(mod.__file__)

Файл
main.py:

from mytest import task
task()

Вывод:

/Users/AivanF/Desktop/main.py


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

def create_app():
    app = flask.Flask(__name__)
    app.secret_key = os.urandom(32)
    def first_to_do():
       bot_cookies = bot_init.get_cookies()
    first_to_do()
    return app
app = create_app()

По старту функция
first_to_do() выполняется,но я не знаю как записать результат ее работы

Этой цели служит g-объект
<code>
from flask import g

def first_to_do():
    g.bot_cookies = bot_init.get_cookies()
</code>


При сохранении в csv python выдает ошибку кодирования
Пытаюсь распарсить
html страничку, потом все данные переложить в
Dataframe и его уже сохранить в
CSV, все операции отрабатывали нормально, но как только начинаю сохранять в
csv, то система выдает ошибку:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 49: character maps to

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

# -*- coding: utf8 -*-
from bs4 import BeautifulSoup
import os
import pandas as pd

df = pd.DataFrame({
    'Column':['test']
})

path = 'C:\\Users\\Desktop\\folder'
os.chdir(path)

def main(x):
    html = open(x)
    soup = BeautifulSoup(html, 'html.parser')
    div = soup.find_all('a', class_='title-link')
    for i in div:
        b = i.get_text()
        df.loc[len(df)]=[b]
        print(df)
    return df

for filename in os.listdir(path):
    main(filename)

df.to_csv('C:\\Users\\Desktop\\out.csv', sep='\t', encoding='utf-8')

Полная ошибка:

Traceback (most recent call last):
File "C:/Users/PycharmProjects/dataset/parser.py", line 23, in
main(filename)
File "C:/Users/PycharmProjects/dataset/parser.py", line 14, in main
soup = BeautifulSoup(html, 'html.parser')
File "C:\Users\PycharmProjects\dataset\venv\lib\site-packages\bs4\__init__.py", line 244, in __init__
markup = markup.read()
File "C:\Users\AppData\Local\Programs\Python\Python37-32\lib\encodings\cp1251.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 49: character maps to <undefined>

Судя по ошибке,
BeautifulSoup попытался файл открыть и считать не в той кодировке, что должна была.
В стеке трассы видно, что файл был считан как
cp1251 (
...lib\encodings\cp1251.py). Это случилось потому-что в функции
open если не указывать кодировку будет использоваться системная.
Решение будет через указание кодировки:

html = open(x, encoding='utf-8')

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

with open(x, encoding='utf-8') as f:
    html = f.read()

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

with open(x, 'rb') as f:
    html = f.read()


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

Для создания UI необходимо использовать библиотеку или фреймворк, который позволяет отрисовывать графические элементы делая соответсвующие вызовы ОС.
Самый известный в мире Python, но далеко не самый лучший, это tkinter . Он входит в стандартную библитеку и не требует установки дополнительных модулей.
То, что я часто вижу вокруг как ответ по умолчанию для UI на Python - это биндинг (возможность вызывать код одного языка из другого языка) Qt к Python: PyQt. В том числе PyQt3D. Qt написал на С++, но ничто не мешает набросать окошко в QtDesigner, а логику его поведения реализовать на Python.
Другая известная библиотека - wxPython. Но я никогда её не использовал, не могу сказать ничего определённого.


Ежечасовая рассылка [закрыт]

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

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

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

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

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

Напишите скрипт для рассылки. Запускайте по расписанию, например
celery beat/cron.
Таким образом это будет независимая задача. Но не забывайте про лимиты, так как используете тот же токен бота.


Как получить значения атрибутов класса из списка в Python?
Есть какой-то класс:

class MyClass:
    a = 1
    b = 2
    c = 3
    d = 4

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

attrs = ['a', 'd']

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

{'a': 1, 'd': 4}

До этого я не знал, но оказывается специально для этого есть такой простой метод getattr:
<code>
my_class = MyClass()
result = {}
[result.update({attr: getattr(my_class, attr)}) for attr in attrs]
</code>


Фильтр по модели с ManyToMany
Всем привет
У меня есть типичная модель с ManyToMany:

class Dialogue(models.Model):
    Partakers = models.ManyToManyField(Profile, related_name='dialogs')

И, например, у меня есть диалог между двумя Profile. Мне надо его выбрать через get. То есть мне нужно что-то наподобие:

Dialogue.objects.get(Partakers=[recipient,self.request.user])

Но так это не работает: django в ошибках пишет, что может обработать только строку или число, но не список.
И самое простое, что пришло в голову- это

Dialogue.objects.filter(Partakers__id=recipient_id).get(Partakers=self.request.user)

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

dialog = self.request.user.dialogs.filter(Partakers=recipient)

Результирующий запрос такой:

SELECT ••• FROM "main_dialogue" INNER JOIN "main_dialogue_Partakers" ON ("main_dialogue"."id" = "main_dialogue_Partakers"."dialogue_id") WHERE ("main_dialogue_Partakers"."profile_id" = '20' AND "main_dialogue_Partakers"."profile_id" = '7') LIMIT 21

Но такой куерисет всегда пустой

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

partakers = [recipient, self.request.user]

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

dialogs = Dialogue.objects.annotate(cnt=Count('Partakers')).filter(cnt=len(partakers))

Полученный
queryset итеративно фильтруем по каждому участнику диалога.

for partaker in partakers:
    dialogs = dialogs.filter(Partakers=partaker)

В результате
dialogs будет содержать
queryset содержащий только диалоги для профилей из списка.