Как в DataFrame оставить все уникальные значения начиная сверху?
Как в
df_name_serial_number оставить все уникальные значения
df_name_serial_number начиная сверху?
Приведу два примера, в обоих случаях данные одни и те же, в первом примере данные идут по порядку, во втором примере данные перемешанны (приближенные к реальным). Нужно отобрать уникальные значения обязательно НАЧИНАЯ СВЕРХУ в
df_name_serial_number.
Исходные данные:

import pandas as pd
from itertools import combinations

#создаем df
df = pd.DataFrame(data={'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8], 'C': [9, 10, 11, 12], 'D': [13, 14, 15, 16], 'E': [17, 18, 19, 20],  'F': [21, 22, 23, 24], 'G': [25, 26, 27, 28], 'H': [29, 30, 31, 32], 'L': [33, 34, 35, 36], 'K': [37, 38, 39, 40], 'M': [41, 42, 43, 44], 'P': [45, 46, 47, 48]})

#создаем df_name_serial_number
cols = df.columns.to_list()
nums = list(range(len(cols)))

df_name_serial_number = pd.DataFrame(
        [[f"{cols[a]}_{cols[b]}", a, b] for a, b in list(combinations(nums, 2))],
        columns="name serial_number1 serial_number2".split())

Пример

Данный пример приведен для понимания:

df_name_serial_number
    name  serial_number1  serial_number2

0   A_B               0               1
1   A_C               0               2
2   A_D               0               3
3   A_E               0               4
4   A_F               0               5
5   A_G               0               6
6   A_H               0               7
7   A_L               0               8
8   A_K               0               9
9   A_M               0              10
10  A_P               0              11
11  B_C               1               2
12  B_D               1               3
13  B_E               1               4
14  B_F               1               5
15  B_G               1               6
16  B_H               1               7
17  B_L               1               8
18  B_K               1               9
19  B_M               1              10
20  B_P               1              11
21  C_D               2               3
22  C_E               2               4
23  C_F               2               5
24  C_G               2               6
25  C_H               2               7
26  C_L               2               8
27  C_K               2               9
28  C_M               2              10
29  C_P               2              11
30  D_E               3               4
31  D_F               3               5
32  D_G               3               6
33  D_H               3               7
34  D_L               3               8
35  D_K               3               9
36  D_M               3              10
37  D_P               3              11
38  E_F               4               5
39  E_G               4               6
40  E_H               4               7
41  E_L               4               8
42  E_K               4               9
43  E_M               4              10
44  E_P               4              11
45  F_G               5               6
46  F_H               5               7
47  F_L               5               8
48  F_K               5               9
49  F_M               5              10
50  F_P               5              11
51  G_H               6               7
52  G_L               6               8
53  G_K               6               9
54  G_M               6              10
55  G_P               6              11
56  H_L               7               8
57  H_K               7               9
58  H_M               7              10
59  H_P               7              11
60  L_K               8               9
61  L_M               8              10
62  L_P               8              11
63  K_M               9              10
64  K_P               9              11
65  M_P              10              11

Как сделать вот такой результат, чтобы остались только уникальные значения в
df_name_serial_number НАЧИНАЯ СВЕРХУ? Если внимательно посмотреть, во всех трех столбцах остались уникальные значения:

df_name_serial_number
   name  serial_number1  serial_number2
0  A_B               0               1
1  C_D               2               3
2  E_F               4               5
3  G_H               6               7
4  L_K               8               9
5  M_P              10              11

Пример

В этом случае, а точнее всегда, они будут перемешены
df_name_serial_number.

    name  serial_number1  serial_number2
0   A_K               0               9
1   A_E               0               4
2   F_P               5              11
3   A_C               0               2
4   B_D               1               3
5   A_G               0               6
6   K_P               9              11
7   A_L               0               8
8   A_B               0               1
9   A_M               0              10
10  A_P               0              11
11  B_C               1               2
12  A_F               0               5
13  B_E               1               4
14  B_F               1               5
15  B_G               1               6
16  B_H               1               7
17  B_L               1               8
18  B_K               1               9
19  B_M               1              10
20  B_P               1              11
21  C_D               2               3
22  C_E               2               4
23  C_F               2               5
24  C_G               2               6
25  C_H               2               7
26  C_L               2               8
27  C_K               2               9
28  C_M               2              10
29  C_P               2              11
30  D_E               3               4
31  D_F               3               5
32  D_G               3               6
33  D_H               3               7
34  D_L               3               8
35  D_K               3               9
36  D_M               3              10
37  D_P               3              11
38  E_F               4               5
39  E_G               4               6
40  E_H               4               7
41  E_L               4               8
42  E_K               4               9
43  E_M               4              10
44  E_P               4              11
45  F_G               5               6
46  F_H               5               7
47  F_L               5               8
48  F_K               5               9
49  F_M               5              10
50  A_D               0               3
51  G_H               6               7
52  G_L               6               8
53  G_K               6               9
54  G_M               6              10
55  G_P               6              11
56  H_L               7               8
57  H_K               7               9
58  H_M               7              10
59  H_P               7              11
60  L_K               8               9
61  L_M               8              10
62  L_P               8              11
63  K_M               9              10
64  A_H               0               7
65  M_P              10              11

Как сделать вот такой результат? Чтобы остались только уникальные значения НАЧИНАЯ СВЕРХУ во всем
df_name_serial_number:

df_name_serial_number
   name  serial_number1  serial_number2
0   A_K               0               9
2   F_P               5               11
4   B_D               1               3
22  C_E               2               4
51  G_H               6               7
61  L_M               8              10

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

s = set()
keys = []

for name in df_name_serial_number["name"]:
    a,b = name.split("_")
    if a not in s and b not in s:
        keys.append(name)
        s |= set([a, b])

res = df_name_serial_number.query("name in @keys")

результат:

In [79]: res
Out[79]:
   name  serial_number1  serial_number2
0   A_K               0               9
2   F_P               5              11
4   B_D               1               3
22  C_E               2               4
51  G_H               6               7
61  L_M               8              10


Как уничтожить Label и Entry Tkinter Python? [дубликат]

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

Ошибка AttributeError: 'NoneType' object has no attribute при вызове метода виджета

                                (1 ответ)

Закрыт 3 месяца назад.

Создаю label, ставлю его через place и пытаюсь удалить его self.label.destroy(), но ничего не получается, с entry то же самое, pack_forget не работает тоже. Combobox получается удалить через destroy. Как нужно удалять элементы label и entry?
<code>
from tkinter import *
from tkinter import ttk

class HoverButton(Button):
    def __init__(self, master, **kw):
        Button.__init__(self, master = master, **kw)
        self.defaultBackground = '#2A2C2E'
        self['bd'] = 0
        self['activebackground'] = '#3C3E3F'
        self['font'] = ('Roboto', 13)
        self['cursor'] = "hand2"
        self['bg'] = '#2A2C2E'
        self.bind("<Enter>", self.on_enter)
        self.bind("<Leave>", self.on_leave)
    def on_enter(self, e):
        self['background'] = '#262829'

    def on_leave(self, e):
        self['background'] = self.defaultBackground

class HoverLabel(Label):
    def __init__(self, master, **kw):
        Label.__init__(self, master = master, **kw)
        self['bg'] = '#17191A'
        self['fg'] = 'white'
        self['font'] = ('Roboto', 12)

class mainWindow:
    def __init__(self):
        self.root = Tk()
        self.root.configure(bg='#17191A')
        self.root.geometry("1050x650+400+200")
        self.root.minsize(850, 360)
        self.root.resizable(width=True, height=True)

        self.settings = [HoverButton(self.root, text="Button", fg='white', command=lambda: self.Settings()), 0]
        self.settings[0].place(x=20, y=180, width=150, height=70)

    def Settings(self):
        if self.settings[1] == 0:
            self.label = HoverLabel(self.root, text = "Text").place(x=600, y=30)
            self.settings[1] = 1
        else:
            self.label.destroy()
            self.settings[1] = 0

if __name__ == "__main__":
    app = mainWindow()
    app.root.mainloop()
</code>

В этой строке:

self.label = HoverLabel(self.root, text = "Text").place(x=600, y=30)

в
self.label записывается результат вызова метода
place (который всегда возвращает
None), а не объект
HoverLabel. Из-за этого потом при попытке вызвать
destroy вылетает ошибка, что у
NoneType нет метода
destroy (программа не прерывается, но в терминале эту ошибку видно).
Чтобы работало правильно, нужно вызовы
place,
pack,
grid делать отдельно:

self.label = HoverLabel(self.root, text = "Text")
self.label.place(x=600, y=30)


Как сохранить данные в Python в txt файле?
Вот часть кода. Подскажите, как сделать чтобы  приходящие ответы от сервера сохранялись в блокнот (txt)?
<code>
for event in longpoll.listen():
    if event.type == VkBotEventType.GROUP_JOIN:
        print(event.obj.user_id, end=' ')
        print()
    elif event.type == VkBotEventType.GROUP_LEAVE:
        print(event.obj.user_id, end=' ')
        print()
</code>

У функции
print() есть параметр для этого:

with open("file.txt", "a") as f:
    print(event.obj.user_id, end=' ', file=f)


Как сделать вывод списка из функции в docx через docxtpl?
В продолжение темы.
Есть словарь:

dataorg = {'ДопВидДеят': [
    {'Код': '10.11', 'Текст': 'Переработка и консервирование мяса', 'Дата': '2017-06-29'},
    {'Код': '10.12', 'Текст': 'Производство и консервирование мяса птицы', 'Дата': '2017-06-29'},
    {'Код': '10.13.3', 'Текст': 'Производство мясных (мясосодержащих) консервов', 'Дата': '2017-06-29'}
]}

from docxtpl import DocxTemplate
file1 = DocxTemplate("file1.docx")
def okve():
    for i in range (0, len(dataorg['ДопВидДеят'])):
        ok = '- ' + dataorg['ДопВидДеят'][i]['Текст'] + ';'
        yield ok

con1 = {
        'okved' : "\n".join(okve());
       }
file1.render(con1)
file1.save('file.docx')

в file1.docx поставлен тег
{{ okved }}
Вывод в Python через
print показывает всё отлично:

 - Переработка и консервирование мяса;
 - Производство и консервирование мяса птицы;
 - Производство мясных (мясосодержащих) консервов;

А вот вывод в файле docx даёт список без переводов на новую строку:

- Переработка и консервирование мяса; - Производство и консервирование мяса птицы; - Производство мясных (мясосодержащих) консервов;

Экспериментировал в подстановку строки
"\n".join(okve()); вместо
"\n" различные варианты:

\r, символы юникода, скрытые символы Word, функцию
RichText() из docxtpl, не помогло.
Ищу дополнительные варианты решения вопроса.

PS Метка docxtpl не ставится.

Из документации:

The
RichText() or
R() offers newline, new paragraph, and page
break features : just use
\n,
\a, or
\f in the text, they will
be converted accordingly.
...

context = { 'var':R('my text') } and
{{r <var> }} in the template
(note the
r)

Т.е. в
file1.docx должно быть
{{r okved }} и в коде:

from docxtpl import DocxTemplate, R

con1 = {'okved' : R("\n".join(okve()))}


Как форматировать строку в 2 целых числа?
На ввод подаётся строка "283 + 5621".
Как разбить строку на 2 целых числа - 283 и 5621. Любых, которые будут введены, например "32 + 679"
И заставить интерпретатор сложить эти 2 целых, или даже дробных числа?
Операция может быть любой, вычитание, деление и т.д.

import operator

possible_operators = {'+': operator.add}  # добавляйте другие операторы, если надо

operation = '283 + 5621'
splitted_operation = operation.split()

operand_1 = int(splitted_operation[0])
operator = splitted_operation[1]
operand_2 = int(splitted_operation[2])

print(possible_operators[operator](operand_1, operand_2))


Сопоставление трёх списков
Имеется 3 списка:

a = [12, 12, 12, 12, 1, 1, 1]
b = [20, 21, 22, 23, 200, 201, 202]
c = ['04-04', '05-05', '06-06', '07-07', '008-008', '009-009', '100-100']

Требуется для уникального значения из
a вывести сопоставление из
b,
c равное количеству повторений значений
a, т.е.:
uid=12

20 04-04
21 05-05
22 06-06
23 07-07

uid=1

200 008-008
201 009-009
202 100-100

вывод уникальных значений из
a:

    for i in range(0, len(list(set(a)))):
        print('uid=' + str(sorted(set(a), key=a.index)[i]))
    >>> uid=12
    >>> uid=1

количество повторяющихся элементов в
a:

for i in range(0, len(list(set(a)))):
    print(a.count(sorted(set(a), key=a.index)[i]))
>>> 4
>>> 1

сопоставление
b и
c:

x = []
for j, o in zip(b, c):
    x.append(str(j) + ':' + o)
print(x)
>>> ['20:04-04', '21:05-05', '22:06-06', '23:07-07', '200:008-008', '201:009-009', '202:100-100']

Дальше ступор, как сопоставить ума не приложу

При условии, что повторяющиеся элементы идут подряд и больше не встречаются:
<code>
from collections import Counter

a = [12, 12, 12, 12, 1, 1, 1]
b = [20, 21, 22, 23, 200, 201, 202]
c = ['04-04', '05-05', '06-06', '07-07', '008-008', '009-009', '100-100']

result = {}
start = 0
stop = 0

for key, value in Counter(a).items():
  start = stop
  stop = start + value

  result[key] = list(zip(b[start:stop], c[start:stop]))

print(result)
</code>


Как заменить строки с 0 на значения из строки выше с о значением !=0?
Создают новый столбец, в нем полявляются нужные мне значения через огромные пропуски
NaN.
Удаляю пропуски первой строкой кодa - меняю их на 0. Затем, хочу заменить значения 0 на те, которые были так сказать до этого числом - через проверку по условию пытаюсь копировать, но так в лоб не копируются значения.
Как сделать правильно?

df.fillna(0, inplace=True)
df.loc[df['mes'] == 0, 'mes'] = df['mes'].shift(1)

44.7
0
0
0
0
0
0
0
0
45.2
0
0
0
0

Итог:

44.7
44.7
44.7
44.7
44.7
44.7
44.7
44.7
44.7
45.2
45.2
45.2
45.2
45.2

Вместо
df.fillna(0, inplace=True)  воспользуйтесь методом Series.ffill():

df['mes'] = df['mes'].ffill()


Как убрать переносы строки из списка при обработке в python3?
У меня есть csv-файл, который содержит строки с 2 значениями в каждой строке. Я работа в Python 3.7. Мне нужно получить информацию из второго значения и записать в эту же строку ответ.
Я решил прочитать документ построчно, заключить значения в список и работать со значениями этого списка. Для этого я сделал следующее:
<code>
with open('datafile.csv', "r") as file:
    for row in file:
        red_row = row.split(',')
        print(red_row)
</code>
Но в качестве ответа получил списки, у которых в последнем значении сохраняется перенос строки:
[193376,предположение\n]
Вопрос: как мне убрать перенос строки \n из второго значения и вставить в конец третьего? Можно ли это сделать стандартными библиотеками python3? Или может быть я выбрал не самый лучший путь для выполнения своей задачи и есть какой-то альтернативный путь, о котором я не знаю?
P.S. я только начинаю программировать и многие вещи еще не понимаю. Я был бы очень благодарен за подробное объяснение. Заранее спасибо.

Используйте метод
.strip() перед
.split(','):

with open('datafile.csv') as file:           # "r" не нужно (но может быть)
    for row in file:
        red_row = row.strip().split(',')
        print(red_row)

Объяснение:
Метод
.strip() убирает пустые символы (как например пробел, табулятор и
'\n') из начала и конца строки.
Существуют тоже методы
.lstrip() («left strip») и
.rstrip() («right strip») для удаления только из начала или из конца строки; в вашем случае
.rstrip() тоже подходящий.


Задача «Адресная книга» от Swaroop-a (книга "Byte of Python"). Правильно ли я её решил?

Создайте собственную программу «Адресная книга», работающую из командной строки и позволяющую просматривать, добавлять, изменять, удалять или искать контактные данные ваших знакомых.Кроме того, эта информация также должна сохраняться на диске для последующего доступа"

Этот код работает. Но решение ли это данной задачи?
<code>
import pickle
import os

class Addrres:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    # добавление
    def add(self):
        book = {}
        book['name'] = self.name
        book['age'] = self.age

        data = 'D:\\Papka\\' + self.name + '.data'
        f = open(data, 'wb')
        pickle.dump(book, f)
        f.close()
        del book

    # чтение
    def reader(self):
        data = 'D:\\Papka\\' + self.name + '.data'
        f = open(data, 'rb')
        stored = pickle.load(f)
        print(stored)

    # удаление
    def deleter(self):
        os.remove('D:\\Papka\\' + self.name + '.data')

    # изменение
    def changer(self):
        os.remove('D:\\Papka\\' + self.name + '.data')
        newname = input('New name: ')
        newage = input('New age: ')
        self.name = newname
        self.age = newage
        book = {}
        book['name'] = self.name
        book['age'] = self.age

        data = 'D:\\Papka\\' + self.name + '.data'
        f = open(data, 'wb')
        pickle.dump(book, f)
        f.close()
        del book

o = input('What do we do: ')

'''
добавление - "0"
чтение - "1"
изменение - "2"
удаление - "3"
'''

if o == '0':
    a = input('Age: ')
    b = input('Name: ')
    address = Addrres(b, a)
    address.add()
elif o == '1':
    a = input('Name: ')
    address = Addrres(a, age=1)
    address.reader()
elif o == '3':
    a = input('Name: ')
    address = Addrres(a, age=1)
    address.deleter()
elif o == '2':
    a = input('Name: ')
    address = Addrres(a, age=1)
    address.changer()
</code>

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


Один цикл для нескольких списков
Есть 24 списка. Каждый из них хранит по 10 элементов вида (1671, 945).
Есть ли возможность в одном цикле пройти все 240 элементов из 10 списков?
P.S мне нужно имеено 10 списков, сделать один список с 240 элементами нельзя.
<code>
for cord in (что то тут)
  pyautogui.click(cord)
</code>

Надо делать не один список из 240 элементов, а список из 24 списков по 10 элементов каджый.
И тогда все элементарно
(3 на три только для примера, на самом деле код работает при любом количестве и при любом размере каждого списка)

list1=[1,2,3]
list2=[4,5,6]
list3=[7,8,9]
list=[list1,list2,list3]
for lt in list:
    for ltn in lt:
        print(ltn)

Результат:

1
2
3
4
5
6
7
8
9

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


Как сделать что бы программа выполнялась определенное время
Например, у меня есть цикл:
<code>
while True:
    print(1)
</code>
Как я могу сделать, чтобы он выполнялся 30 секунд, а после 30 секунд он останавливался, и запускался другой цикл?

import time
howLongToRun = 30 #30 seconds
timeout = time.time() + howLongToRun
while True:
    print(1)
    if time.time() > timeout:
        break
# you other loop:
...


Как упаковать стороний python3 модуль в rpm пакет для CentOS 7?
Я написал python3 модуль который использует следующие сторонние модули:
jinja2,
requests,
ipaddress,
datetime,
Для своего модуля я составил .spec файл:

%global srcname netlord

Name:           netlord
Version:        0.1
Release:        1%{?dist}
Summary:        Network administration module

License:        None
URL:            None
Source0:        SOURCES.tar.gz

BuildArch:      noarch
BuildRequires:  python3-devel
#BuildRequires:  python3dist(jinja2)
#BuildRequires:  python3dist(argparse)
#BuildRequires:  python3dist(ipaddress)
#BuildRequires:  python3dist(datetime)
BuildRequires:  python3-pip

Requires: python3
#Requires: python3-jinja2
#Requires: python3-datetime
#Requires: python3-requests
#Requires:  python3dist(jinja2)
#Requires:  python3dist(ipaddress)
#Requires:  python3dist(datetime)
Requires:  python3-pip

#%{?python_disable_dependency_generator}
%?python_enable_dependency_generator

%description
network administration module

%prep
%autosetup -n %{srcname}-%{version}
# Adding netlodrd group
getent group netlord || groupadd netlord

%build
%py3_build

%install
%py3_install
cp -r %{_sourcedir}/%{srcname}-%{version}/var %{buildroot}
cp -r %{_sourcedir}/%{srcname}-%{version}/etc %{buildroot}

%files
/usr/bin/netlord-check-config
/usr/bin/netlord-update-db
%attr(0775, root, netlord) %{_sysconfdir}/netlord/config
%attr(4775, root, netlord) /var/netlord
%{python3_sitelib}/%{srcname}-*.egg-info/
%{python3_sitelib}/%{srcname}/

rpm собирается успешно, но при запуске модуля возникают ошибки свидетельствующие о том что у меня не установлены соответствующие модули. Что весьма логично, поскольку я закомментировал строки c Requires.
Если их раскомментировать то ничего не получится по 2-м причинам:

Строки типа:

Requires:  python3dist(ipaddress)

либо не смогут перевести эту запись в название rpm пакета, либо не найдут в репозиториях соответствующего пакета.

Строки типа:

Requires: python3-jinja2

просто не найдут нужного пакета.
Да, я вижу несколько очевидных байпасов:
добавить в
%prep что то вроде
pip3 install jinja2
или найти third-party репозитории с нужными пакетами и подключить их.
Но думаю что это скорее костыли чем решение.
В различных гайдах я нашёл 2 решения этой проблемы которые не сработали:

%?python_enable_dependency_generator
которой должен из .egg доставать все нужные зависимости и просто найти и указать всё в виде .rpm зависимостей что оказалось не сработает для стандартных репозиториев CentOS 7.
Ну и собственно сам вопрос: как добавить в rpm сторонние модули python3 при сборке собственного?

Ответ "относительно" прост. Нужно создать отдельный пакет для каждого модуля, для которого нет пакета в предпочитаемых репозиториях.
Полагаю, что пакеты из EPEL не могут считаться костылём, соответственно, если пакет есть там, то свой создавать не нужно.
Из перечисленного вами, уже имеются:
<code>
Requires: python36-jinja2
Requires: python36-requests
</code>


Почему не работает exec("global numb")?
У меня возник вопрос, как сделать переменную глобальной, не зная заранее её имени. Первое что мне пришло в голову, это использовать exec(), но, видимо, я не до конца понял как работает эта функция. Я попробовал:

def df(variable):
    exec(f"global {variable}")
    exec(f"{variable} = 1")

numb = 10
variable = "numb"
print(numb)
df(variable)
print(numb)

В моих мечтах вывод должен получиться

10
1

Однако выходит

10
10

Пожалуйста, подскажите что я делаю не так.
Если exec() на такое не способен, то может быть есть другая функция, которая может это сделать.
PS: Если что, то это просто пример, в полном коде переменная variable задаётся путём ввода с клавиатуры, но там это тоже не работает((

Мечты сбываются!

def df(variable):
    exec(f"global {variable}")
    exec(f"{variable} = 1", globals())

numb = 10
variable = "numb"
print(numb)
df(variable)
print(numb)

Как указали в комментариях,
exec(f"global {variable}") можно не писать.


Считывание json и фильтрация данных
Я хочу написать скрипт на Python3 для того, чтобы он автоматически давал мне id из дампа, есть загвоздка, в дампе все строки имеют следующий вид:
<code>
[{"id": 731590121, "first_name": "Ivan", "last_name": "Ivanovich", "user": "PutinVodkaBalalayka", "phone": "788005553535", "is_bot": false}, {"id": 719381938, ... "is_bot": false]
</code>
Загвоздка в том, что мне нужен лишь id (для взаимодействия с api), если будете делать очистку файла, то можете дать мне пример с выводом результатов (в реальном времени по ходу работы скрипта) в консоль?

dpath

from dpath import util

d = [{'id': 731590121, 'first_name': 'Ivan', 'last_name': 'Ivanovich', 'user': 'PutinVodkaBalalayka', 'phone': '788005553535', 'is_bot': False}, {'id': 719381938, 'is_bot': False}]

print(util.values(d, "*/id"))
# [731590121, 719381938]


Быстрый перебор переменных
У меня есть 9 переменных:
<code>
p_1 = int(input())
p_2 = int(input())
P_3 = int(input())
p_4 = int(input())
p_5 = int(input())
p_6 = int(input())
p_7 = int(input())
p_8 = int(input())
p_9 = int(input())
</code>
В следующим шаге мне нужно перебрать все 9 переменных, как это сделать быстро(с помощью цикла for in)?

all_p = [int(input()) for _ in range(9)]

for p in all_p:
    # Тут делаете то, что вам нужно с переменной "p"


Как присвоить порядковый номер в DataFrame столбцам (комбинаторика)?
Чтобы точно и понятно объяснить, что мне нужно, приведу пример последовательности действий:

Есть DataFrame (в реале же их намного больше):

df = pd.DataFrame(data={'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8], 'C': [9, 10, 11, 12], 'D': [13, 14, 15, 16], 'E': [17, 18, 19, 20],  'F': [21, 22, 23, 24], 'G': [25, 26, 27, 28], 'H': [29, 30, 31, 32], 'L': [33, 34, 35, 36], 'K': [37, 38, 39, 40], 'M': [41, 42, 43, 44], 'P': [45, 46, 47, 48]})
df

   A  B   C   D   E   F   G   H   L   K   M   P
0  1  5   9  13  17  21  25  29  33  37  41  45
1  2  6  10  14  18  22  26  30  34  38  42  46
2  3  7  11  15  19  23  27  31  35  39  43  47
3  4  8  12  16  20  24  28  32  36  40  44  48

Делаю комбинаторику с помощью
itertools.combinations и получаю суммы столбцов:

my_list=[(pd.Series(df.loc[:,list(i)].sum(axis=1),\
name='_'.join(df.loc[:,list(i)].columns))) for i in list(itertools.combinations(df.columns,2))]
final_df=pd.concat(my_list,axis=1)
print(final_df)

     A_B  A_C  A_D  A_E  A_F  A_G  A_H  ...  H_P  L_K  L_M  L_P  K_M  K_P  M_P
 0    6   10   14   18   22   26   30  ...   74   70   74   78   78   82   86
 1    8   12   16   20   24   28   32  ...   76   72   76   80   80   84   88
 2   10   14   18   22   26   30   34  ...   78   74   78   82   82   86   90
 3   12   16   20   24   28   32   36  ...   80   76   80   84   84   88   92

Вот на этом шаге вопросы. Как мне получить вот такой вот, назову его,
df_name_serial_number?
а) в столбце 'name' находятся имена столбцов
df из шага (2.Делаю комбинаторику).
б) в столбце 'serial_number1' эта порядковый номер из
df на шаге (1.есть DataFrame).
в) в столбце 'serial_number2' эта порядковый номер из df на шаге (1.есть DataFrame).
Другими словами,
A_B их порядковые номера из шага #1, у 'A'порядковый номер 0, а у 'B' порядковый номер 1. и т.д.

    name  serial_number1  serial_number2
0   A_B               0               1
1   A_C               0               2
2   A_D               0               3
3   A_E               0               4
4   A_F               0               5
5   A_G               0               6
6   A_H               0               7
7   A_L               0               8
8   A_K               0               9
9   A_M               0              10
10  A_P               0              11
11  B_C               1               2
12  B_D               1               3
13  B_E               1               4
14  B_F               1               5
15  B_G               1               6
16  B_H               1               7
17  B_L               1               8
18  B_K               1               9
19  B_M               1              10
20  B_P               1              11
21  C_D               2               3
22  C_E               2               4
23  C_F               2               5
24  C_G               2               6
25  C_H               2               7
26  C_L               2               8
27  C_K               2               9
28  C_M               2              10
29  C_P               2              11
30  D_E               3               4
31  D_F               3               5
32  D_G               3               6
33  D_H               3               7
34  D_L               3               8
35  D_K               3               9
36  D_M               3              10
37  D_P               3              11
38  E_F               4               5
39  E_G               4               6
40  E_H               4               7
41  E_L               4               8
42  E_K               4               9
43  E_M               4              10
44  E_P               4              11
45  F_G               5               6
46  F_H               5               7
47  F_L               5               8
48  F_K               5               9
49  F_M               5              10
50  F_P               5              11
51  G_H               6               7
52  G_L               6               8
53  G_K               6               9
54  G_M               6              10
55  G_P               6              11
56  H_L               7               8
57  H_K               7               9
58  H_M               7              10
59  H_P               7              11
60  L_K               8               9
61  L_M               8              10
62  L_P               8              11
63  K_M               9              10
64  K_P               9              11
65  M_P              10              11

Второй вопрос - как из полученного
df_name_serial_number начиная сверху (!) убрать все повторяющиеся название? Чтобы получилось так:

df_name_serial_number

    name  serial_number1  serial_number2
0   A_B               0               1
21  C_D               2               3
38  E_F               4               5
51  G_H               6               7
60  L_K               8               9
65  M_P              10              11

3)

cols = df.columns.to_list()

nums = list(range(len(cols)))

res = pd.DataFrame(
        [[f"{cols[a]}_{cols[b]}", a, b] for a, b in list(combinations(nums, 2))],
        columns="name serial_number1 serial_number2".split())

In [63]: res
Out[63]:
   name  serial_number1  serial_number2
0   A_B               0               1
1   A_C               0               2
2   A_D               0               3
3   A_E               0               4
4   A_F               0               5
..  ...             ...             ...
61  L_M               8              10
62  L_P               8              11
63  K_M               9              10
64  K_P               9              11
65  M_P              10              11

[66 rows x 3 columns]

4)

df_name_serial_number = \
    pd.DataFrame([[f"{cols[i-1]}_{cols[i]}", i-1, i] for i in range(1, len(cols), 2)],
                 columns=["name", "serial_number1", "serial_number2"])

In [65]: df_name_serial_number
Out[65]:
  name  serial_number1  serial_number2
0  A_B               0               1
1  C_D               2               3
2  E_F               4               5
3  G_H               6               7
4  L_K               8               9
5  M_P              10              11


Как из вложенного списка сделать 3 вложенных списка?
Всем добрый день. Есть список в списке:

a = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]]

Подскажите, как этот внутренний список превратить из одного в три внутренних списка?:

a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]

Заранее спасибо!


Как добавить еще один столбец с результатом в CSV файл?

filename = input('Enter name of file: ')
file = open(filename, 'r')
arr = []
arr1 = []

arr = file.readlines()

for i in arr:
    arr1.append(i.strip().split(','))

#------Sorting--------------
for i in arr1:
    sumprice = (int(i[1])*int(i[2]))
    file.write(str(sumprice))
file.close

Программа должна добавлять в конец каждой строки файла результат -
sumprice.
Вот файл:

potato,45,20,Belarus
kosyak,74,30,Kazahstan
joint,35,50,USA
vodka,68,23,Russia
tea,20,34,UK
bagget,50,40,France

Должно выйти вот так:

potato,45,20,Belarus,900
kosyak,74,30,Kazahstan,2220
joint,35,50,USA,1750
vodka,68,23,Russia,1564
tea,20,34,UK,680
salo,50,40,Ukraine,2000

Во-первых, необходимо открыть файл повторно, на этот раз на запись, переписав полностью его содержимое. Код второй части будет примерно таким:
<code>
# открываем файл
with open(filename, mode='w') as fl:

    # определяем буферный список
    arr2 = []

    # проходим по коллекции расделенных данных
    for i in arr1:

        # вычисляем произведение
        sumprice = int(i[1])*int(i[2])

        # соединяем новую строчку на основе предыдущиз данных с добавлением
        # вычисленной суммы
        line = ','.join(i.append(sumprice))

        # добавляем строку в буферный список
        arr2.append(line)

    # соединяем все строки в один кусок текста
    write_text = '\n'.join(arr2)

    # записываем данные обратно в файл
    fl.write(write_text)
</code>


Помогите пожалуйста найти и исправить ошибку в коде [закрыт]

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

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

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

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

Помогите пожалуйста найти ошибку. Ошибка - inconsistent use of tabs and spaces in indentation (на строке 69). Сам код:
<code>
import time
import random
import easygui

def Stalker():

    # переменные
    history = "Однажды, на АЭС №7, произошла авария, которая унесла за собой много жизней. Животные мутировали, а на улице без противогаза находиться нельзя. 85% людей, умерли от лучевой болезни, 5% погибли от голода и жажды,"
    items_all = ["АК 47", "Батарейки", "Аккумулятор", "Кольт", "Дигл", "Фамас", "Фн фал", "Канистра", "мак 10", "Патроны", "Бочка топлива", "П 90", "Доски", "Револьвер", "Турель", "Ауг", "Тек 9", "Винчестер", "Деньги"] # список предметов, которые могут случайно выпасти
    rand_items = ("АК 47", "Батарейки", "Аккумулятор", "Кольт", "Дигл", "Фамас", "Фн фал", "Канистра", "мак 10", "Патроны", "Бочка топлива", "П 90", "Доски", "Револьвер", "Турель", "Ауг", "Тек 9") # список оружий, которые могут случайно выпасти
    rand_guns = ("АК 47", "Кольт", "Дигл", "Фамас", "Фн фал", "мак 10", "П 90", "Револьвер", "Турель", "Ауг", "Тек 9")
    VVU = 0 # Доступность действия "Войти в убежище"
    oil = 0 # топливо
    money = 0 # Кол - во денег
    inventory = ["Винчестер", "Патроны"]
    bullets = 20
    hp = 30 # здоровье
    event_home = 0
    bochka = 0 # бочкии с бензином
    kan = 0 # канситры с бензином

    def random_item():
        rand_item = random.choice(rand_items)
        inventory.append(rand_item)

        if rand_item == "Патроны":  # если выпали патроны

            rand_bullets = random.randint(1, 20)
            bullets = bullets + rand_bullets

        elif rand_item == "Бочка":
            bochka = bochka + 1

        elif rand_item == "Канистра":
            kan = kan + 1

    easygui.buttonbox(      # информация

        title = "Сталкерские похождения",
        msg = f"история: {history}",
        choices = ("далее", " "))

    easygui.msgbox(      # старт

        title = "Сталкерские похождения",
        msg = "7% мутировали, а оставшиеся 3% живы, и среди них вы. А оварию подстроила компания OMEGA corp.")

    name = easygui.buttonbox(              # имя персонажа

        msg = 'Выберете имя персонажа: ',
        title ='Сталкерские похождения',
        choices = ("Меченый", "Фантом"))

    easygui.msgbox(      # старт

        title = "Сталкерские похождения",
        msg = "Каждые 45 секунд, у вас будет повышаться здоровье на 1. Начнем игру!")

    while True:
        time.sleep(45)
        hp = hp + 1

    while True:

        if event_home == 7: # открытие убежища
            VVU = 1

        resh = easygui.buttonbox(      # Выбор действия

            title = "Сталкерские похождения",
            msg = "Выберете действие: ",
            choices = ("Сходить на разведку", "Войти в убежище", "Посмотреть инвентарь"))

        if resh == "Посмотреть инвентарь":
            easygui.msgbox(

            title = "Сталкерские похождения",
            msg = f"Содержимое: {inventory}, патроны - {bullets}, монет - {money}")

        if resh == "Войти в убежище" and VVU == 0:
            easygui.msgbox(

            title = "Сталкерские похождения",
            msg = "Это действие недоступно! Сходите 7 раз на разведку чтобы найти убежище.")

        if resh == "Войти в убежище" and VVU == 1: # убежище

            while True:

                home = easygui.buttonbox(

                title = "Сталкерские похождения",
                msg = "Вы в убежище, выберите действие: ",
                choices = "Назад", "Завести машину")

                if home == "Назад":
                    break

                if home == "Завести машину":

                    location_LVL = easygui.buttonbox(       # выбор локации по уровню опасности

                    title = "Сталкерские похождения",
                    msg = "На какой тип локации по опасности хотите отправиться? Ур опасности - ",
                    choices = "1", "2", "3", "4", "5")

                    if location_LVL == "1":

                        location = easygui.buttonbox(       # легкие локации

                        title = "Сталкерские похождения",
                        msg = "На какую локацию хотите отправиться?",
                        choices = "Магазин", "Площадка", "Пятерочка")

                    if location_LVL == "2":

                        location = easygui.buttonbox(       # средние локации

                        title = "Сталкерские похождения",
                        msg = "На какую локацию хотите отправиться?",
                        choices = "DNS", "М видео", "МЕГА")

                    if location_LVL == "3":

                        location = easygui.buttonbox(       # сложные локации

                        title = "Сталкерские похождения",
                        msg = "На какую локацию хотите отправиться?",
                        choices = "Бандитская группировка Дельта", "Бандитская группировка Альфа", "Минное поле")

                    if location_LVL == "4":

                        location = easygui.buttonbox(       # ОЧЕНЬ СЛОЖНЫЕ локации

                        title = "Сталкерские похождения",
                        msg = "На какую локацию хотите отправиться?",
                        choices = "Поле аномалий", "Лаборатория Х7", "Зона 51")

                    if location_LVL == "5":

                        location = easygui.buttonbox(       # ULTIMATE DESTRUCTION!!! *полное уничтожение

                        title = "Сталкерские похождения",
                        msg = "На какую локацию хотите отправиться?",
                        choices = "Оружейный склад", "Банк", "OMEGA corp.")

                if home == "Завести машину" and oil == 0:
                    oil_2 = easygui.buttonbox(       # заправить машину

                    title = "Сталкерские похождения",
                    msg = "У вас слишком мало топлива! Хотите заправить машину?",
                    choices = "Да", "Нет")

                    if oil_2 == "Нет":
                        break

                    if oil_2 == "Да":

                        oil_3 = easygui.buttonbox(       # чем заправить машину

                        title = "Сталкерские похождения",
                        msg = "Чем вы хотите заправить машину?",
                        choices = "Бочка (100%)", "Канистра (50%)")

                        if oil_3 == "Бочка (100%)" and bochka == 0: # если бочек нет

                            easygui.msgbox(

                            title = "Сталкерские похождения",
                            msg = "У вас нет бочек!")
                            break

                        if oil_3 == "Бочка (100%)" and bochka <= 1:
                            oil = oil + 100 # топливо
                            bochka = bochka - 1
                            inventory.remove("Бочка")

                            easygui.msgbox(

                            title = "Сталкерские похождения",
                            msg = "Вы заполнили бак на 100 едениц")

                        if oil_3 == "Канистра (50%)" and kan == 0:

                            easygui.msgbox(

                            title = "Сталкерские похождения",
                            msg = "У вас нет канистр!")
                            break

                        if oil_3 == "Канистра (50%)" and kan <= 1:
                            oil = oil + 50 # топливо
                            kan = kan - 1
                            inventory.remove("Канистра")

                            easygui.msgbox(

                            title = "Сталкерские похождения",
                            msg = "Вы заполнили на 50 едениц.")

        if hp == 0:
            easygui.msgbox(

            title = "Сталкерские похождения",
            msg = "У вас не осталось жизней! Игра окончена.")

            time.sleep(3)
            break

        if bullets == 0:
            inventory.remove("Патроны")

        if resh == "Сходить на разведку":

            event_home = event_home + 1 # убежище откроется если это значение бедет равно 7
            event_generate = random.randint(1, 5)

            if event_generate == 1:    # деньги
                kol_vo = random.randint(100, 500)

                money = money + kol_vo

                easygui.msgbox(

                title = "Сталкерские похождения",
                msg = f"Вы нашли {kol_vo} монет(у, ы)")

            if event_generate == 2: # случайный предмет

                rand_item = random.choice(rand_items)
                inventory.append(rand_item)

                easygui.msgbox(

                title = "Сталкерские похождения",
                msg = f"Вы нашли {rand_item}")

                if rand_item == "Патроны":  # если выпали патроны

                    rand_bullets = random.randint(1, 20)
                    bullets = bullets + rand_bullets

                    easygui.msgbox(

                    title = "Сталкерские похождения",
                    msg = f"Вы нашли {rand_bullets}, патрон(а, ов)")

            if event_generate == 3: # мутант
                hp = hp - 4

                re = random_item()

                easygui.msgbox(

                title = "Сталкерские похождения",
                msg = f"Вы встретили мутанта и убили его, он вам снес 4 жизни, у вас осталось {hp}. Вы получили с него {re}")

            if event_generate == 4: # сейф с лутом
                easygui.msgbox(

                title = "Сталкерские похождения",
                msg = "Вы нашли сейф в котором что - то лежит, и пробуете его взломать.")

                attempets = 6 # попытки
                number = random.randint(1, 100) # код от сейфа
                reward = random.choice(rand_guns) # награда (случайное оружие)

                while True:

                    if attempets == 0:

                        easygui.msgbox(

                        title = "Сталкерские похождения",
                        msg = "У вас закончились попытки!")

                        time.sleep(3)
                        break

                    number_user = easygui.integerbox(   # число пользователя

                    title = "Сталкерские похождения",
                    msg = "Нужно ввести код от сейфа, но каждый раз когда вы вводите код, показывается больше число или меньше. Всего у вас 6 попыток. Введите число от 1 до 100: ",
                    lowerbound = 1,
                    upperbound = 100)

                    if number_user > number:
                        attempets = attempets - 1

                        easygui.msgbox(

                        title = "Сталкерские похождения",
                        msg = "Ваше число больше!")

                    if number_user < number:
                        attempets = attempets - 1

                        easygui.msgbox(

                        title = "Сталкерские похождения",
                        msg = "Ваше число меньше!")

                    if number_user == number: # победа

                        easygui.msgbox(

                        title = "Сталкерские похождения",
                        msg = f"Вы угадали число! ваша награда - 1000 монет и {reward}")
                        money = money + 3000
                        inventory.append(reward)

                        time.sleep(3)
                        break

            if event_generate == 5:    # аномалия

                hp = hp - 10

                easygui.msgbox(

                title = "Сталкерские похождения",
                msg = f"Вы наткнулись на аномалию! Она ранила вас, у вас осталось {hp} здоровья.")

Stalker()
</code>

Ошибка одного и того же типа повторяется в строках 99,110,121,129,137,145,153,163,174.
Выбор для choices это список. Из-за невнимательности вы перестали его обрамлять скобками(до этого в строках 41,52 и 73 все было правильно).
Код запустился и других ошибок пока не увидел.


продолжить выполнение после контекстного менеджера `with ... as`
прошу подсказки)
задача: по ЛКМ вывести в терминал текущее активное окно windows, по ПКМ - выход

import win32gui
from pynput import mouse

button = None
def on_click(x, y, button, pressed):
    print('{0} at {1}'.format('Pressed' if pressed else 'Released', (x, y)))
    if button == mouse.Button.right:
        # Stop listener
        return False

with mouse.Listener(on_click=on_click) as listener:
    listener.join()

windowTile = ""
while button == mouse.Button.left:
    newWindowTile = win32gui.GetWindowText(win32gui.GetForegroundWindow())
    if newWindowTile != windowTile:
        windowTile = newWindowTile
        print(windowTile)

но после контекстного менеджера
with ... as, т.е. после
listener.join() код дальше не выполняется. как быть? )

Вызов метода join блокирует вызывающий поток до тех пор, пока не будет выполнен вызываемый, поэтому код дальше и не выполняется.
Попробуйте название текущего окна выводить в функции on_click:
<code>
def on_click(x, y, button, pressed):
    print('{0} at {1}'.format('Pressed' if pressed else 'Released', (x, y)))
    if button == mouse.Button.right:
        # Stop listener
        return False
    elif button == mouse.Button.left:
        print(win32gui.GetWindowText(win32gui.GetForegroundWindow()))
</code>
В таком варианте не потребуются переменные button и windowTile


NameError: name 'rental_ride_cost' is not defined
Необходимо написать несколько локальных функций в составе одной глобальной функции, которая бы возвращала сумму этих локальных функций. Две работают, в последней при попытке вывести результат на печать получаю ошибку:

NameError                                 Traceback (most recent call last)
<ipython-input-92-95d7ccd25070> in <module>()
     63
     64 # выводим результат
---> 65 print('Ваше пребывание в {} обойдется Вам в {} у.е. Приятного отдыха!'.format(city, trip_cost(hotel_cost, plane_ride_cost, **rental_ride_cost**)))

NameError: name 'rental_ride_cost' is not defined

# функция trip_cost(hotel_cost, plane_ride_cost, rental_ride_cost)
def trip_cost(hotel_cost, plane_ride_cost, rental_ride_cost):
    '''
        функцию расчета стоимости вашего путешествия
    '''

    # функция hotel_cost()
    def hotel_cost(num_nights):
        '''
            функция рассчета стоимости всех ночей проведенных в отеле
            принимает на вход кол-во ночей
            стоимость одной ночи КОНСТАНТА (140 у.е.)
        '''
        cost_hotel = 140
        cost_all_nights = cost_hotel * num_nights
        return cost_all_nights

    # функция plane_ride_cost()
    def plane_ride_cost(city):
        '''
            функция должна вернуть цену перелета в зависимости от места:
            если это Крым, то перелет обойдется в 120 у.е.,
            если Шри-Ланка - 800 у.е., если Каир - 400 у.е., если Сочи - 120 у.е.
        '''
        cost_flights = cities[city]
        return cost_flights

    # функция rental_ride_cost()
    def rental_ride_cost(days_ride):
        '''
            функция должна рассчитать стоимость аренды авто,
            если за сутки вы должны оплачивать саму ренту (40 у.е.) + стоимость услуг
            страхового агентства (+1% от суммарной стоимости услуг каждый следующий день.
            Т. е. первый день 1% от стоимости, второй - берется 1% от стоимости предыдущего
            дня (включая 1% за предыдущий день) и т. д. Если вы арендуете на 7 и более дней,
            то скидка - 50 у.е., если от 3 до 6 дней включительно - 20 у.е. Обе скидки получить сразу нельзя.
        '''
        rent = 40
        days_rental_ride = [rent + rent * 0.01]
        sum_days_rental_ride = 0
        for i in range(days_ride-1):
            days_rental_ride.append(days_rental_ride[i] + days_rental_ride[i] * 0.01)
        for el in days_rental_ride:
            sum_days_rental_ride += el
            if days_ride >= 3 and days_ride <=6:
                sum_for_cost_ride = round(sum_days_rental_ride - 20)
            elif days_ride >= 7:
                sum_for_cost_ride = round(sum_days_rental_ride - 50)
            else:
                sum_for_cost_ride = round(sum_days_rental_ride)
        return sum_for_cost_ride

    # считаем сумму локальных функций и возвращаем значение нашей основной функции
    cost_trip = hotel_cost(num_nights) + plane_ride_cost(city) + rental_ride_cost(days_ride)
    return cost_trip

# переменные используемые в функциях
# создадим список с названиями мест
cities = {'Крым' : 120, 'Сочи' : 120, 'Шри-Ланка' : 800, 'Каир' : 400}
city = input('Введите название места (города) в который планируете отпуск: ')   # попросим пользователя ввести название города (места)
num_nights = int(input('На сколько дней забронировать отель? '))                # кол-во дней в отеле
days_ride = int(input('Введите кол-во дней аренды авто: '))                     # кол-во дней аренды авто

# выводим результат
print('Ваше пребывание в {} обойдется Вам в {} у.е. Приятного отдыха!'.format(city, trip_cost(hotel_cost, plane_ride_cost, rental_ride_cost)))

Вы зачем-то в параметрах функции указываете имена, совпадающие с именами внутренних функций - какой в этом смысл не понятно. В параметрах функции должны передаваться значения, от которых зависит результат работы функции - в данном случае логично через параметры передавать то, что вводит пользователь. У вас же эти значения берутся из глобальной области видимости - это не очень хорошо, т.к. если вы вдруг начнете разбивать программу на модули, глобальные переменные перестанут быть доступны для функции.
Пример, как можно сделать:
<code>
def trip_cost(city, num_nights, days_ride):
    '''
        функцию расчета стоимости вашего путешествия
    '''

    ...  # Тут все остается без изменений

    # считаем сумму локальных функций и возвращаем значение нашей основной функции
    cost_trip = hotel_cost(num_nights) + plane_ride_cost(city) + rental_ride_cost(days_ride)
    return cost_trip

# переменные используемые в функциях
# создадим список с названиями мест
cities = {'Крым' : 120, 'Сочи' : 120, 'Шри-Ланка' : 800, 'Каир' : 400}

# Обернул в функцию, чтобы вводимые пользователем данные не были доступны глобально
def main():
    city = input('Введите название места (города) в который планируете отпуск: ')   # попросим пользователя ввести название города (места)
    num_nights = int(input('На сколько дней забронировать отель? '))                # кол-во дней в отеле
    days_ride = int(input('Введите кол-во дней аренды авто: '))                     # кол-во дней аренды авто

    # выводим результат
    print('Ваше пребывание в {} обойдется Вам в {} у.е. Приятного отдыха!'.format(city, trip_cost(city, num_nights, days_ride)))

main()
</code>


Как заполнить с клавиатуры массив студентов и вывести их оценки?
мой код:
<code>
class Student:
    def __init__(self, full_name="", group_number="", progress=[]):
        self.full_name = full_name
        self.group_number = group_number
        self.progress = progress

    def __repr__(self):
        return repr(("Студент: " + self.full_name + "  Группа: " + self.group_number))

    def addStu(self):
        print("Введите Фио: ")
        st.full_name = input()
        print("Введите номер группы: ")
        st.group_number = input()
        print("Введите последние 5 отценок : ")
        st.progress = []

st_size = 2
sz_ocenki = 5
students = []
for i in range(st_size):
    st = Student()
    st.addStu()
    for i in range(5):
        score = int(input())
        st.progress.append(score)
        # мне не понятно, как сохранять введенные данные 'score' ,
        # что б я в дальнейшем могу высчитать сумму и разделить на
        # 5(кол-во оценок), тем самым получив средний балл (все это во float)
    students.append(st)
</code>
Я конкретный новичок и свою проблему я не могу нормально загуглить (сформулировать мысль для поисковика)
В классе STUDENT, содержатся следующие поля:

фамилия и инициалы;
номер группы;
успеваемость (массив из пяти элементов).

Надо написать программу, выполняющую следующие действия:

ввод с клавиатуры данных в массив, состоящий из десяти экземпляров класса
STUDENT (записи должны быть упорядочены по возрастанию среднего балла);
вывод на экран фамилий и номеров групп для всех студентов, имеющих оценки 4 и 5
(если таких студентов нет, вывести соответствующее сообщение).

Цикл надо было прописать в методе.
В методах не используйте посторонних переменных.

<code>
class Student:

    def __init__(self, full_name="", group_number="", progress=[]):
        self.full_name = full_name
        self.group_number = group_number
        self.progress = progress

    def __repr__(self):
        return repr(("Студент: " + self.full_name + "  Группа: " + self.group_number))

    def addStu(self):
        print("Введите Фио: ")
        self.full_name = input()
        print("Введите номер группы: ")
        self.group_number = input()
        print("Введите последние 5 отценок : ")
        self.progress = []
        for i in range(5):
            score = int(input())
            self.progress.append(score)
    def getMarks(self): # возвращает список оценок
        return self.progress

st_size = 2
sz_ocenki = 5
students = [] # список студентов
for i in range(st_size):
    st = Student()
    st.addStu()
    students.append(st);

for student in students:
    print(student.getMarks())
</code>
Дальше сами, там уже легко.
P.S На питоне не писал очень давно уже, так что не судите строго.


Перевод аргументов в подходящий тип данных
Есть строка :

args = " abc 556 [d, [e, 1.14], True], 'two words' {dict:test}"

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

args = ["abc", 556, ["d", ["e", 1.14], True], "two words", {"dict":"test"}]

Сам пытался сделать через большое количество if/elif/else но к успеху не пришел.
Подскажите пожалуйста, как можно это адекватно реализовать.

Можно сделать так:
Объяснение на примере строки

args = " abc 556 [d, [e, 1.14], True], 'two words' {dict:test}"

Исходя из примера, предполагается, что запятые могут быть пропущены только после строк и чисел, после скобок
])} они стоят, там где нужны.

Сначала строку
args нужно "починить" - превратить содержимое в валидный код на Python. Для этого требуется обернуть строковые типы в кавычки и добавить недостающие запятые. Обычные поиск и замена здесь не подойдут, так как они затрагивают уже существующие строковые типы, например

re.sub(',? ', ',', args)

заменит пробел внутри
'two words' -
'two,words'. Следовательно, нужно отслеживать, чтобы замена не происходила внутри кавычек.

Я решил использовать модуль
tokenize, которым можно разбить строку на неделимые с точки зрения интерпретатора Python атомы (токены) с указанием их типа.

# В первом столбце тип токена
# Во втором значение токена
1    abc       # 1 = name. Без кавычек срока распознаётся как имя переменной.
2    556       # 2 = number
53   [         # 53 = operator
1    d
53   ,
53   [
1    e
53   ,
2    1.14
53   ]
53   ,
1    True
53   ]
53   ,
3    'two words' # 3 = string
53   {
1    dict
53   :
1    test
53   }

Проставляем запятые. Для добавления запятой к токену, требуется выполнение следующих условий:

текущий токен имеет тип: число, строка, "имя переменной".
следующий токен не
:,}]).

Оборачиваем в кавычки все токены типа "имя переменной" (кроме True, False) и меняем их тип на
string, таким образом преобразуя их в строки. В итоге строка выглядит так:

'abc', 556, ['d', ['e', 1.14], True], 'two words', {'dict':'test'}

Заключаем отремонтированную строку в квадратные скобки, чтобы на выходе получился список, и передаём методу
ast.literal_eval.
ast.literal_eval парсит эту строку, распознаёт типы данных и создаёт соответствующие объекты. В данном случае
ast.literal_eval предпочтительнее
eval(), так как имеет ограниченные возможности, что уменьшает риск исполнения вредоносного кода.

Решение

import ast
import tokenize
import io

def fixing_args(args):
    args = args.strip()
    args = io.StringIO(args).readline
    list_of_tokens = list(tokenize.generate_tokens(args))

    new_list_of_tokens = []
    need_sep_toks_types = {1, 2, 3}
    no_need_sep_toks = set(":,}])")

    for token, next_token in zip(list_of_tokens, list_of_tokens[1:]):
        separator = ',' if token.type in need_sep_toks_types and next_token.string not in no_need_sep_toks else ''

        tok_type, tok_string, *tok_others = token

        if token.type == 1 and token.string not in {"True", "False"}:
            tok_type = 3
            tok_string = f"'{token.string}'{separator}"
        else:
            tok_string = f"{token.string}{separator}"

        new_token = tokenize.TokenInfo(tok_type, tok_string, *tok_others)
        new_list_of_tokens.append(new_token)

    return tokenize.untokenize(new_list_of_tokens)

args = " abc 556 [d, [e, 1.14], True], 'two words' {dict:test}"

fixed_arg_string = fixing_args(args)
fixed_arg_string = f"[{fixed_arg_string}]"
lst_of_args = ast.literal_eval(fixed_arg_string)

for arg in lst_of_args:
    print(arg)

Output

abc
556
['d', ['e', 1.14], True]
two words
{'dict': 'test'}


Файлы ini в приложение на Python
Я использую файлы .ini для сохранение настроек в приложение ( приложение создано на питоне PyQt5 и использую его на платформе wondows ) и хочу интегрировать егиэо на ОС линукс, так вот в чем суть - могу ли я использовать эти файлы в Линукс ? Если нет то какие есть вариации ? Буду очень благодарен !

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


Привязать координаты к матрице и кликать
Есть массив с координатами.

class Cords:
    cord11 = (1190, 135)
    cord12 = (1352, 135)
    cord13 = (1514, 135)
    cord14 = (1676, 135)
    cord21 = (1199, 297)
    cord22 = (1352, 297)
    cord23 = (1514, 297)
    cord24 = (1676, 297)
    cord31 = (1190, 459)
    cord32 = (1352, 459)
    cord33 = (1514, 459)
    cord34 = (1676, 459)
    cord41 = (1190, 621)
    cord42 = (1352, 621)
    cord43 = (1514, 621)
    cord44 = (1676, 621)
    cord51 = (1190, 783)
    cord52 = (1352, 783)
    cord53 = (1514, 783)
    cord54 = (1676, 783)
    cord61 = (1190, 945)
    cord62 = (1352, 945)
    cord63 = (1514, 945)
    cord64 = (1676, 945)

Есть матрица со значениями :

[[ 33   0  33 229]
 [233 109 255 109]
 [ 60  72  60  59]
 [108   0 255  24]
 [ 59 229  77 108]
 [ 72  24  77 233]]

И там и там 24 элемента.
В матрице 12 пар. Тоесть каждому элементу есть пара.
Нужно как-то привязать координаты к матрице, и кликать мышью по совпадающим значениям.
К примеру в данной матрице 33 должно быть cord11, следующее 33 cor13.
А потом последовательно кликнуть по этим двум координатам.
Как кликать я знаю, не понятно как именно привязать координаты к каждому элементу и найти одинаковые элементы в матрице.


Задача с двумя списками
Сразу извиняюсь за очень длинный вопрос, но по другому описать не получается. По-началу задача показалось мне легкой, но по итогу два дня не с места. Всем заранее спасибо за ответы, при любых вопросах, пожалуйста, задавайте их в комментариях, я постараюсь ответить максимально быстро.
Существует список currentGrid. В нем 24 значения. Эти значения меняются после каждого нажатия левой кнопки мыши. Меняются определенным образом. До первого нажатия список выглядит так:

currentGrid = [40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]

24 значения, и все равны 40.
После первого клика, первый элемент со значением 40 изменяется, на какое-то случайное число.

currentGrid = [77, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]

После второго клика, второй элемент со значением 40 изменяется, на какое-то случайное число.Это может быть тоже самое число, а может и нет.

currentGrid = [77, 77, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]

После третьего клика, первый и второй элемент изменяется обратно на 40, но "открывается" третий элемент.Число также случайно.

currentGrid = [40, 40, 56, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]

И так далее: каждый четный клик открывается один элемент.
Каждый нечетный клик пропадают два предыдущих элемента и открывается один новый.
"Пропадает" = Значение элемента становится равно 40.
"Появляется" = Значение элемента становится отлично от 40.
Наконец-то к проблеме.
Нужно определенным образом записывать значения из
currentGrid в другой список, назовем его
saveGrid. В
saveGrid значения должны как-бы "сохраняться".
Привожу пример:
Элементы со значением 40 должны игнорироваться.
Первый клик:

currentGrid = [77, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]

saveGrid = [77]

Второй клик:

currentGrid = [77, 92, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]

saveGrid = [77, 92]

Третий клик:

currentGrid = [40, 40, 67, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]

saveGrid = [77, 92, 67]

Четвертый клик :

currentGrid = [40, 40, 67, 89, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]

saveGrid = [77, 92, 67, 89]

Пятый клик :

currentGrid = [40, 40, 40, 40, 11, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]

saveGrid = [77, 92, 67, 89, 11]

И так далее.
Также, список должен соблюдать порядок (не перемешивать все местами) , список должен вмещать в себя 24 значения.
Забыл упомянуть!
24 значения - это 12 пар.
То есть уникальных чисел 12, но у каждого есть пара, в сумме 24.
Напоминаю цель:
Нужно определенным образом записывать значения из currentGrid в другой список, назовем его saveGrid. В saveGrid значения должны как-бы "сохраняться".
Основная часть кода:

def getGrid():
 saveGrid = []
 currentGrid = []
 state_left = win32api.GetKeyState(0x01)
 while 1:
    a = win32api.GetKeyState(0x01)
    if a != state_left:
       state_left = a
       if a == 1 or a == 0 :
          time.sleep(0.3)
          image = ImageGrab.grab()
          for cord in Cords.cordArray:
           r, g, b = image.getpixel(cord)
           currentGrid.append(b)
          print(currentGrid)
          currentGrid.clear()

getGrid()

При открывании элемента он тут же пишется во второй список:

saveGrid.append(currentGrid[ClickNumber-1])

Чтобы отображалось только финальное состояние
saveGrid, можно поставить проверку на номер клика или достижение нужной длины

if len(saveGrid) == 24:
    печатать


MoviePy: обрезать видео
Нужно обрезать первые 15 секунд видео.
cutout не работает почему-то:

files = os.listdir('video/')
video = []
for a in files:
    print(a)
    if a.endswith(".mp4"):
        video.append(a)
if len(video) == 0:
    print('Ошибка\n')
else:
    for a in video:
        video = VideoFileClip('video/'+a).cutout(00.00,00.15)
        print(str(video.duration))
        result = fadein(result,12)
        result = mirror_x(result,  apply_to = 'mask')
        result.write_videofile("new_video/new_"+a,fps=30)

Видео на выходе получается той же продолжительности.
Может быть, есть ещё способы, или я использую этот неправильно?

Выяснилось, что cutout обрезает ту часть видео, которую укажешь, то есть не оставит с 0 до 15, а отрежет 15 секунд начала видео.
<code>
files = os.listdir('video/')
video = []
for a in files:
    print(a)
    if a.endswith(".mp4"):
        video.append(a)
if len(video) == 0:
    print('Ошибка\n')
else:
    for a in video:
        # Выясняем длину исходного видео
        video = VideoFileClip('video/'+a)
        #Обрезаем видео с 15 секунд до его конца округляя длину исходного видео
        video = video.cutout(15,round(video.duration))
        #Сохранение
        video.write_videofile("new_video/new_"+a,fps=30)

</code>


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

input_csv_file, в котором есть столбец ['index']
input_file_w_address, который представляет собой список из кортежей:
[(индекс1, адрес1), (индекс2, адрес2)], т.е. на [0] месте стоит
индекс, на [-1] - адрес

Читаю файлы: (в txt применяю eval, чтобы файл в переменную зашел именно списком кортежей, а не строкой)

text_input = open(input_file_w_address, 'r').read()
text_input = eval(text_input)
csv_input = pd.read_csv(input_csv_file)

затем хочу:

посмотреть в csv_input
взять каждое i-тое значение из столбца
'index'
в списке взять каждый y-тый элемент (это будет каждый кортеж)
в нем посмотреть на y[0]-элемент и сравнить с i
если они равны, взять y[-1] и записать его в новый столбец

csv_input['new_address'] = None
for i in csv_input['index']:
    for i in range(csv_input.shape[0]):
        for y in text_input:
            text_input_index = y[0]
            text_input_address = y[-1]
            if i == text_input_index:
                csv_input['new_address'] = text_input_address

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

все оказалось гораздо проще:

Нам нужно взять список кортежей
Определить индексы и (в моем случае) адреса
Использовать специальную конструкцию pandas: df.loc

<code>
for y in text_input:
    text_input_index = y[0]
    text_input_address = y[-1]
    csv_input.loc[csv_input['index'] == int(text_input_index),
                  'new_address'] = text_input_address
</code>


Обработка JSON в Python
Есть JSON вот такого вида. 15 - ID, он не статичен и всегда изменяется, какой-то определенной закономерности в этом нет. Нужно получить строки user, pass, port, ip и сделать это универсально.
<code>
{
 "status": "yes",
 "user_id": "1",
 "balance": 42.5,
 "currency": "RUB",
 "count": 1,
 "price": 6.3,
 "price_single": 0.9,
 "period": 7,
 "country": "ru",
 "list": {
   "15": {
      "id": "15",
      "ip": "2a00:1838:32:19f:45fb:2640::330",
      "host": "185.22.134.250",
      "port": "7330",
      "user": "5svBNZ",
      "pass": "iagn2d",
      "type": "http",
      "date": "2016-06-19 16:32:39",
      "date_end": "2016-07-12 11:50:41",
      "unixtime": 1466379159,
      "unixtime_end": 1468349441,
      "active": "1"
   }
 }
}
</code>

здесь код будет печатать все id, которые он найдёт
<code>
import json

text = '''{
 "status": "yes",
 "user_id": "1",
 "balance": 42.5,
 "currency": "RUB",
 "count": 1,
 "price": 6.3,
 "price_single": 0.9,
 "period": 7,
 "country": "ru",
 "list": {
   "15": {
      "id": "15",
      "ip": "2a00:1838:32:19f:45fb:2640::330",
      "host": "185.22.134.250",
      "port": "7330",
      "user": "5svBNZ",
      "pass": "iagn2d",
      "type": "http",
      "date": "2016-06-19 16:32:39",
      "date_end": "2016-07-12 11:50:41",
      "unixtime": 1466379159,
      "unixtime_end": 1468349441,
      "active": "1"
   }
 }
}'''

data = json.loads(text)['list']

for ID in data:
    data_id = data[ID]
    my_attrs = [
        data_id.get(attr) for attr in ["user", "pass", "port", "ip"]
    ]

    print(f"{ID=}: {'  '.join(my_attrs)}")
</code>


Python3: Как из функции вывести список?
Я новичок и только разбираюсь, не могу сообразить как сделать вывод списка из функции.
Есть большой вывод json, в котором есть список:

dataorg = {'ДопВидДеят': [
    {'Код': '10.11', 'Текст': 'Переработка и консервирование мяса', 'Дата': '2017-06-29'},
    {'Код': '10.12', 'Текст': 'Производство и консервирование мяса птицы', 'Дата': '2017-06-29'},
    {'Код': '10.13.3', 'Текст': 'Производство мясных (мясосодержащих) консервов', 'Дата': '2017-06-29'}
]}

Мне нужно сделать функцию, вывод из которой будет:

Переработка и консервирование мяса;
Производство и консервирование мяса птицы;
Производство мясных (мясосодержащих) консервов;

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

def okve():
    for i in range (0, len(dataorg)):
        ok = '- ' + dataorg['ДопВидДеят'][i]['Текст'] + ';'
        return(ok)
print(okve())

Но мне возвращается только:

Переработка и консервирование мяса;

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

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

def okve():
    ok = []
    for i in range (0, len(dataorg['ДопВидДеят'])):
        ok.append('- ' + dataorg['ДопВидДеят'][i]['Текст'] + ';')

    return ok

print(okve())

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

def okve():
    for i in range (0, len(dataorg['ДопВидДеят'])):
        ok = '- ' + dataorg['ДопВидДеят'][i]['Текст'] + ';'
        yield ok

print(list(okve()))

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

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

Или так:

print(*okve(), sep='\n')

Вообще, если вам нужно перебрать элементы списка, то
range не нужно:

def okve():
    ok = []
    for item in dataorg['ДопВидДеят']:
        ok.append('- ' + item['Текст'] + ';')

    return ok

def okve():
    for item in dataorg['ДопВидДеят']:
        ok = '- ' + item['Текст'] + ';'
        yield ok


Как записывать изменения списка, с некоторыми особенностями?
Есть список
a = [40, 40, 40, 40, 40, 40] и список
b =[]
Список
a = [40, 40, 40, 40, 40, 40] меняется слева направо, по каждому щелчку мыши.
В список
b =[] требуется записать значения отличные от 40.
Пример:

a = [40, 40, 40, 40, 40, 40]    b =[]
a = [33, 40, 40, 40, 40, 40]    b =[33]
a = [33, 77, 40, 40, 40, 40]    b =[33, 77]
a = [40, 40, 229, 40, 40, 40]   b =[33, 77 ,229]
a = [40, 40, 40, 40, 40, 40]    b =[33, 77 ,229]

То есть, значения не должны пропадать.
Мой код и пояснения. (Необязательно к просмотру)

def getGrid():
    state_left = win32api.GetKeyState(0x01)
    state_right = win32api.GetKeyState(0x02)
    while True:
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:
            state_left = a
            if a == 1 or a == 0 :
                time.sleep(0.3)
                image = ImageGrab.grab()

            for cord in Cords.cordArray:
                r, g, b = image.getpixel(cord)
                currentGrid.append(b)
                print(currentGrid)
                currentGrid.clear()

По каждому щелчку мыши, код берет пиксель с определенной координаты.
Он записывает значение голубого цвета, и добавляет в список
currentGrid, который в примере называется
a. После этого он очищает список, и так по кругу. Значения могут меняться не только слева направо, но в моем случае это будет именно так, по этому можно сказать что они всегда меняются слева направо. Нужен еще один список который будет "запоминать" изменившиеся значение и записывать их.

Вот решение (функция fucn, остальное - тестирование)

import random

def func(a, b):
    a = set(a)
    a.discard(40)
    b += list(a.difference(b))
    return b

a = [40 for i in range(6)]

b = []

for i in a:
    print(f"{a=}, {b=}")
    a.insert(0, random.randint(0, 80))
    a.pop(-1)
    b = func(a, b)

print(f"{a=}, {b=}")

a = [40 for i in range(6)]
b = func(a, b)

print(f"{a=}, {b=}")

пример вывода:

a=[40, 40, 40, 40, 40, 40], b=[]
a=[5, 40, 40, 40, 40, 40], b=[5]
a=[20, 5, 40, 40, 40, 40], b=[5, 20]
a=[49, 20, 5, 40, 40, 40], b=[5, 20, 49]
a=[43, 49, 20, 5, 40, 40], b=[5, 20, 49, 43]
a=[53, 43, 49, 20, 5, 40], b=[5, 20, 49, 43, 53]
a=[70, 53, 43, 49, 20, 5], b=[5, 20, 49, 43, 53, 70]
a=[40, 40, 40, 40, 40, 40], b=[5, 20, 49, 43, 53, 70]

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

def func(a, b):
    a = set(a)
    a.discard(40)
    b += list(a.difference(b))
    return b

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

b = func(a, b)

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

def func(a, b):
    a = set(a)
    a.discard(40)
    b += list(a.difference(b))
    return b

b = []
a = [40, 40, 40, 40, 40, 40]
b = func(a, b)
print(b)  # []

a = [33, 40, 40, 40, 40, 40]
b = func(a, b)
print(b)  # [33]

a = [33, 77, 40, 40, 40, 40]
b = func(a, b)
print(b)  # [33, 77]

a = [40, 40, 229, 40, 40, 40]
b = func(a, b)
print(b)  # [33, 77, 229]

a = [40, 40, 40, 40, 40, 40]
b = func(a, b)
print(b)  # [33, 77, 229]

Поправка 2:
можно сжать функцию ещё больше:

def func(a, b):
    a = set(a) - {40}
    return b + list(a.difference(b))

Поправка 3:

def func(a, b):
    a = set(a) - {40}
    return b + list(a.difference(b))

def getGrid():
    saveGrid = []
    state_left = win32api.GetKeyState(0x01)
    state_right = win32api.GetKeyState(0x02)
    while True:
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:
            state_left = a
            if a == 1 or a == 0 :
                time.sleep(0.3)
                image = ImageGrab.grab()

            for cord in Cords.cordArray:
                r, g, b = image.getpixel(cord)
                currentGrid.append(b)
                saveGrid = func(currentGrid, saveGrid)
                print(currentGrid, saveGrid)
                currentGrid.clear()

Поправка 4:
с повторениями:

def func(a, b):
    a = list(filter((40).__ne__, a))
    return b + a

Поправка 5: (5, карл!!)
с правильными повторениями:

def getGrid():
    saveGrid = []
    state_left = win32api.GetKeyState(0x01)
    state_right = win32api.GetKeyState(0x02)
    while True:
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:
            state_left = a
            if a == 1 or a == 0 :
                time.sleep(0.3)
                image = ImageGrab.grab()

            for cord in Cords.cordArray:
                r, g, b = image.getpixel(cord)
                currentGrid.append(b)
                saveGrid += [b]
                print(currentGrid, saveGrid)
                currentGrid.clear()

Поправка 5.5:

def getGrid():
    state_left = win32api.GetKeyState(0x01)
    state_right = win32api.GetKeyState(0x02)
    while 1:
        saveGrid = []
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:
            state_left = a
            if a == 1 or a == 0 :
                time.sleep(0.3)
                image = ImageGrab.grab()

            for cord in Cords.cordArray:
                r, g, b = image.getpixel(cord)
                currentGrid.append(b)
                saveGrid += [b]
                print(currentGrid, saveGrid)
                currentGrid.clear()

Правка 6: -_-
если кнопка не нажата, не будет проблем

def getGrid():
    state_left = win32api.GetKeyState(0x01)
    state_right = win32api.GetKeyState(0x02)
    while 1:
        saveGrid = []
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:
            state_left = a
            if a == 1 or a == 0 :
                time.sleep(0.3)
                image = ImageGrab.grab()
            else:
                continue

            for cord in Cords.cordArray:
                r, g, b = image.getpixel(cord)
                currentGrid.append(b)
                saveGrid += [b]
                print(currentGrid, saveGrid)
                currentGrid.clear()

Поправка 6.5:

def getGrid():
    state_left = win32api.GetKeyState(0x01)
    state_right = win32api.GetKeyState(0x02)
    while 1:
        saveGrid = []
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:
            state_left = a
            if a == 1 or a == 0:
                time.sleep(0.3)
                image = ImageGrab.grab()

                for cord in Cords.cordArray:
                    r, g, b = image.getpixel(cord)
                    currentGrid.append(b)
                    saveGrid += [b]
                    print(currentGrid, saveGrid)
                    currentGrid.clear()

Поправка 7:

def getGrid():
    currentGrid = []
    state_left = win32api.GetKeyState(0x01)
    state_right = win32api.GetKeyState(0x02)
    while 1:
        saveGrid = []
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:
            state_left = a
            if a == 1 or a == 0:
                time.sleep(0.3)
                image = ImageGrab.grab()

                for cord in Cords.cordArray:
                    r, g, b = image.getpixel(cord)
                    currentGrid.append(b)
                    saveGrid += [b]
                    print(currentGrid, saveGrid)
                    currentGrid.clear()

Поправка 7.5:

def getGrid():
    currentGrid = []
    saveGrid = []
    state_left = win32api.GetKeyState(0x01)
    state_right = win32api.GetKeyState(0x02)
    while 1:
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:
            state_left = a
            if a == 1 or a == 0:
                time.sleep(0.3)
                image = ImageGrab.grab()

                for cord in Cords.cordArray:
                    r, g, b = image.getpixel(cord)
                    currentGrid.append(b)
                    saveGrid += [b]
                    print(currentGrid, saveGrid)
                    currentGrid.clear()

Поправка 8:

def getGrid():
    currentGrid = []
    state_left = win32api.GetKeyState(0x01)
    state_right = win32api.GetKeyState(0x02)
    while 1:
        saveGrid = []
        a = win32api.GetKeyState(0x01)
        b = win32api.GetKeyState(0x02)

        if a != state_left:
            state_left = a
            if a == 1 or a == 0:
                time.sleep(0.3)
                image = ImageGrab.grab()

                for cord in Cords.cordArray:
                    r, g, b = image.getpixel(cord)
                    currentGrid.append(b)
                    if b != 40:
                        saveGrid += [b]
                    print(currentGrid, saveGrid)
                    currentGrid.clear()

Поправка ∞.5:

def getGrid():
    currentGrid = []
    state_left_init = win32api.GetKeyState(0x01)
    while 1:
        saveGrid = []
        state_left = win32api.GetKeyState(0x01)
        if state_left != state_left_init and state_left in {0, 1}:
            time.sleep(0.3)
            image = ImageGrab.grab()
            for cord in Cords.cordArray:
                r, g, b = image.getpixel(cord)
                currentGrid += [b]
                if b != 40:
                    saveGrid += [b]
                print(currentGrid, saveGrid)
                #currentGrid.clear()


Как достать текст из файла
У меня есть файл
txt:

печать( тест )

Как мне в
Python 3 достать
тест?

с помощью регулярных выражений
<code>
import re

with open("file_name", "r", encoding="utf-8") as file:  # заменить file_name на имя файла

    txt = file.read()

    txt = re.sub(r"\s", "", txt)

    out_txt = re.split(r"[()]", txt)

    print(out_txt[1])
</code>


Не работает рекурсия в дебаге возвращает None? [дубликат]

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

Рекурсия не могу понять почему возврат идет None

                                (1 ответ)

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

<code>
def compare_watched_anime(watched_list, random_shonen_anime):
if watched_list[top_shonen_anime[random_shonen_anime]['title']]['watched'] is True:
    random_shonen_anime = randint(0, len(top_shonen_anime) - 1)
    watched_array = list()
    for anime_title in watched_list:
        watched_array.append(watched_list[anime_title]['watched'])
    if False not in watched_array:
        return False
    else:
        compare_watched_anime(watched_list, random_shonen_anime)
else:
    return random_shonen_anime
</code>

Чтобы возвращало, надо возвращать
<code>
else:
    return compare_watched_anime(watched_list, random_shonen_anime)
</code>


Поточное воспроизведение звука с помощью threading
<code>
class Music(Thread):
    def __init__(self,freq,time=500):
        Thread.__init__(self)
        self.freq=freq
        self.time=time
    def run(self):
        if self.freq>=37:
            Beep(self.freq,self.time)
def play(*notes):
    for note in notes:
        Music(notes_dict[note]).start()
play('до6','ре#3','ля5')
</code>
notes_dict это словарь с ключами-названиями нот и соответствующими значениями-частотами:
{'ля−1': 28, 'ля♯−1': 29, 'си−1': 31, 'до0': 33, ...}
и т.д..Я ожидал одновременного воспроизведения нот,но все ноты сыграли последовательно

Beep не умеет смешивать звуки.


Почему не виден массив в методе?
Создал класс, в нем определил массив postsMas и ниже создал метод save(). Дальше в этом методе я хотел обратится к массиву но по какой-то неизвестной для меня причине в методе save() не виден массив postsMas. Хотя определяю массив выше метода. Объясните пожалуйста почему?
Вот код:
<code>
class Post():
title = '1'
pubDate = '2'
time = '3'

postsMas = [
    [self.title, self.pubDate, self.time]
]

SAVES_FILE = 'saves.dat'

def save(self):
    SAVES_FILE = 'saves.dat'
    with open(SAVES_FILE, 'ab') as file:
        pickle.dump(postsMas, file)
</code>

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

class Post():
    title = '1'
    pubDate = '2'
    time = '3'

    postsMas = [
        [title, pubDate, time]                                                # - self
    ]

    SAVES_FILE = 'saves.dat'

    def save(self):
#        SAVES_FILE = 'saves.dat'
        print(f'SAVES_FILE = {self.SAVES_FILE}, postsMas = {self.postsMas}')

        with open(self.SAVES_FILE, 'ab') as file:                              # + self.
            pickle.dump(self.postsMas, file)                                   # + self.

post = Post()
post.save()

или так:

class Post():
    def __init__(self):
        super().__init__()

        self.title = '1'
        self.pubDate = '2'
        self.time = '3'

        self.postsMas = [
            [self.title, self.pubDate, self.time]
        ]

        self.SAVES_FILE = 'saves.dat'

    def save(self):
#        SAVES_FILE = 'saves.dat'
        print(f'SAVES_FILE = {self.SAVES_FILE}, postsMas = {self.postsMas}')

        with open(self.SAVES_FILE, 'ab') as file:
            pickle.dump(self.postsMas, file)

post = Post()
post.save()


Не могу добавить другие команды в бота python
При попытке добавить любую команду кроме старта, бот начинает отвечать на все что можно этой же командой.
<code>
@bot.message_handler(commands=['start'])
def start_message(message):
    keyboard = telebot.types.ReplyKeyboardMarkup(True)
    keyboard.row('Portal', 'Инфо')
    bot.send_message(message.chat.id, 'Вы активировали бота', reply_markup=keyboard)
@bot.message_handler(content_types=['text'])

@bot.message_handler(commands=['getme'])
def getme_message(message):
    keyboard = telebot.types.ReplyKeyboardMarkup(True)
    keyboard.row('Portal', 'Инфо')
    bot.send_message(message.chat.id, 'лол', reply_markup=keyboard)
@bot.message_handler(content_types=['text'])
</code>

У тебя лишние два декоратора
@bot.message_handler(content_types=['text'])
То есть у тебя функция
def getme_message(message):Вызывается когда приходит любой текст, тебе нужно вообще убрать их, что бы стало так

@bot.message_handler(commands=['start'])
def start_message(message):
    keyboard = telebot.types.ReplyKeyboardMarkup(True)
    keyboard.row('Portal', 'Инфо')
    bot.send_message(message.chat.id, 'Вы активировали бота', reply_markup=keyboard)

@bot.message_handler(commands=['getme'])
def getme_message(message):
    keyboard = telebot.types.ReplyKeyboardMarkup(True)
    keyboard.row('Portal', 'Инфо')
    bot.send_message(message.chat.id, 'лол', reply_markup=keyboard)


Не могу запустить телеграм бота
Сделал очень простого бота, вот код:

import telebot
import configure

client = telebot.TeleBot(configure.config['token'])

@client.message_handler(content_types = ['text'])
def get_text(message):
    if message.text.lower() == 'привет':
        client.send_message(message.chat.id, 'Привет, юзер)')
    else:
        client.send_message(message.chat.id, message.text)

client.polling(none_stop = True)

В файле configure токен, вот ошибка:

2020-06-17 14:57:07,694 (util.py:68 PollingThread) ERROR - TeleBot: "ConnectionError occurred, args=(MaxRetryError("HTTPSConnectionPool(host='api.telegram.org', port=443):
Max retries exceeded with url: /bot1279222057:AAHxnx3M5eZHyfnk1lsJnXq9EowPMtL0Izk/getUpdates?offset=1&timeout=20 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x03D35940>: Failed to establish a new connection: [WinError 10051] Сделана попытка выполнить операцию на сокете при отключенной сети'))"),)
Traceback (most recent call last):
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connection.py", line 140, in _new_conn
    conn = connection.create_connection(
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\util\connection.py", line 83, in create_connection
    raise err
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\util\connection.py", line 73, in create_connection
    sock.connect(sa)
OSError: [WinError 10051] Сделана попытка выполнить операцию на сокете при отключенной сети

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connectionpool.py", line 598, in urlopen
    httplib_response = self._make_request(conn, method, url,
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connectionpool.py", line 346, in _make_request
    self._validate_conn(conn)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connectionpool.py", line 850, in _validate_conn
    conn.connect()
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connection.py", line 284, in connect
    conn = self._new_conn()
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connection.py", line 149, in _new_conn
    raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.VerifiedHTTPSConnection object at 0x03D35940>: Failed to establish a new connection: [WinError 10051] Сделана попытка выполнить операцию на сокете при отключенной сети

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\requests\adapters.py", line 430, in send
    resp = conn.urlopen(
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connectionpool.py", line 638, in urlopen
    retries = retries.increment(method, url, error=e, _pool=self,
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\util\retry.py", line 388, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded with url: /bot1279222057:AAHxnx3M5eZHyfnk1lsJnXq9EowPMtL0Izk/getUpdates?offset=1&timeout=20 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x03D35940>: Failed to establish a new connection: [WinError 10051] Сделана попытка выполнить операцию на сокете при отключенной сети'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\util.py", line 62, in run
    task(*args, **kwargs)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\__init__.py", line 281, in __retrieve_updates
    updates = self.get_updates(offset=(self.last_update_id + 1), timeout=timeout)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\__init__.py", line 251, in get_updates
    json_updates = apihelper.get_updates(self.token, offset, limit, timeout, allowed_updates)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\apihelper.py", line 199, in get_updates
    return _make_request(token, method_url, params=payload)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\apihelper.py", line 62, in _make_request
    result = _get_req_session().request(method, request_url, params=params, files=files,
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\requests\sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\requests\sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\requests\adapters.py", line 508, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded with url: /bot1279222057:AAHxnx3M5eZHyfnk1lsJnXq9EowPMtL0Izk/getUpdates?offset=1&timeout=20 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x03D35940>: Failed to establish a new connection: [WinError 10051] Сделана попытка выполнить операцию на сокете при отключенной сети'))
"
Traceback (most recent call last):
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connection.py", line 140, in _new_conn
    conn = connection.create_connection(
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\util\connection.py", line 83, in create_connection
    raise err
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\util\connection.py", line 73, in create_connection
    sock.connect(sa)
OSError: [WinError 10051] Сделана попытка выполнить операцию на сокете при отключенной сети

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connectionpool.py", line 598, in urlopen
    httplib_response = self._make_request(conn, method, url,
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connectionpool.py", line 346, in _make_request
    self._validate_conn(conn)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connectionpool.py", line 850, in _validate_conn
    conn.connect()
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connection.py", line 284, in connect
    conn = self._new_conn()
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connection.py", line 149, in _new_conn
    raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.VerifiedHTTPSConnection object at 0x03D35940>: Failed to establish a new connection: [WinError 10051] Сделана попытка выполнить операцию на сокете при отключенной сети

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\requests\adapters.py", line 430, in send
    resp = conn.urlopen(
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\connectionpool.py", line 638, in urlopen
    retries = retries.increment(method, url, error=e, _pool=self,
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\urllib3\util\retry.py", line 388, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded with url: /bot1279222057:AAHxnx3M5eZHyfnk1lsJnXq9EowPMtL0Izk/getUpdates?offset=1&timeout=20 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x03D35940>: Failed to establish a new connection: [WinError 10051] Сделана попытка выполнить операцию на сокете при отключенной сети'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "d:/MISHA/Programming/Python/MYPROJECTS/bot/bot.py", line 13, in <module>
    client.polling(none_stop = True)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\__init__.py", line 415, in polling
    self.__threaded_polling(none_stop, interval, timeout)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\__init__.py", line 438, in __threaded_polling
    polling_thread.raise_exceptions()
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\util.py", line 81, in raise_exceptions
    six.reraise(self.exc_info[0], self.exc_info[1], self.exc_info[2])
  File "C:\Users\MIKHANGO\AppData\Roaming\Python\Python38\site-packages\six.py", line 703, in reraise
    raise value
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\util.py", line 62, in run
    task(*args, **kwargs)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\__init__.py", line 281, in __retrieve_updates
    updates = self.get_updates(offset=(self.last_update_id + 1), timeout=timeout)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\__init__.py", line 251, in get_updates
    json_updates = apihelper.get_updates(self.token, offset, limit, timeout, allowed_updates)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\apihelper.py", line 199, in get_updates
    return _make_request(token, method_url, params=payload)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\apihelper.py", line 62, in _make_request
    result = _get_req_session().request(method, request_url, params=params, files=files,
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\requests\sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\requests\sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "C:\Users\MIKHANGO\AppData\Local\Programs\Python\Python38-32\lib\site-packages\requests\adapters.py", line 508, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded with url: /bot1279222057:AAHxnx3M5eZHyfnk1lsJnXq9EowPMtL0Izk/getUpdates?offset=1&timeout=20 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x03D35940>: Failed to establish a new connection: [WinError 10051] Сделана попытка выполнить операцию на сокете при отключенной сети'))

Что делать?

Используйте
<code>
apihelper.proxy = {'https': 'socks5://userproxy:password@proxy_address:port'}
</code>


Есть ли функция, возвращающая дробную часть после деления двух вещественных чисел
Например 6/5 = 1,2.  Мне нужно получить именно 0,2.
Я конечно написал нужную функцию:
<code>
def rest(a, b):
    if a < b:
        return a/b
    if a == b:
        return 0.0
    else:   # a>b
        return  a/b - int(a/b)
</code>
но может есть такая функция где-то, скажем, в numpy?

import math

frac, whole = math.modf(1.2)
print(frac)
print(whole)

Другой способ:

frac = 1.2 % 1
print(frac)


работа с pyttsx3

import pyttsx3
engine = pyttsx3.int()
engine.say("Hello world")
engine.runAndWait()

pywin32 и pypiwin32  установлены

ВЫДАЁТ ТАКУЮ ОШИБКУ

engine = pyttsx3.int()
AttributeError: module 'pyttsx3' has no attribute 'int'

import pyttsx3
engine = pyttsx3.init()
engine.say("Hello world")
engine.runAndWait()