передача строки в split() с экранированием её части
Есть необходимость работать именно с питоном 3.5, посему форматирую строку с параметрами и дальше мне нужно её разбить на части
<code>
name1 = Alex
name2 = Jhon
string = "First user name is {} and second user name is {}".format(name1, name2)
string.split()
</code>
всё хорошо пока name1 и name2 состоят из одного слова, когда это не так эти слова тоже разбиваются, а мне нужно их экранировать от этого. Разделитель именно пробел, т.е. string.split() остаётся как был.
В итоге если name1 = Alex Smith, то он и должен как 1 объект оставаться после сплита:
... 'name' 'is' 'Alex Smith' ...

Я бы предложил использовать временный разделитель:

name1 = 'Alex Black'
name2 = 'Jhon'
tempDelimiter = '#56'

string = "First user name is {} and second user name is {}"
string = string.replace(' ', tempDelimiter).format(name1, name2)

result = string.split(tempDelimiter)
print(result)

['First', 'user', 'name', 'is', 'Alex Black', 'and', 'second', 'user', 'name', 'is', 'Jhon']

tempDelimiter можно и другой записать, в зависимости от содержимого строки.
Думаю, этот способ проще, чем вставка в итоговый список.


Что делаю не так ? Нужно удалить в списке словарей пустые значение и null
есть код который должен удалить пустые значение, но на выходе он выдает:

TypeError: 'NoneType' object is not subscriptable
Как можно это обойти или как сделать правильно ?
Сам код:

awe = ['null', '']
result = []
for res in list_1:
    if res['Client'] not in awe:
        result.append(res)
print(result)

входные данные:

    [
       {
          "Client": [],
          "description": ""
       },
       {
          "Client": [],
          "description": ""
       },
       null,
       {
          "Client": [],
          "description": ""
       },
       {
          "Client": [
             "Dima"
          ],
          "description": "UX"
       },
       null,
       {
          "Client": [
             "Andrey"
          ],
          "description": It "
       }]

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

Однострочник для разнообразия, в дополнение к ответу Сергея:
<code>
result = [res for res in filter(None, list_1) if res['Client']]
print(result)
</code>


Разбивка номерных емкостей мобильной нумерации на диапазоны
Есть две границы номерной ёмкости, например:
ОТ: 7902125000 -  ДО : 7902129999
И необходимо вытащить диапазоны в формате:
7902125*
7902126*
7902127*
7902128*
7902129*
(и отдельные номера, если по ним нельзя выстроить диапазон номеров)
Есть сложности в том, что границы могут быть примерно такими:
ОТ: 7902125009 -  ДО : 7902125023 из которого можно выделить только один диапазон  790212501* и отдельные номера: 7902125009, 7902125020 , 7902125021 , 7902125022, 7902125023
Как это можно на питоне реализовать?

def ranges( first:str, last:str ):
    assert( len(first) == len(last) )
    assert( int(first) <= int(last) )

    if first == last:
        return [first]
    if first == "0" * len(first) and last== "9"* len(last):
        return ["*"]
    if first[0] == last[0]:
        return [ first[0]+v  for v in ranges( first[1:], last[1:] ) ]

    assert( int(first[0]) < int(last[0]) )
    return ranges( first, first[0] + "9"*(len(first)-1) ) \
        + ranges( str(int(first[0])+1) + "0"*(len(first)-1), last  )

если начало диапазона совпадает с концом - то решение единственное (без маски).
если начало диапазона состоит из одних нулей, а конец из девяток - то решение "*"
если первая цифра начала, совпадает с первой цифрой конца, то отбросим первую цифру, и решим задачу для урезанный диапазонов. (Потом припишем первую цифру к результату.)
если первая цифра начала, меньше чем первая цифра конца - разделим задачу на две, введя промежуточную точку: первая цифра диапазона + нужное количество девяток. (Следующее число за промежуточной точкой + первая цифра +1, и нули.)

test:

assert ranges( "7351900000" , "7902125023" ) == ['73519*', '7352*', '7353*', '7354*', '7355*', '7356*', '7357*', '7358*', '7359*', '736*', '737*', '738*', '739*', '74*', '75*', '76*', '77*', '78*', '7900*', '7901*', '79020*', '790210*', '790211*', '7902120*', '7902121*', '7902122*', '7902123*', '7902124*', '790212500*', '790212501*', '7902125020', '7902125021', '7902125022', '7902125023']
assert ranges( "7902125000" , "7902129999" ) == ['7902125*', '7902126*', '7902127*', '7902128*', '7902129*']


Пишет "python не отвечает" при работе приложения PyQt5
уважаемые коллеги! Я решила сама попробовать написать приложение для скачивания видео с YouTube. Работаю через Qt Designer. Но вот проблема, при скачивании большого видео(от 45 минут) вылетает "python не отвечает" и не дает дальше работать с приложением. Это исчезает когда видео полностью скачается, но я хотела бы еще писать прогресс, на сколько скачалось видео. Помогите пожалуйста! Код ниже
<code>
import sys
import pytube
import asyncio
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QMainWindow

class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi('Da.ui', self)
        self.showFullScreen()        # Загружаем дизайн
        # self.label_5.hide()
        self.label_6.hide()
        self.label_3.hide()
        self.label_4.hide()
        self.toolButton.clicked.connect(self.run)

    def run(self):
        # self.threadclass.start()
        c = [str(i) for i in range(1, 101)]
        # dd(self.lineEdit, self.lineEdit_2)
        self.label_5.hide()
        self.label_6.hide()
        self.label_3.hide()
        self.label_4.hide()
        url = self.lineEdit.text()
        b = self.lineEdit_2.text()
        youtube = pytube.YouTube(url)
        video = youtube.streams.get_highest_resolution()
        video.download(b)
        #тут хотела писать прогресс, но наткнулась на ошибку

def except_hook(cls, exception, traceback):
    sys.__excepthook__(cls, exception, traceback)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = MyWidget()
    form.show()
    sys.excepthook = except_hook
    sys.exit(app.exec())
</code>

потому что надо делать в потоке, только обычные python потоки не подойдут для PyQt приложения. Нужно научиться использовать QThread
А так, когда ты вызываешь долгоиграющую функцию, то прерываешь событийный цикл PyQt и ОС думает что приложение зависло.


Удаление части списка
Я хочу удалить участок списка,а точнее все элементы с начала списка, пока я не наткнусь на присутствие '' в обьекте списка, но у меня не выходит:

j=['123','321','hhh','awdawdawd
','s','ggg']
for i in range(len(j)-1):
    if '
' in j[i]:
        j.pop(i)
        break
    j.pop(i)
print(j)

Можно еще так сделать

for i in range(len(j)):
    if '
' in j[i]:
        j = j[i+1:]
        break

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


Удаление элементов в списке словарей
Всем привет, подскажите как можно удалить пару значений в списке словарей? Знаю про метод del dict_name[key] но он удаляет ключи со значением. Есть ли аналог чтобы удалить значение?
Есть одно решение, поменять местами ключи со значениями и удалить их но думаю это не правильно.

list_1 = [{'Name': 280, 'less': 'PIP'},
 {'Name': 6, 'less': 'Ticket in process'},
 {'Name': 7, 'dess': 'Defected'},
 {'Name': 8, 'dess': 'Need confirmation'},
 {'Name': 9, 'dess': 'Need remove'}]

Удаляем например ключ со значением 6 и 8 (может быть и больше) ....

result = [{'Name': 280, 'less': 'PIP'},
     {'Name': 7, 'dess': 'Defected'},
     {'Name': 9, 'dess': 'Need remove'}]

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

Используем цикл
for:

exc = [6, 8] # те, что вам не нужны
res = []
for el in list_1:
    if el['Name'] not in exc:
        res.append(el)

Используем функцию
filter:

exc = [6, 8]
res = list(filter(lambda x: x['Name'] not in exc, list_1))

Используем генератор списка:

exc = [6, 8]
res = [x for x in list_1 if x['Name'] not in exc]


Получить список элементов одного столбца фрейма фрейма
Есть фрейм, вытащен из postgresql через pandas

pas_id
status_id

1
0

1
1

1
2

2
7

2
1

3
0

3
4

3
2

3
1

Как из столбца status_id сформировать список, который при этом будет соответствовать группировке по столбцу pas_id?
Должно получиться следующее:
для
pas_id(1) = (0,1,2)
для
pas_id(2) = (7,1)
для
pas_id(3) = (0,4,2,1)
ИТОГО:
list = [(0,1,2),(7,1),(0,4,2,1)]

Прямо вот "в лоб" решается: группируем, аггрегируем в кортежи, переводим столбец в список:
<code>
df.groupby('pas_id').agg(tuple)['status_id'].to_list()
# [('0', '1', '2'), ('7', '1'), ('0', '4', '2', '1')]
</code>


Не корректно работает Шифр с использованием букв
Делаю шифр с помощью букв из строчки ввода. Для текста, который состоит из одного слова шифрует верно, но если их несколько или встречаются большие буквы - начинаются не точности. Как возможно исправить?!
<code>
if len(sys.argv) != 2:
    sys.exit("Ошибка")

key = (sys.argv[1])
for k in key:
    if not k.isalpha():
        sys.exit("Ошибка")

index = 0
chiper = ""
text = input ("Исходный: ")
for c in text:
    if c in string.ascii_lowercase and string.ascii_uppercase:
        offset = ord(key[index]) - ord('a')

        encrypted_c = chr((ord(c) - ord('a') + offset) %26 + ord('a'))
        chiper = chiper + encrypted_c

        index = (index + 1) % len(key)

    else:
        chiper = chiper + c

print ("Шифр: " + chiper)
</code>

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

for c in text:
    if c not in (string.ascii_lowercase+string.ascii_uppercase):
        chiper +=  c
        continue

    if key[index].islower():
        offset = ord(key[index]) - ord('a')
    else:
        offset = ord(key[index]) - ord('A')

    if c.islower():
        encrypted_c = chr((ord(c) - ord('a') + offset) %26 + ord('a'))
    else:
        encrypted_c = chr((ord(c) - ord('A') + offset) %26 + ord('A'))

    chiper += encrypted_c
    index = (index + 1) % len(key)

И можно немного сократить код вот так:

for c in text:
    if c not in (string.ascii_lowercase+string.ascii_uppercase):
        chiper +=  c
        continue

    offset = ord(key[index]) - (ord('a') if key[index].islower() else ord('A'))
    _ord = ord('a') if c.islower() else ord('A')

    encrypted_c = chr((ord(c) - _ord + offset) %26 + _ord)
    chiper += encrypted_c
    index = (index + 1) % len(key)

Что позволит нам избавиться от
continue без явной вложенности
if:

for c in text:
    if c in (string.ascii_lowercase+string.ascii_uppercase):
        offset = ord(key[index]) - (ord('a') if key[index].islower() else ord('A'))
        _ord = ord('a') if c.islower() else ord('A')

        encrypted_c = chr((ord(c) - _ord + offset) %26 + _ord)
        chiper += encrypted_c
        index = (index + 1) % len(key)
    else:
        chiper += c


Отправление сообщения пользователю при изменении на сайте
Я делаю бота через telebot, который отправляет свежие новости человеку. Я уже сделал парсер который полностью вытаскивает новости из сайта, но проблема в том, что я не знаю как сделать так, чтобы бот при добавлении новости на сайт, сразу же отправлял сообщение пользователю с этой новостью. Я подумал сразу же о цикле while с задержкой time, но это сильно будет нагружать сервер, как я думаю, и это не очень практично.

Возможно, у вашего сайта с новостями есть система уведомлений или RSS лента. А может и вообще API имеется. Можно брать оттуда сообщения о публикации новой статьи.
Извиняюсь за ответ. Мне не хватает репутации для возможности комментирования.


Почему Питон возвращает разный список [дубликат]

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

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

                                (2 ответа)

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

Имеется такой кусок кода из программы - Список филиалов в виде списка словарей, и функция которая находит русское название для вывода его в шаблон. Периодически выводится значение на английском.
Пробовал return list(i.get('fil').values()) да он действительно список выводит по разному (не всегда). Почему так. Что это и как бороться с этим?. Python 3.5.3. На более позднем Питоне все нормально. Но обновить Питон пока боязно.

    list_fils = [{'fil': {'value': 'Москва', 'name': 'moscow'}},
       {'fil': {'value': 'Волгоград', 'name': 'volgograd'}},
       {'fil': {'value': 'Липецк', 'name': 'lipetsk'}},
       {'fil': {'value': 'Курск', 'name': 'kursk'}}]

    def name_fil_rus(name_fil):
        for i in list_fils:
            if name_fil in i.get('fil').values():
                return list(i.get('fil').values())[0]

    print(name_fil_rus('kursk'))

    Вывод когда return list(i.get('fil').values())
    python3.5 123.py
    ['kursk', 'Курск']
    python3.5 123.py
    ['kursk', 'Курск']
    python3.5 123.py
    ['Курск', 'kursk']
    python3.5 123.py
    ['kursk', 'Курск']
    python3.5 123.py
    ['Курск', 'kursk']

Я бы в вашем случае просто сделал нормальные словари для перевода и брал значения уже оттуда, если поля словаря у вас жёстко заданы и заранее известно где что (если в
name всегда английское название, а в
value русское):

list_fils = [{'fil': {'value': 'Москва', 'name': 'moscow'}},
   {'fil': {'value': 'Волгоград', 'name': 'volgograd'}},
   {'fil': {'value': 'Липецк', 'name': 'lipetsk'}},
   {'fil': {'value': 'Курск', 'name': 'kursk'}}]

eng_rus = {y['name']:y['value'] for x in list_fils for y in x.values()}
rus_eng = {y['value']:y['name'] for x in list_fils for y in x.values()}

print(eng_rus.get('kursk'))

Вывод:

Курск

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


Как сделать чтобы файл проверил своё название [закрыт]

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

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

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

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

У меня есть файл main.py
Однако если его переименовать то файл потеряет большинство функций.

Если вы запускаете файл как
py - достаточно переменной
__file__.
Если вы собираетесь упаковывать свой
py в
exe - посмотрите в строну
sys.argv[0].


Объединение список словарей без потери данных
Подскажите пожалуйста, как можно правильно и оптимально соединить 3 списка словарей в один? У всех ключи одинаковые, а вот начинка разная.
Пример данных:

list_1 = [{'Client': [345, 12612],
  'description': '19T',
  'user': 'test1'},
  {'Client': [158, 126],
  'description': '45T',
  'user': 'test1'}]
list_2 = [{'Client': [15128, 13126],
  'description': '9T',
  'user': 'test 2'},
  {'Client': [158, 126],
  'description': '11T',
  'user': 'test2'}]
list_3 = [{'Client': [123, 41],
  'description': '5T',
  'user': 'test3'},
  {'Client': [158, 126],
  'description': ' 14T',
  'user': 'test3'}]

И в итоге должно получиться так:

list_new = [{'Client': [345, 12612],
      'description': '19T',
      'user': 'test1'},
      {'Client': [158, 126],
      'description': '45T',
      'user': 'test1'},
     {'Client': [15128, 13126],
      'description': '9T',
      'user': 'test 2'},
      {'Client': [158, 126],
      'description': '11T',
      'user': 'test2'},
      {'Client': [123, 41],
      'description': '5T',
      'user': 'test3'},
      {'Client': [158, 126],
      'description': ' 14T',
      'user': 'test3'}]

Ваша задача решается одной строкой

list_new = list_1+list_2+list_3


Как повернуть только часть списка, python
Подскажите, пожалуйста, как повернуть только часть списка? Имеется ли какой-то быстрый способ?

list[::-1] поворачивает весь список.
Мне нужно что бы из
[1, 2, 3, 4, 5, 6] , получилось
[4, 3, 2, 1, 5, 6]

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

lst = lst[3::-1]+lst[4:]

Либо если список большой и переворачивать нужно только небольшой его кусок прямо "по месту", то срезом же присваиваете перевёрнутую часть обратно:

lst[:4] = lst[3::-1]

Нумерация в срезах в случае
step=-1 у списков какая-то заумная, обратная, не слишком интуитивная.


Выбор варианта из перечня возможных ответов в Python, как использовать if и elif
Изучаю азы Python, пытаюсь написать простенький текстовый квест. Намертво застрял в следующем моменте: допустим, есть реплика персонажа и тебе нужно выбрать один из нескольких вариантов ответа. В зависимости от твоего выбора, персонаж выдаст тебе следующую реплику.
Пример:
"Вася, как твои дела"?
Варианты:
a) Нормально
б) Хорошо
в) Плохо
Выбрали ответ "Нормально", нажав на кнопку 'a' - будет ответ "ну понятно"
Выбрали "Хорошо", нажав на 'b' - будет ответ "ну и замечательно"
Ну и далее по той же логике.
Я понимаю, что это реализуется через операторы выбора, но у меня не выходит.
Кусок из кода:
<code>
print('Вася, как твои дела?')
print('a)Нормально')
print('b)Хорошо')

input()

a = 'normalno'
b = 'horosho'

if a == 'normalno':
    print('Ну понятно')
elif b == 'horosho':
    print('Ну и замечательно')
</code>
Пробовал после if поставить else, но это прокатит только в том случае, если есть не больше одного альтернативного варианта.
Первое условие у меня выполняется корректно, второе - никак.

Насколько я понял следующий код должен Вам помочь:
<code>
print('Вася, как твои дела?')
print('a)Нормально')
print('b)Хорошо')

response = input('Введи ответ: ')

if response == 'Нормально':
    print('Ну понятно')
elif response == 'Хорошо':
    print('Ну и замечательно')
else:
    print('плохо')
</code>


Изменения значений в столбце датафрейма в соответствии с условием
Функция изменяет весь столбец датафрейма на одно и то же значение, игнорируя, что условия по строкам - разные. Или дает ошибку, если через
.apply
Дайте, пожалуйста, совет на тему как правильно применить функцию через apply() в моей задаче, чтобы получить корректный результат.
Имеются 2 датафрейма Pandas с 'a','b','c' колонками. Я хочу изменить некоторые значения в 'c'-колонке для второго датафрейма df_2. Причем, нужно изменить данные в df_2 для 'c'-колонки только в тех строках, где 'a' равно 1. Значение 0 в ячейках этих строк в 'c'-колонках должны измениться на медиану, посчитанную от значений в 'c'-колонке первого датафрейма по строкам, где 'a' равно 1. Я написал функцию, которая делает это. Она применяется к df_2 и использует df_1.
Проблема в следующем:

Если применить функцию вот так: 'df_2['c'] = set_c(df_1, df_2)', то все 'c'-значения df_2 получают новую цену, и неважно, в данной строке 'a' == 1 или нет. Это неправильно.

Если применить функцию так: 'df_2['c'] = df_2.apply(set_c(df_2, df_1))', возникает ошибка без дополнительных комментариев: 'AssertionError:'.

Код такой:

import pandas as pd

df_1 = pd.DataFrame({'a': [1,2,1], 'b': [4,5,6], 'c': [7,100,9]}) # From C
df_2 = pd.DataFrame({'a': [1,2,3], 'b': [4,50,6], 'c': [0,0,0]}) # To C

display('df_1', df_1)
display('df_2', df_2)

def set_c(df1, df2):

    mask = ( df1.loc[:, 'a'] == df2.loc[0, 'a'] )
    final_c = df1[mask]['c'].median()

    display("df2.loc[0, 'a']", df2.loc[0, 'a'])
    display('df1[mask]', df1[mask])
    print('final_c median', final_c)

    return final_c

df_2['c'] = set_c(df_1, df_2)

display(df_2)

В коде df_2 и df_1 - это глобальные датафреймы вне функции, а df2 and df1 - датафреймы внутри функции, передаваемые как параметры.
Моя функция показывает весь процесс расчетов. Для варианта 1 получается следующее:

'df_1'
    a   b   c
0   1   4   7
1   2   5   100
2   1   6   9

'df_2'
    a   b   c
0   1   4   0
1   2   50  0
2   3   6   0

"df2.loc[0, 'a']" # 'a'=1 - основа маски для 0 строки
1

'df1[mask]' # Строки df_1 с 'a'=1 найдены!
    a   b   c
0   1   4   7
2   1   6   9

final_c median 8.0 # Медиана по 'c' для df1 между 7 и 9 = 8

'df_2 result'
    a   b   c
0   1   4   8.0
1   2   50  8.0
2   3   6   8.0

Могли бы вы показать мне, как правильно применить функцию через apply(), чтобы осуществились построчные расчеты и результирующий df_2 обрел бы такой вид, в котором новая ячейка колонки 'c' = 8.0 была бы только в строке [0], так как только в строке [0] в df_2 есть 'a'=1, чтобы в строке [1] возникло 100 ('a'=2 есть в df_1, единственное число по 'c' = 100), и чтобы в строке [2] остался 0, так как 'a'=3 есть в df_2, но нет в df_1, поэтому медиану не считаем:

'df_2 result'
    a   b   c
0   1   4   8.0
1   2   50  100.0
2   3   6   0

Большое спасибо!

я бы сделал так:
сначала получаем соответствия между колонками
a в обоих фреймах:

mapper = df_1.loc[df_2["a"].isin(df_1["a"])]["c"]

затем делаем замену во втором фрейме

df_2["c"] = df_2.apply(lambda x: mapper.loc[x.name]
                       if x.name in mapper.index else x["c"], axis=1)

а потом присваиваем вашу медиану по заданному условию:

df_2.loc[df_2["a"]==1, "c"] = df_1.loc[df_1["a"]==1, "c"].median()

получаем df_2:

   a   b    c
0  1   4    8
1  2  50  100
2  3   6    0


Запуск несколько ассинхронных функций вместе на python
День добрый! Задача состоит в том, чтобы запустить несколько асинхронных функции разом.
Сейчас у меня только две функции: первая открывает сокет и непрерывно получает данные из этого соединения; вторая периодически делает запросы к другому серверу и отправляет в тг канал ответ на сделанный запрос и данные, которые мы получали в первой функции.
Проблема в том, что, возможно, нужно будет открывать еще сокеты и писать функции подобные второй. Можно ли выполнять асинхронные функции пареллельно? Пробовал совместить asyncio c multiprocessing и threading. Путного ничего не вышло у меня.
Вот что сейчас написал
<code>
import asyncio, json, time, aiohttp, websockets

async def func2(data):
    async with aiohttp.ClientSession() as session:
        async with session.post(url='...', json=data) as response:
            response = await response.json()
            # Обрабатываю response

async def func1():
    url = f'...'
    start_time = time.time()
    async with websockets.connect(url) as client:
        while True:
            data = json.loads(await client.recv())
            # Обрабатываю data
            if time.time() - start_time > 5*60:
                await gen_tasks()
                start_time = time.time()

async def gen_tasks():
    tasks = []
    for i in ...:
        data = {...}
        tasks.append(asyncio.create_task(func2(data)))
    for task in tasks:
        await task

asyncio.run(func1())
</code>

Содержимое gen_tasks обернул в цикл while и в конец цикла довавил
await asyncio.sleep(300)
В конец добавил функцию, создающую задачи

async def main():
    t1 = asyncio.create_task(func1())
    t2 = asyncio.create_task(gen_tasks())
    await t1
    await t2

asyncio.run(main())


python сортировка массивов
Есть массив member_role где указана роль и ID пользователя

member_role = {'@everyone': [269564120792039424, 472679205885313044, 766316425890889758, 987004547438366761], 'Кактус': [766316425890889758], 'Котя 3': [472679205885313044], 'Лисёнок': [269564120792039424], 'Лис': [987004547438366761], 'Микель': [269564120792039424]}

Есть второй массив data с ID пользователя и количеством опыта у этого пользователя

data = [(987004547438366761, 8.9), (269564120792039424, 500.5), (766316425890889758, 112.2), (472679205885313044, 4.5)]

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

Третий массив = {["<Название роли 1>": "Количество опыта у всех её участников"], ["<Название роли 2>": "Количество опыта у всех её участников"], ["<Название роли 3>": "Количество опыта у всех её участников"]}

Если кто-то напишет код на языке python с объяснением буду очень признателен.

Простой алгоритм решения вашей задачи:

Преобразуем
data в словарь вида
id: point:

data_dict = dict(data)

Бежим по ролям
member_role:

for role in member_role

Обнуляем сумму очков.

_sum = 0

Суммируем очки
id, находящихся в этом списке:

for user_id in member_role[role]:
    _sum += data_dict[user_id]

Записываем значение:

res[role] = _sum


Почему бот отправляет сообщение, хотя по условия не должен этого происходить Discord.py?
<code>
@tasks.loop(hours = 18.0 )
async def sob():
    c = today.weekday() # Проверяет день недели(изменить weekday) и написать такие же функции
    if c == 5 or 6 :
            channel = await bot.fetch_channel(926201516963029014)
            await channel.send('Сегодня будет собрание')
    else :
        pass
</code>
В теории бот должен сначала поверить день недели и только потом скидывать сообщение, но он скидывает его сразу же, хотя по дате не подходит(сегодня понедельник следовательно с = 0)

У Вас неверно реализована проверка дня недели: для проверки нескольких условий через ИЛИ нужно оформлять код следующим образом:
if cond1 or cond2, где
condN — условие. Я предполагаю, что Вы хотели проверить равенство переменной
c с
5 или
6, однако Ваша формула будет трактована так:

if (c == 5) or (6)

т.е.
если c == 5 или 6. При передаче любого численного ненулевого литерала подразумевается
True, так что имеем в итоге

if c == 5 or True

а это всегда равно
True, невзирая на
c.
Стоит переписать данное условие таким образом:

@tasks.loop(hours = 18.0 )
async def sob():
    c = today.weekday() # Проверяет день недели(изменить weekday) и написать такие же функции
    if c == 5 or c == 6: # 6 меняем на c == 6
            channel = await bot.fetch_channel(926201516963029014)
            await channel.send('Сегодня будет собрание')
    else :
        pass

Теперь код действительно проверяет равенство переменной с 5 или 6 (скорее всего, субботой и воскресеньем?), и код будет работать только в эти дни, а не всегда.
P.S. Если хочется побаловаться, то можно использовать условие типа
if c in [5, 6] :)


Помогите немного со словарями в python
Пользователь вводит число K - количество фруктов. Затем он вводит K
фруктов в формате: название фрукта и его количество. Добавьте все фрукты в
словарь, где название фрукта - это ключ, а количество - значение. Вывести
фрукты количество которых максимальное, если таких фруктов несколько
вывести все их.

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

listFruit = {}
    amount = int(input("amount of fruit: "))
    for i in range(amount):
        name = input("Name fruit: ")
        amountFruit = int(input("Amount: "))
        listFruit[name] = amountFruit

    max_value = max(listFruit.values())
    for name, am in listFruit.items():
        if am == max_value:
            print(name)

Результат:

amount of fruit: 3
Name fruit: Orange
Amount: 3
Name fruit: Apple
Amount: 1
Name fruit: Banana
Amount: 3
Orange
Banana


Для чего нужен тип хранения long long и как его использовать в коде Python. Порядок действий в подобных неясных ситуациях
Проблема: в задании на сайте Фоксфорд дана задача, где в результате решения может получиться очень большое число. В подсказке к задаче сказано: "может произойти переполнение 32-битной целочисленной переменной. Для хранения ответа нужно использовать тип long long."
Какая именно задача - не важно, подобный комментарий может быть и к другой задаче.
Вопрос: для чего нужен тип хранения long long и как его использовать в коде Python? Желательно указать ход действий, чтобы можно было правильно действовать в данном случае.

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

Обнаружена непонятная запись. С имеющимися знаниями по Python не стыкуется никак.

Набирается в Google / Yandex текст "long long". Обнаруживается, что масса ссылок идёт на C++ или C. И практически ничего на Python.

Бегло читается в С++, что это и зачем, становится ясно, что это тип данных для хранения очень больших чисел.

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

Делается предположение, что наиболее вероятны следующие варианты:

a) обучающийся попал не в свой курс (не туда зашел сбой на сайте и т.д.). Проверяется, так ли это.
б) ошибка в условии задачи, оставшаяся после copy/paste авторами курса c задачи на другом языке или с какой-то древней версии Python (если там в 2.х. вообще такое было). Если есть у кого ответственного за курс спросить - он или она и спрашивается (вариант: обсуждается на форуме данной задачи), если нет - принимается за наиболее вероятный случай. Задача решается без этого условия.
Опционально: задаётся вопрос на SO, но с уже собранными деталями и своим предположением.
в) зачем-то авторы хотят, чтобы этот тип был использован. Начать изучать данную версию, только если задача не будет никак приниматься. Держим для этого в уме комментарий @Alpensin про "в питоне аналог есть в библиотеке ctypes. from ctypes import c_longlong" (а также, что "Модуль ctypes представляет собой совместимые с языком C типы данных и позволяет вызывать функции в библиотеках DLL или совместно используемых библиотеках. " , т.е. что в этой задаче он непонятно зачем нужен).
Дополнительно: помним, что когда начнем работать, нам начальство или Заказчики будут периодически ставить достаточно бредовые задачи (иногда и учителя в школе, или преподаватели в универе). Большая ошибка - пытаться их выполнить любой ценой. Надо самому покопаться и вернуться к постановщику задачи с вопросами, если видно, что что-то не так.


Python (Try;Except) Как выделить несколько вариантов одной ошибки?
У меня есть несколько вариантов ошибки ApiError.
Пример:

vk_api.exceptions.ApiError: [5] User authorization failed: invalid access_token (4).
vk_api.exceptions.ApiError: [9] Flood control: too much captcha requests

Можно ли как-нибудь различить их в except? Чтобы при разных ошибках выполнялись разные действия?
Пример Кода:
<code>
except vk_api.exceptions.ApiError as error_msg: (Тут нужна первая ошибка)
       print(error_msg)
       (Какое-нибудь действие)
except vk_api.exceptions.ApiError as error_msg: (Тут вторая ошибка)
       print(error_msg)
       (Какое-нибудь действие)
</code>
Надеюсь понятно описал проблему.

У
ApiError есть поле
code.
Соответственно можно использовать
if

except vk_api.exceptions.ApiError as error_msg:
    if error_msg.code == 5:
        ...
    if error_msg.code == 9:
        ...

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

def handle_foo(error_msg):
    '''Делаю что-то с ошибкой'''

def handle_bar(error_msg):
    '''Делаю что-то другое с ошибкой'''

API_ERROR_HANDLERS = {5: handle_foo, 9: handle_bar}
...
except vk_api.exceptions.ApiError as error_msg:
    error_handler = API_ERROR_HANDLERS[error_msg.code]
    error_handler(error_msg)


Как сделать так, чтобы бот работал постоянно?
Что нужно сделать, чтобы бот работал на постоянке, даже если я выключал бы свой пк/посоветуйте какие нибудь сервисы,если такие знаете.

Для этого нужно использовать любой из существующих хостингов. Например google cloud, если ваш бот не большой. В противном случае придется пользоваться платными хостингами.


Получение времени видеофайла через OpenCV
Для получения времени видео решил использовать один из быстрых инструментов. Код примерно такой:
<code>
import cv2
def timevideo(pathVideoFile):
    video = cv2.VideoCapture(pathVideoFile)
    rate = video.get(5)
    rate = float("%.2f" % rate)
    FrameNumber = video.get(7)
    duration = FrameNumber / rate / 60.00
    print("%.2f" % duration)
</code>
В итоге протестировал два видеофайла и полученное время не совпадает с тем что указано в windows-проводнике. Первое видео со временем 4.43, но получено время 4.72. Второе - 1.34, но получено 1.58. Помогите разобраться как получить верное время видеофайла.

Не совсем ответ, но обнаружил следующее: при чтении видеопотока с IP камеры, сначала камера "сливает" буфер, а потом уже начинает слать фреймы со скоростью, соответствующей FPS.
То есть если я записываю видеофрагмент с камеры в файл 5 секунд, и камера настроена на 4FPS, то получаю видео за 5 секунд ДО начала записи и заканчивается ровно по времени записи. (На камере отображается время в картинку, так что хорошо видно тот факт, что полученный фрагмент раньше начала записи).
Соответственно, если рассчитать "реальный" FPS, то в моих условиях получался 9 кадров вместо 4.
Если ставлю интервал записи в 10 секунд - так же получаю где-то секунду "до" и остальное. И уже "реальный" FPS будет 6.
Возможно с видеофайлом происходит или подобная штука, или, что скорее всего - в результате работы кодека фреймы выдаются неравномерно. Из-за того, что в файле могут быть "полные" (опорные) фреймы и разница, которая восстанавливается в полный фрейм для выдачи в VideoCapture.


discord.py не могу сделать чтоб бот отправлял рандомное слово
<code>
import discord
import random
import config
from discord.ext import commands

client = commands.Bot(command_prefix="/")

hello_words = ["привет","хай","хеллоу"]
answer_words = ["где я?","что тут происходить?"]
goodbye_words = ["пока","всем пока"]
ban_words = ["****","1****","2****","3*****","3****","4****"]
udu_words = ["иди нафиг","иди ***","пошёл ****","пошёл нафиг","пошёл ***"]
words_list = [ "Что сказал наркоман когда на него упала стена? -Пацаны меня накрыло",
 "Штирлиц напоил кошку бензином,она прошла два метра и сдохла -Штирлиц подумал что бензин кончился",
"Какую инструкцию нельзя давать инвалидам -пошаговую",
"Мужик шёл по лесу,видит краба и спрашивает: ты тут каким боком?"]

@client.event
async def on_message(message):
    msg = message.content.lower()

    if msg in hello_words:
        await message.channel.send("Привет,я АнекБот")

    if msg in answer_words:
        await message.channel.send("Ты на лучшем сервере, где будет происходить много веселья и ты весело проведёшь время")

    if msg in goodbye_words:
        await message.channel.send("Иди ***!")

    if msg in ban_words:
        await message.channel.send("Это оскорбительное слово! Не используй его больше,пожалуйста!")

    if msg in udu_words:
        await message.channel.send("Сам иди!")

#Надо чтоб бот при команде отправлял рандомный анекдот с words_list в чат

token=open('config.py')
client.run(config.discord_token)
</code>

Используйте модуль
random.

import random

anek_int = random.randint(1, 4)
await message.channel.send(words_list(anek_int))

Генерируйте рандомное число от 1 до 4(потому что у вас представлено 4 "анекдота"), помещаете это число в переменную, в нашем случае
anek_int и обращаетесь к списку "анекдотов" к определённому элементу.


Объединение значений Python
Доброго времени суток!
Есть список словарей:

local = [{'Client': [70, 242],
  'description': 'name123',
  'userNotes': 'snq'},{'Client': [70, 169],
  'description': 'name234',
  'userNotes': 'e123123'}]
local_2 = [{'descriptionTag': 'Test1', 'Client': 169},
 {'descriptionTag': 'Test2', 'Client': 242},
 {'descriptionTag': 'Test3', 'Client': 70}]

Подскажите, пожалуйста, как правильно можно соединить значение 'Client' ?
В первом словаре есть 'Client' и список чисел, а во втором есть расшифровка этих чисел.
В итоге должно получиться так:

local = [{'Client': ['Test3', 'Test2'],
      'description': 'name123',
      'userNotes': 'snq'},
         {'Client': ['Test3', Test1],
      'description': 'name234',
      'userNotes': 'e123123'}]

нужно условие если не нашел ключ во втором поставил ' No key '
Недавно начал изучать питон, не знаю как правильно еще описать.

Начните с толковых наименований переменных, а то в дебрях этих local'ов легко запутаться
(: Переименовал, не уверен, что в соответствии с вашей задаче, но работать с кодом стало куда проще. А для решения подобных задач часто бывает полезным создавать промежуточные структуры данных и функции, которые упростят последующий алгоритм, в данном случае это
client_to_tag и
update_user_clients:

users = [{
    'Client': [70, 242],
    'description': 'name123',
    'userNotes': 'snq'
}, {
    'Client': [70, 169],
    'description': 'name234',
    'userNotes': 'e123123'
}]
tags = [
    {'descriptionTag': 'Test1', 'Client': 169},
    {'descriptionTag': 'Test2', 'Client': 242},
    {'descriptionTag': 'Test3', 'Client': 70},
]

client_to_tag = {
    d['Client']: d['descriptionTag']
    for d in tags
}

def update_user_clients(user):
    user = {**user}
    user['Client'] = [
        client_to_tag[client]
        for client in user['Client']
    ]
    return user

updated_users = [
    update_user_clients(user)
    for user in users
]
print(updated_users)


Не работает SQLite запрос с множественным условием WHERE
Пишу телеграм бота на aiogram, python. Возникла необходимость воспользоваться базой данных, написал следующий запрос:

for value in cur.execute("SELECT field FROM vlnt_table WHERE faculty = ? AND university = ?", (faculty_pressed, university_pressed)):
    current_value = str(value)
    fields_list.append(current_value)

Однако этот код не работает, выдается ошибка:

sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.

Проверял все переменные, соотносил со значениями из базы, пробовал писать два отдельных запроса с каждой из переменных faculty_pressed и university_pressed (они работали), но вот вместе, в одном WHERE, они не работают. Мне нужны именно эти два условия, подскажите, в чем проблема, пожалуйста! Буду рад, если найдется вариант реализации этих условий с помощью двух запросов (мне нужно именно в цикле)
upd: показываю, что я вкладывал в переменные:

faculty_pressed = (message.text[10:],)

async with state.proxy() as abit_filter:
    abit_filter['university'] = (message.text[12:],)
university_pressed = abit_filter['university']

Вот так я проверял, находятся ли соответствия:

for value in cur.execute('SELECT university FROM vlnt_table'):
    print(value)
    if value == university_pressed:
        print('Должно работать!!')

Закину, пожалуй, всю функцию:

async def cmd_abit_filters_faculty(message: types.Message, state = FSMContext):
async with state.proxy() as abit_filter:
    abit_filter['faculty'] = (message.text[10:],)
    university_pressed = abit_filter['university']
faculty_pressed = (message.text[10:],)
print(abit_filter['university'])
fields_list = []
for value in cur.execute('SELECT university FROM vlnt_table'):
    print(value)
    if value == university_pressed:
        print('Должно работать!!')
for i in cur.execute("SELECT field FROM vlnt_table WHERE (faculty = ?) AND (university = ?)", (faculty_pressed, university_pressed)):
    current_value = str(value)
    current_value = current_value.replace('(', '')
    current_value = current_value.replace(')', '')
    current_value = current_value.replace("'", "")
    current_value = current_value.replace(',', '')
    fields_list.append(current_value)
base.commit()
fields_set = list(set(fields_list))
fields_set = fields_list
kb_fields = ReplyKeyboardMarkup(resize_keyboard=True)
for i in fields_set:
    kb_fields.add(f"Направление {i}")
await FSMFilters.next()
await bot.send_message(message.from_user.id, 'Выберите направление подготовки, о котором хотели бы узнать', reply_markup=kb_fields)

Вся проблема в том, что вы неправильно используете метод
execute у курсора, а именно неправильно передаете параметры запроса, т.е. второй параметр функции
execute.
Если у вас запрос в котором есть несколько параметров т.е. значений, которые вы передаете в запрос и в самом тексте запроса вы их задает знаками вопроса, то второй параметр должен быть списком или кортежем, в котором первому знаку вопроса соответствует значение первого параметра, второму - значение второго  и т.д.
На примере вашего запроса
SELECT field FROM vlnt_table WHERE (faculty = ?) AND (university = ?). У вас два параметра (еще по другому называются связываемые переменные, bounded variables). Поля
faculty и
university у вас в БД, как я понял, строки. Значит вторым параметром в
execute нужно передавать список или кортеж из двух строк.
Вы же передаете кортеж из двух элементов, но первым является не строка, а кортеж из одного элемента (например вот
('КБ',) - это кортеж из одной строки), который вы создаете тут:

faculty_pressed = (message.text[10:],)

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

faculty_pressed = message.text[10:]

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

cur.execute("SELECT field FROM vlnt_table WHERE (faculty = ?) AND (university = ?)", (faculty_pressed, university_pressed))


Изменение списка python
Можете ли пояснить, почему в коде (написан для примера) вроде всё логически нормально, но по итогу список не изменяется. При этом если использовать обращение через  индекс посредством Items.index(Item) то всё работает. Вроде как код написанный ниже должен работать и так, где я ошибся?
<code>
Items = ["weapon","offhand","helmet","boots","belt","offhand","gloves","bonus"]
for Item in Items:
    Item += "1234"
print(Items)
</code>
Заранее спасибо.

Вариант обновления списка без индексов. Так как список хранит строки, а строки неизменны, то в обычном цикле
for Item in Items: обновить список нельзя. Можно создать новый временный и заместить элементы старого. Вот так:

Items = ["weapon","offhand","helmet","boots","belt","offhand","gloves","bonus"]
Items[:] = [Item + "1234" for Item in Items]

Важно понимать разницу между
Items =  и
Items[:] = . Первое присваивание удаляет старый список и присваивает переменной новый. Второе присваивание в старом списке изменяет элементы. Сам список не удаляется.


Не работает условие WHERE в SQLite запросе
Пишу телеграм-бота, возникла надобность сделать клавиатуру ReplyKeyboardMarkup, где значения кнопок будут браться из базы данных SQLite. Написал соответствующую функцию:
<code>
async def cmd_abit_filters_region(message: types.Message, state = FSMContext):
async with state.proxy() as abit_filter:
    abit_filter['region'] = message.text[1:]
region_pressed = "('" + message.text[1:] + "',)"
region_pressed = message.text[1:]
with open('''C:/Users/vvvpe/Desktop/Connect/Data/filters.txt''', 'a') as filters:
    filters.write('''\n["%s", ''' % str(abit_filter['region']))

universities_list = []
for value in cur.execute(f'''SELECT university FROM vlnt_table WHERE region = ?''', [region_pressed]):
    current_value = str(value)
    current_value = current_value.replace('(', '')
    current_value = current_value.replace(')', '')
    current_value = current_value.replace("'", "")
    current_value = current_value.replace(',', '')
    print(current_value)
    universities_list.append(current_value)
base.commit()
universities_set = list(set(universities_list))
universities_set = universities_list
print(universities_set)
kb_universities = ReplyKeyboardMarkup(resize_keyboard=True)
for i in universities_set:
    kb_universities.add(f"Университет {i}")

await FSMFilters.next()
await bot.send_message(message.from_user.id, 'Выберите интересующий вас вуз', reply_markup=kb_universities)
</code>
Никаких трейсов нет. Просто не включается клавиатура, как будто в цикле for курсор не находит в базе соответствия. Я пробовал выводить значения из базы, выдаётся такое: ('Москва',), ('Санкт-Петербург',) - с запятыми и скобками, поэтому я пытался к переменной region_pressed эти знаки вручную прикрутить. Пробовал и без этого костыля - не работает, ошибок не выдаёт((( Помогите, пожалуйста!

Это же кортежи - их
execute принимает. Тогда рекомендация на исправление вместо "эти знаки вручную прикрутить":

region_pressed = (message.text[1:],)

Тут тип - кортеж, как видим из
type (region_pressed).
А у вас строка получалась:

region_pressed = "('" + message_text[1:] + "',)"

Мне не проверить - нет БД, подкрутите по ситуации.
И, как понимаю, писать надо в запросах не
[region_pressed], а просто
region_pressed. Вот похожий случай:
Sqlite3.InterfaceError: Error binding parameter 0 — probably unsupported type как исправить?


Как в Python c с помощью бибилиотеки Telebot написать код в котором бот будет сравнивать полученный текст с массивом и делать на него ответ? [закрыт]

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

 Скорее всего, данный вопрос не соответствует тематике Stack Overflow на русском, согласно правилам описанным в справке.

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

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

Как в Python c с помощью бибилиотеки Telebot написать код в котором бот будет сравнивать полученный текст с массивом и делать на него ответ?

Вот так наверное
<code>
list_data = ["1", "2",...]

@bot.message_handler(func=lambda msg: msg.text in list_data)
def hanle(message: types.Message):
    ...
</code>


Как сделать замену в строке
Пишу игру "виселица" на Python в Pydroid 3. Правила такие: один игрок загадывает слово, передает телефон другому игроку и он пытается отгадать слово по буквам (полностью правила можете почитать в Википедии). Вот мой код:

from os import system

pics = [
'''
|------
|/    |
|
|
|
=======
''',
'''
|------
|/    |
|     Ô
|
|
========
''',
'''
|------
|/    |
|     Ô
|     |
|
========
''',
'''
|------
|/    |
|     Ô
|    /|
|
========
''',
'''
|------
|/    |
|     Ô
|    /|\\
|
========
''',
'''
|------
|/    |
|     Ô
|    /|\\
|    /
========
''',
'''
|------
|/    |
|     Ô
|    /|\\
|    / \\
========
'''
] # это картинки виселицы

word = input('Слово: ') # загаданное слово
word_len = len(word) # кол-во букв в слове
word_crypt = '_ ' * word_len # "зашифрованное" слово (знаки _ вместо букв)

letter_list = [] # список уже использованных букв
wrong_attempts = 0 # число неверных попыток

system('clear') # очистка экрана

while '_' in word_crypt:
    print(pics[wrong_attempts])
    print()
    print(', '.join(letter_list))
    print()
    print(word_crypt)
    print()

    letter = input('Буква: ') # буква для отгадывания
    letter_list.append(letter) # буква заносится в список
    letter_pos = word.find(letter) # позиция буквы в слове

    if letter_pos == -1:
        wrong_attempts += 1 # если не угадал букву
    else:
        # вот тут я не знаю как написать

    if wrong_attempts >= 6:
        system('clear')
        print(pics[6])
        print()
        print('ВЫ ПРОИГРАЛИ!') # проигрыш
        break
    elif not '_' in word_crypt:
        system('clear')
        print('ВЫ ВЫИГРАЛИ!') # выигрыш
        break
    else:
        system('clear')

input() # приостановка программы

Проблемы:

Нельзя загадать слово, где хотя бы одна буква повторяется (из-за
word.find(letter)).
Я не знаю как написать код чтобы он заменял
_ на
letter в
word_crypt. Пробовал так:

word_crypt.replace('_', letter)

Но не работает
(Этот код должен быть там где в
else у меня комментарий).
Помогите, пожалуйста, исправить мой код!

Еще раз всем спасибо большое, все комментарии помогли, показываю свой рабочий код:
<code>
from os import system

pics = [
'''
|------
|/    |
|
|
|
=======
''',
'''
|------
|/    |
|     Ô
|
|
========
''',
'''
|------
|/    |
|     Ô
|     |
|
========
''',
'''
|------
|/    |
|     Ô
|    /|
|
========
''',
'''
|------
|/    |
|     Ô
|    /|\\
|
========
''',
'''
|------
|/    |
|     Ô
|    /|\\
|    /
========
''',
'''
|------
|/    |
|     Ô
|    /|\\
|    / \\
========
'''
]

word = input('Слово: ')
word_len = len(word)
word_crypt = '_' * word_len
word_crypt_list = list(word_crypt)

letter_list = []
wrong_attempts = 0

system('clear')

while '_' in word_crypt_list:
    print(pics[wrong_attempts])
    print()
    print(', '.join(letter_list))
    print()
    print(' '.join(word_crypt_list))
    print()

    letter = input('Буква: ')
    letter_list.append(letter)
    attempts = 0
    for i in range(word_len):
        if word[i] == letter:
            word_crypt_list[i] = letter
            attempts += 1
        else:
            continue

    if attempts == 0:
        wrong_attempts += 1
        system('clear')
    else:
        system('clear')

    if wrong_attempts >= 6:
        system('clear')
        print(pics[6])
        print()
        print('ВЫ ПРОИГРАЛИ!')
        break
    elif not '_' in word_crypt_list:
        system('clear')
        print('ВЫ ВЫИГРАЛИ!')
        break
    else:
        system('clear')

input()

</code>


Python пытается удалить удаленное число из массива
Есть код:
<code>
import numpy as np
import random
def solve_puzzle():
    a = 7
    b = 7
    numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    str = []
    for i in range(a):
        str.append([])
        for j in range(b):
            x = random.randint((min(numbers)), max(numbers))
            str[i].append(x)
            numbers.remove(x)
            print(x)

    print(np.array(str))

solve_puzzle()
</code>
Я хочу сделать так, чтобы выводилась матрица из 7 строк по 7 чисел в каждой, причем числа в строке не должны повторятся. Пытался сначала добавлять число в строку, а затем удалять его из списка тех, которые нужно добавить. Однако Python выкатывает ошибку ValueError
list.remove(x): x not in list.
Как можно исправить?

x = random.randint((min(numbers)), max(numbers))

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

[1, 9]

В этом массиве есть только минимальный элемент 1 и максимальный 9, а ничего остального между ними просто нет.
Чтобы выбрать произвольный элемент из
numbers используйте другой метод:

x = random.choice(numbers)

Хотя это не исправит остальные проблемы вашего алгоритма, с которыми вам ещё предстоит разобраться. Но конкретно эту проблему - исправит.


Как в pyhon зашифровать файл побайтово?
Есть код:

import os

key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E]

fi = open("1.bin", "rb")
fo = open("1e .bin", "wb")
length = os.path.getsize("1.bin")
position = 0
try:
    while position < length:
        byte = fi.read(1)
        if position >= 320 and position < 31040:
            byte = chr(ord(byte) ^ key[position & 31])
        fo.write(byte)
        position += 1
finally:
    fi.close()
    fo.close()

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

TypeError: a bytes-like object is required, not 'str'

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

Вам нужно преобразовать ваш зашифрованный символ в байты.

if position >= 320 and position < 31040:
    byte = chr(ord(byte) ^ key[position & 31])
    byte = bytes(byte, encoding='utf-8')

Или можно сократить:

if position >= 320 and position < 31040:
    byte = bytes(chr(ord(byte) ^ key[position & 31]), encoding='utf-8')

UPD:
Я бы еще заменил
while на
for:

for position in range(length):
    byte = fi.read(1)
    if position >= 320 and position < 31040:
        byte = bytes(chr(ord(byte) ^ key[position & 31]), encoding='utf-8')
    fo.write(byte)


Как записать строки файла в массив, при достижении определенного слова?
я пишу бота Telegram.    Его задача это выдавать определенные тексты, которые записаны в текстовой файл.
Текстов много, поэтому я старался создать систему, которая по достижении ключевого слова, отделяет между собой эти тексты и каждый из них записывает в отдельный элемент массива.
Например:
% конец %
текст
текст
%конец%
текст
где %конец% разделяет между собой два разных текста, а текст это то что надо записать в ячейку массива.
Для начала я написал код который ищет в тексте номера строк со словом % конец%, но вот дальше я вошел в ступор.
Как мне выделить строки, которые лежат между двумя строками %конец%, и записать их в элемент массива?
Я начал изучать питон недавно, пытался все сделать сам, но тут все же не понимаю что делать. Заранее благодарю вас за помощь.
Вот все что мне удалось написать:
<code>
import re
d=[] #массив со строками, содержащие %end%
f=[] #массив содержащий все строки, а в конце - все строки, но без строк %end%
amount = len(re.findall(r"[\n']+?", open('apis.txt', encoding=("utf-8")).read()))
with open('apis.txt', 'rt', encoding="utf-8") as file:
        for inde, line in enumerate(file, 1):
            f.append(inde)
print(f)
with open('apis.txt', 'rt', encoding="utf-8") as file:
    for index, line in enumerate(file, 1):
        if "%end%" in line:
            d.append(index)
            f.remove(index)
print(d)
print(f)

</code>

txt = '''
где %конец% разделяет между собой два разных текста, а текст это то что надо записать в ячейку массива. %конец%
Для начала я написал код который ищет в тексте номера строк со словом %конец%, но вот дальше я вошел в ступор.
 Как мне выделить строки, которые лежат между двумя строками %конец%, и записать их в элемент массива?
'''
f = txt.split('%конец%')
print(f)

['\nгде ',
 ' разделяет между собой два разных текста, а текст это то что надо записать в ячейку массива.', '\nДля начала я написал код который ищет в тексте номера строк со словом ',
 ', но вот дальше я вошел в ступор.\n Как мне выделить строки, которые лежат между двумя строками ',
 ', и записать их в элемент массива?\n']


Проблема с ботом для дискорда на discord.py
Бот должен исключать пользователь из голосового канала в дискорде, после того, как пользователь напишет определенную фразу, но такого не происходит.
<code>
@bot.command()
async def kickm(ctx):
    member_id = 159985870458322944
    member: Member = ctx.guild.get_member(member_id)
    await member.kick(reason=f'{ctx.author} Выгнал {member}')

@client.event
async def on_message(message, ctx=None):
    if message.author == client.user:
        return

    if message.content.startswith("..."):
        time.sleep(2)
        await message.channel.send(",,,")
        time.sleep(2)
        await kickm
</code>

Здесь можно обойтись и одним ивентом
on_message()

@client.event
async def on_message(message, ctx=None):
    if message.author == client.user:
        return

    if message.content.startswith("...") and message.author.voice is not None:
        time.sleep(2)
        await message.channel.send(",,,")
        time.sleep(2)
        await message.author.move_to()

Функция
move_to() перемещает пользователя в определённый канал, но если не указать его, то бот просто кикнет его из канала.


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

# Здесь у меня как выглядит вставка изображения

photo = PhotoImage(file="bg.png")

canvas = Canvas(root,width=250, height=55)
canvas.create_image(0, 0, anchor=NW, image=photo)
canvas.pack(side=TOP, padx=1, pady=1)

А это текст ошибки:

   Traceback (most recent call last):
  File "C:\Users\bertr\OneDrive\Desktop\RaiderLab Cllient\Scripts\MailSpam\mail.py", line
35, in <module>
    photo = PhotoImage(file="bg.png")
  File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 4093, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 4038, in __init__
    self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't recognize data in image file "bg.png"

Вот код который у меня работал, и есть несколько отличий от вашего:
<code>
from tkinter import *
from PIL import ImageTk, Image

root = Tk()

# Defining the image

my_img = ImageTk.PhotoImage(Image.open("download.png"))
my_label = Label(image=my_img)

my_label.pack()

root.mainloop()
</code>
Используя Image.open вы сможете открыть эту картинку


Не работает поиск элемента
Я пытаюсь найти в массиве слово mp3, перебирая каждое значение массива, но выводит программа только значек ошибки "0".
<code>
g='0'
s=['mp3']
for i in range (0):
    if 'mp3' in s[i]:
        print()
        g=s[i]
        break
print(g)
</code>

У вас ошибка в том, что вы проходите циклом по
range(0), то есть цикла не будет и данный блок кода просто пропустится.
Вот более красивый вариант прохода по списку:

g='0'
s=['mp3']
for word in s:
    if 'mp3' in word:
        print()
        g=word
        break
print(g)

так же хочу добавить, что конструкция
if 'mp3' in word будет давать истину, когда mp3 является частью слова, если вы хотите полное совпадение, то используйте
if word == 'mp3'


Объединение двух ботов на discord py в одного
У меня есть два бота и две задачи для них. Я их не могу объеденить по одной причине. Есть две функции on_message и on_ready
В функции on_ready реализован бесконечный цикл. Отправка сообщений утром и вечером
А в функции on_message разные условия для сообщений
По отдельности работает, вместе - нет.
Я предполагаю, что это из за бесконечного цикла. То есть бесконечно проверяет время сейчас и нужное мне и поэтому не реагирует на сообщения, потому что занят проверкой времени.
В этом ли проблема и если да, то как по другому реализовать функцию on_ready, чтобы она и функция on_message работала.
<code>
import discord
from datetime import datetime, time
import time

client = discord.Client()

@client.event
async def on_ready():
    channel = client.get_channel(id)
    while True:
        if str(datetime.now().hour) == '6':
            await channel.send(f"Доброе утро")
            time.sleep(4000)
        elif str(datetime.now().hour) == '20':
            await channel.send(f"Спокойной ночи")
            time.sleep(4000)

@client.event
async def on_message(message):
    if message.content == 'hi':
        await message.reply('hi')
</code>

Можно подойти к задаче немного иначе, вынести бесконечный цикл из события и тем самым дополнительно подготовить код к дальнейшему расширению функционала.
Пока кода не очень много возможность расширения его может казаться не проблемой, но если код изначально плохо спроектирован - то придется его переписывать или писать костыли, чтобы добавить функционал.
В python есть библиотека планировщик, которой можно задать точное  время выполнения каких либо функций.
Таким образом код можно организовать примерно так:
<code>
import discord
from datetime import datetime, time
import time
import schedule

client = discord.Client()

@client.event
def on_ready():
    channel = client.get_channel(id)
    schedule.every().day.at("06:00").do(lambda: channel.send(f"Доброе утро"))
    schedule.every().day.at("20:00").do(lambda: channel.send(f"Спокойной ночи"))

@client.event
async def on_message(message):
    if message.content == 'hi':
        await message.reply('hi')

while True:
    schedule.run_pending()
    # другие действия
    time.sleep(1)
</code>


Пронумеровать значения в словаре?
<code>
dict = {}
list = ["first", "second", "third"]
count = 0
for i in list:
   count+=1
   dict[count]=i
   print(dict)

 #Хочу вывести словарь вот так - {1: 'first', 2: 'second', 3: 'third'}
 # Но выводится вот так - {1: 'first'}
                          {1: 'first', 2: 'second'}
                          {1: 'first', 2: 'second', 3: 'third'}
</code>
Подскажите, что я делаю не так?

dct = {}
lst = ["first", "second", "third"]
for x, i in enumerate(lst, 1):
   dct[x]=i
print(dct)

в одну строчку

print({x: i for x, i in enumerate(["first", "second", "third"], 1)})


Импорт класса из файла в основную программу
создал в отдельном файле класс и хочу его импортировать в основную программу, но мне выдает ошибкy: cannot import name 'game' from 'Games'
это откуда я импортирую:

class Games:
  def game(message, call):

это я написал в основном файле, в самом начале:

from Games import game

Сейчас вы импортируете функцию с
game. А нужно импортировать класс, то есть шаблон будет такой
from <имя файла> import <имя класса>.

Если файл лежит в отдельной папке то следует указывать также и имя папки через точку
from <имя папки>.<имя файла> import <имя класса>


Где надо вставить .lower() чтобы бот принимал любой регист букв?
<code>
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text in [
    'свойства степени', 'степень', 'свойства степеней', 'преобразование степеней'])
def pythagoras_theorem(message: types.Message):
    photo1 = open('png/shk-1355-osnovnyie-svojstva-stepenej-kornej-1x1.png', 'rb')
    bot.send_photo(message.chat.id, photo1)
</code>

В функции проверки сообщения переведите текст в нижний регистр:
<code>
@bot.message_handler(
    chat_types=['private'],
    func=lambda msg: msg.text.lower() in [
          'свойства степени', 'степень', 'свойства степеней',
          'преобразование степеней'
    ]
)
def pythagoras_theorem(message: types.Message):
   ...
</code>


AttributeError: 'Dict' object has no attribute 'book'
Я читал статьи про ООП и эту проблему, но не понял как её решить

import pickle

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

# Класс содержащий список с именами и данными
class Dict():
    def __init__(self, book):
        self.book = {}

    def InputInfo(self):
        self.book = {} # создаем список
        print(self.book)
        name = input("Введи имя человека:")
        # Просим пользователя ввести данные
        info = input(("Напишите информацию о человеке:"))

        self.book[name] = info # добавляем данные в список
        print(self.book)

    def Del(self):
        delname = input("Введите имя того кого хотите удалить:")

        pop_item = self.book.pop(delname) # удаляет данные об имени что ввел пользователь

        print(self.book)

    def Save(self):
        # Имя файла в котором мы сохраним объект
        adfile = 'book.data'

        # Запись в файл
        f = open(adfile, 'wb')
        pickle.dump(self.book, f) # помещаем объект в файл
        f.close()

        del self.book # удаляем словарь

        # Считываем из хранилища
        f = open(adfile, 'rb')
        savedict = pickle.load(f) # загружаем объект из файла
        print(savedict)

# Реализация
print("Хочешь завести адресную книгу? \n1-ДА, 2-НЕТ")
answ = int(input())

if answ == 1:
    d = Dict({})
    d.InputInfo()
else:
    print("Как хочешь")

d = Dict({})
d.Save()

print("Добавьте еще одного человека")

d.Save()

Ошибка:

Traceback (most recent call last): File "C:\Python\AddressBookCopy2.py", line 65, in <module> d.Save() File "C:\Python\AddressBookCopy2.py", line 38, in Save pickle.dump(self.book, f) # помещаем объект в файл AttributeError: 'Dict' object has no attribute 'book'

Ошибку выдает потому что после вызова метода
Save у класса действительно нет атрибута
book - вы его удаляете в указанной ранее функции
del self.book # удаляем словарь . А вы пытаетесь еще раз "сохранить" ваш класс.


Python распознавание спец-символа "
Пожалуйста помогите распознаванию спецсимвола " в Python
<code>
u = input("")
l=""

if u[0:5] == "print":
    for y in u[5:]:
        if  y == "(" or  y == ")" or y == """:
            None
        else:
            l+=str(y)
print(f"{l}")
</code>
Как сделать  если будет написано " не выводит символ, но пайтон думает что " это символ код и выводит ошибку


Python OpenGL зумирование
тут выпала задача сделать зум в opengl, я попробовал разобраться но всё тщетно, вот код, буду рад любым подсказкам, сам от себя пробовал много чего, и glScale и glOrtho, оно всё работает но отрисовывает один раз, я хочу повесить этот ивент на колесико мыши в PySide, но не получается, график просто не обновляется
<code>
from PySide2.QtCore import QPoint
from PySide2.QtWidgets import *
from OpenGL import GL
import sys
import numpy as np

# Simple example for a class derived from QWidget, which has its own resize methods and mouse events
class TestWidget(QOpenGLWidget):

    def initializeGL(self):
        self.vertices = vertices = np.array([0.0, 1.0, -1.0, -1.0, 1.0, -1.0], dtype=np.float32)

        self.bufferID = bufferId = GL.glGenBuffers(1)

        GL.glBindBuffer(GL.GL_ARRAY_BUFFER, bufferId)

        GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices.nbytes, vertices, GL.GL_DYNAMIC_DRAW)

        GL.glEnableVertexAttribArray(0)
        GL.glVertexAttribPointer(0, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, None)
        # GL.glOrtho(-10, 10, -10, 10, -10, 10)             # если раскоментить тут - работает
        # GL.glOrtho(-100, 100, -100, 100, -100, 100)
        self.test = GL.glGetBufferSubData(GL.GL_ARRAY_BUFFER, 0, self.vertices.nbytes)

    def paintGL(self):
        GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3)

    def mousePressEvent(self, event):

        GL.glRotatef(45, 0, 0, 1)   # тут не работает
        pos = QPoint(event.pos())
        print(f"Clicked: {pos}")
        event.accept()

    def wheelEvent(self, event):
        scrolls = event.delta()
        print(f"Scrolled: {scrolls}")
        GL.glOrtho(-100, 100, -100, 100, -100, 100)         # тут не рабоатет

class TestContainerApp(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        self.setMinimumSize(500, 500)
        self.setBaseSize(500, 500)
        self.test_widget = TestWidget()

        self.gridLayoutWidget = QWidget()
        self.gridLayoutWidget.setObjectName(u"gridLayoutWidget")
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setObjectName(u"gridLayout")
        self.gridLayout.addWidget(self.test_widget, 0, 0)
        self.setLayout(self.gridLayout)

        self.test_widget.setEnabled(True)
        self.test_widget.show()

if __name__ == '__main__':
    app = QApplication()
    my_app = TestContainerApp()
    my_app.show()
    sys.exit(app.exec_())
</code>

В итоге сделал зуминг, с помощью комментария Владимира Клыкова, ответ вот такой:
Исправить Test Widget на тот виджет, который ниже:
<code>
class TestWidget(QOpenGLWidget):

    def initializeGL(self):

        self.vertices = vertices = np.array([0.0, 1.0, -1.0, -1.0, 1.0, -1.0], dtype=np.float32)

        self.bufferID = bufferId = GL.glGenBuffers(1)

        GL.glBindBuffer(GL.GL_ARRAY_BUFFER, bufferId)

        GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices.nbytes, vertices, GL.GL_DYNAMIC_DRAW)

        GL.glEnableVertexAttribArray(0)
        GL.glVertexAttribPointer(0, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, None)

        self.zooming_var = 0
        self.old_zoom_var = 0

        self.up_scale = 1.2
        self.down_scale = 0.8

    def set_scale(self):
        if self.zooming_var < self.old_zoom_var:
            scale = self.down_scale

        elif self.zooming_var > self.old_zoom_var:
            scale = self.up_scale

        else:
            scale = 1

        self.old_zoom_var = self.zooming_var

        return scale

    def paintGL(self):
        scale = self.set_scale()
        GL.glScalef(*((scale, ) * 3))
        GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3)

    def wheelEvent(self, event):
        scrolls = event.delta()
        if scrolls > 0:
            self.zooming_var += 1

        else:
            self.zooming_var -= 1
        self.update()
</code>


Помощь в разборе ошибки python
Есть небольшой код с использованием стороннего api(кому интересно - pip install pyopendota). Суть api в получении той или иной информации о игроках/матчах дота2. При попытке реализации кода, питон выдает ошибку, которую я, в виду своей неопытности понять никак не могу.
Вот ошибка:

Traceback (most recent call last):
File "H:\pythonProject1\proverkasinputom.py", line 15, in
y = str(client.get_player(x))
File "H:\Pythonn\lib\site-packages\opendota\opendota.py", line 425, in get_player
return self.get(url, filename=filename, force=force)
File "H:\Pythonn\lib\site-packages\opendota\opendota.py", line 227, in get return self.request(*args, **kwargs)
File "H:\Pythonn\lib\site-packages\opendota\opendota.py", line 216, in request
with open(path, "w") as f:
OSError: [Errno 22] Invalid argument: 'C:\Users\Shaurma\dota2\player_480484126\n.json'

Вот код, который приводит к данной ошибке:

while True:
    if count == 1:
        print('done')
        break
    file1 = open('test.txt', 'r', encoding='utf-8')
    x = file1.readline()
    file1.close()
    y = client.get_player(x)
    print(y)
    count += 1

При этом, если я прописываю вручную id в
 client.get_player, все прекрасно работает.
Пример рабочего кода, но без подстановки нужного id через переменную:

count = 0
while True:
    if count == 1:
        print('done')
        break
    y = client.get_player('480484126')
    print(y)
    count += 1

Хотелось бы понять: это какое-то ограничение api на ввод id через переменную,или что-то иное? Есть ли возможное решение данного вопроса?

File "H:\Pythonn\lib\site-packages\opendota\opendota.py",
line 216, in request with open(path, "w") as f:
OSError: [Errno 22] Invalid argument:
'C:\\Users\\Shaurma\\dota2\\player_480484126\n.json'
                                            ^^

Судя по ошибке, у вас передаётся в вызов
api лишний перевод строки после номера игрока. Попробуйте его убрать:

x = file1.readline().strip()
                    ^^^^^^^^


Можно ли данный код сократить до одной строчки
<code>
sku_ = re.search("Артикул товара: (\d+)", item_info.text)
sku = sku_[1] if sku_ else ""
</code>
Можно ли данный код сократить до одной строчки?

У меня так получилось, но наверняка можно ещё лучше сделать:
<code>
sku = (re.search("Артикул товара: (\d+)", item_info.text) or ('',''))[1]
</code>


Как написать не число в программе int(input()) [закрыт]

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

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

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

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

Если написать

int(input())
И если в консоль вписать не число то выйдет ошибка как написать код чтобы он при введении не числа (примечание: исправлено @Sergey) в консоль не выдавал ошибку или хотя бы удалял за собой буквы без удаления
int(input())

Если вы не хотите остановки программы при введении нечислового значения, то самым правильным будет обработка исключений. Но подозреваю, что вы еще до этого не дошли в изучении Python и это будет сложно. Поэтому рекомендую разделить
int(input()) на две части и действовать  так (будет запрашивать ввод программа, пока не окажутся только цифры после ввода):

integer = False
while not integer:
    str_test = input()
    if str_test.isdigit():
        final = int(str_test)
        integer = True
print (final)


Как объяснить боту, что это разные команды?
Хотел сделать бота с расписанием пар для каждой группы.
Но когда выбираешь, условно, понедельник он скидывает расписание той группы, которая в коде идем первой.
Объяснил вроде не очень понятно, но надеюсь вы сможете помочь)
<code>
@dp.message_handler(lambda message: message.text =='КСК')
async def KSK(message: types.Message):
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_1 = types.KeyboardButton(text="115")
    keyboard.add(button_1)
    button_2 = "116"
    keyboard.add(button_2)
    button_3 = "105"
    keyboard.add(button_3)
    await message.answer("Ваша группа", reply_markup=keyboard)

@dp.message_handler(lambda message: message.text =='115')
async def MYgorup(message: types.Message):
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_1 = types.KeyboardButton(text="Понедельник")
    keyboard.add(button_1)
    button_2 = "Вторник"
    keyboard.add(button_2)
    button_3 = "Среда"
    keyboard.add(button_3)
    button_3 = "Четверг"
    keyboard.add(button_3)
    button_3 = "Пятница"
    keyboard.add(button_3)
    button_3 = "Суббота"
    keyboard.add(button_3)
    await message.answer("День недели", reply_markup=keyboard)

@dp.message_handler(lambda message: message.text =='Понедельник')
async def Ponedelnik(message: types.Message):
    await message.answer("1 - 321 Физика Бабченко Т.Н\n2 - 313|322 Родной язык  Хуснуллина З.М., Шириева Г.М\n3 - 309 Математика    Габдулхакова Г.Р.")

@dp.message_handler(lambda message: message.text =='Вторник')
async def Vtornik(message: types.Message):
    await message.answer("1 - 425   Химия\n2 - 309  Математика")

@dp.message_handler(lambda message: message.text =='Среда')
async def Sreda(message: types.Message):
    await message.answer("1 -311    Информатика\n2 - c/з Физическая культура|309 Математика\n3 - 407|405 Иностранный язык\n4 - 205  Основы безопасности жизнедеятельности")

@dp.message_handler(lambda message: message.text =='Четверг')
async def Setverg(message: types.Message):
    await message.answer("1 - 426 Литература, 405|407 иностранный язык\n2 - 413 Астрономия 1-16 нед|Физика 17-23 нед\n3 - 426   Русский язы\n4 - 419    История")

@dp.message_handler(lambda message: message.text =='Пятница')
async def Friday(message: types.Message):
    await message.answer("\n\n 3 - 309  Математика\n4 - 426 Литература")

@dp.message_handler(lambda message: message.text =='Суббота')
async def Sibbota(message: types.Message):
    await message.answer("1 - с/з   Физическая культура\2 - 311 Информатика\n3 - 419    История")

@dp.message_handler(lambda message: message.text =='116')
async def Denssec(message: types.Message):
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_1 = types.KeyboardButton(text="Понедельник")
    keyboard.add(button_1)
    button_2 = "Вторник"
    keyboard.add(button_2)
    button_3 = "Среда"
    keyboard.add(button_3)
    button_3 = "Четверг"
    keyboard.add(button_3)
    button_3 = "Пятница"
    keyboard.add(button_3)
    button_3 = "Суббота"
    keyboard.add(button_3)
    await message.answer("День недели", reply_markup=keyboard)
</code>

Ну к примеру вот так
<code>
from aiogram import Bot, Dispatcher, executor
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.dispatcher.storage import FSMContext
from aiogram.utils.exceptions import MessageTextIsEmpty

from aiogram import types

import config

bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

data_lessons = {
    "105": {
        "monday":
            "",
        "tuesday":
            "",
        "wednesday":
            "",
        "thursday":
            "",
        "friday":
            "",
        "saturday":
            ""
    },
    "115": {
        "monday":
            "1 - 321 Физика Бабченко Т.Н\n"
            "2 - 313|322 Родной язык  Хуснуллина З.М., Шириева Г.М\n"
            "3 - 309 Математика    Габдулхакова Г.Р.",
        "tuesday":
            "1 - 425   Химия\n"
            "2 - 309  Математика",
        "wednesday":
            "1 -311    Информатика\n"
            "2 - c/з Физическая культура|309 Математика\n"
            "3 - 407|405 Иностранный язык\n"
            "4 - 205  Основы безопасности жизнедеятельности",
        "thursday":
            "1 - 426 Литература, 405|407 иностранный язык\n"
            "2 - 413 Астрономия 1-16 нед|Физика 17-23 нед\n"
            "3 - 426   Русский язы\n"
            "4 - 419    История",
        "friday":
            "\n\n 3 - 309  Математика\n"
            "4 - 426 Литература",
        "saturday":
            "1 - с/з   Физическая культура\n"
            "2 - 311 Информатика\n"
            "3 - 419    История"
    },
    "116": {
        "monday":
            "",
        "tuesday":
            "",
        "wednesday":
            "",
        "thursday":
            "",
        "friday":
            "",
        "saturday":
            ""
    }
}

class Lessons(StatesGroup):
    input_group = State()
    input_auditory = State()

@dp.message_handler(text='КСК')
async def chiose_group(message: types.Message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add("105", "115", "116")
    await message.answer("Выберите вашу группу", reply_markup=markup)
    await Lessons.input_group.set()

@dp.message_handler(text=list(data_lessons.keys()), state=Lessons.input_group)
async def choise_weekday(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['choise_group'] = message.text

    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add("Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота")
    markup.add("Назад")
    await message.answer("Выберите день недели", reply_markup=markup)
    await Lessons.next()

@dp.message_handler(text="Назад", state=Lessons.input_auditory)
async def back_but(message: types.Message, state: FSMContext):
    await state.reset_data()
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add("105", "115", "116")
    await message.answer("Выберите вашу группу", reply_markup=markup)
    await Lessons.previous()

@dp.message_handler(text=["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"],
                    state=Lessons.input_auditory)
async def choise_auditory(message: types.Message, state: FSMContext):
    dict_ = {
        "Понедельник": "monday",
        "Вторник": "tuesday",
        "Среда": "wednesday",
        "Четверг": "thursday",
        "Пятница": "friday",
        "Суббота": "saturday"
    }
    async with state.proxy() as data:
        try:
            await message.answer(f'{data_lessons[data["choise_group"]][dict_[message.text]]}')
        except MessageTextIsEmpty:
            await message.answer("В словаре нет текта")

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

</code>


Как с помощью inline кнопок в telebot(pytelegrambotapi) вызывать обработчик команды?
И в идеале не давать пользователю перейти к определенным действиям, пока он не сделает другие?
<code>
@bot.callback_query_handler(func=lambda call: True)
def query_handler(call):
    # match call.data:
    #     case 1:
    #         bot.register_next_step_handler(call.message, register_user)
    print(call)

    if call.data == 1:
        bot.register_next_step_handler(call.message, register_user)
        return

    bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id)
</code>

Конкретизируйте ваш вопрос, ибо понять, что вы хотите, сложно, но вот вам как нужно делать инлайн кнопки и обрабатывать их.
<code>
from telebot import TeleBot, types
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton

import config

bot = TeleBot(config.BOT_TOKEN)

@bot.message_handler(commands=['start'])
def start(msg: types.Message):
    markup = InlineKeyboardMarkup()
    markup.add(InlineKeyboardButton("Кнопка 1", callback_data="but_1"))
    bot.send_message(chat_id=msg.chat.id, text="Жми кнопку", reply_markup=markup)

@bot.callback_query_handler(func=lambda call: call.data == "but_1")
def but1_pressed(call: types.CallbackQuery):
    bot.send_message(chat_id=call.message.chat.id, text="Вы нажали кнопку")

if __name__ == '__main__':
    bot.infinity_polling(skip_pending=True)

</code>


Помогите отследить словарь в Пайтоне
я учу пайтон и для опыта делаю свой небольшой проект. Суть проекта заключается запарсить json файл по ссылке и получить словарь, данный словарь каждый раз обновляется. И я хочу сохранять его в списке по типу [Словарь 1] -> [Словарь 2, Словарь 1] -> [Словарь 3, Словарь 2, Словарь 1] и так далее

from main import get_last_data
import time

data_list = []
while True:
    get_last_data()
    data_list.append((get_last_data()))

print(list((data_list)))
time.sleep(1)

У меня выводит:

   [{'92207140241': 2}]
   [{'92207140241': 2}, {'92207140241': 2}]
   [{'92207140241': 2}, {'92207140241': 2}, {'92207140241': 2}]

А должен:

   [{'92207140241': 2}]
   [{'92207140242': 4}, {'92207140241': 2}]
   [{'92207140243': 1}, {'92207140242': 4}, {'92207140241': 2}]

Чуток переписал код:

   from main import get_last_data
   import time

   data_list = ['start']

   while True:
   get_last_data()
   if get_last_data() != data_list[0]:
       data_list.insert(0, get_last_data())

   else:
      continue

   print(data_list)
   time.sleep(5)

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

Разобрался наконец:

data_list = []
last_number = int(*get_last_data().keys())

while True:
    if last_number == int(*get_last_data().keys()):
        data_list.insert(0, get_last_data())
        last_number = int(*get_last_data().keys()) + 1
    else:
        continue

    print(data_list)

Результат:

[{'92207150093': 4}]
[{'92207150094': 2}, {'92207150093': 4}]


Binance api python как автоматически размещать ордера на продажу лесенкой в паре с биткоином?
Я торгую в паре с биткоином и хочу через binance api python реализовать продажу токенов по лесенкой:
Цена покупки 0,00002750

Цель 1 (+10%) - 3025
Цель 2 (+20%) - 3300
Цель 3 (+30%) - 3575
Цель 4 (+40%) - 3850

Как конвертировать цели для продажи в такой формат 0,00003025 и тд. для размещения ордера?
<code>
# получаю цену монеты
b = prices
# делаю из 2.75e-06 это 2750 а точнее 275
c = re.sub(r"(?m)e.+$", "", str(b))
price_round = c.replace('.', '')

# и получаю такие цели 302 330 358 385
numer = str(round(int(price_round) * 10 / 100 + int(price_round)))
numer_2 = str(round(int(price_round) * 20 / 100 + int(price_round)))
numer_3 = str(round(int(price_round) * 30 / 100 + int(price_round)))
numer_4 = str(round(int(price_round) * 40 / 100 + int(price_round)))
</code>

Просто поделите свою цену на 100000000 или 10 ** 8 и все.


Сравнить или преобразовать два списка
Есть два списка. Подскажите пожалуйста, как сравнить (или преобразовать и сравнить) эти два списка и вывести элементы списка
list_1 которых нет в
list_2?
я прям новичок новичок, так что не ругайтесь сильно

list_1 = [[1, 7, 0], [1, 7, 0], [1, 7, 0], [3, 1, 7], [1, 7, 0], [1, 7, 0], [3, 1, 7], [3, 1, 7]] <class 'list'>

list_2 =[(2, 7, 0), (7, 2), (7, 1, 7), (1, 3, 7), (0, 7, 1), (7, 1, 3), (1, 7, 0), (3, 1, 7), (3, 2, 7)] <class 'list'>


Регулярное выражение вида "ZZ(произвольное количество любых символов)XX"
Мне нужно составить регулярное выражение вида:

'ZZ(тут произвольное количество любых символов)XX'

Нужно найти первое вхождение этого шаблона в текст, допустим:

'df q ZZtp ot03-#3 rer#RXX df;l,gm XXpo45ZZ dsfdfdscv'

В данном случае нужна вот эта подстрока
'ZZtp ot03-#3 rer#RXX'.
Регулярка типа:

re.findall(r'ZZ.+XX', 'df q ZZtp ot03-#3 rer#RXX df;l,gm XXpo45ZZ dsfdfdscv')

находит наибольшую подстроку
'ZZtp ot03-#3 rer#RXX df;l,gm XX', это мне не подходит.

Используйте нежадное выражение, т.е.
ZZ.+?XX
О жадности
Регулярные выражения по умолчанию "жадные", т.е. захватывают наибольшее возможное число символов.
Эта проблема была ещё со времён регулярных выражений POSIX.
Пример:
Регулярное выражение:
\".+\".
Текст:
Просто "что-то", но "в кавычках". А это - без них..
Тогда совпадение будет одно:
"что-то", но "в кавычках"
Если нам нужны все выражения в кавычках, это нам не подходит.
Как этого избежать
После операторов
+,
*,
? и
{} можно поставить
?, тогда жадность отключится.
Например, в том же тексте будут два совпадения:
"что-то" и
"в кавычках", если регулярное выражение будет:
\".+?\", т.е.:

Кавычка
Хотя бы один символ, но чем меньше, тем лучше.
Кавычка.

Ещё один метод
Т.к. мы знаем, что в выражении в кавычках их не может быть(кроме первой и последней), мы можем написать так:

\"[^"]+\".
Так мы обойдёмся без отключения жадности.


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

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

Запуск функции из основного файла в модуле

                                (1 ответ)

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

возможно ли вызвать ИЗ дочернего файла, функцию, которая находится В родительском файле?
parent.py:

import testfile

def test1():
    print('test1')
    testfile.test2()

def test3():
    print('test3')

test()

testfile.py

def test2():
    print('test2')
    test3() #эта функция находится в parent.py

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

import testfile

def test1():
    print('test1')
    testfile.test2(test3)

def test3():
    print('test3')

test1()

testfile.py

def test2(func):
    print('test2')
    func()

RESULT

test1 test2 test3


Python | Как сделать скрипт который сам в себя мог добавлять кодд, не удаляя прежний
а как можно сделать чтобы скрипт .py добавлял себе строки кода при этом не удаляя код, а перенося его ниже, к примеру:
<code>
есть строчка 219
я при помощи скрипта добавляю туда код, файл дополняет сам себя
при этом не удаляя, а данные находящиеся в этой строчке перенося ниже на определённое колличество строчек
</code>

читаете файл через
readlines, получаете список строк
выводите строки до нужной обратно в файл, используйте срез
[:n]
выводите в файл новые строки
выводите в файл строки из среза
[n:]


Пропуск итераций Python
У меня есть такая задача:
В первой строке вводится положительное число N, не превышающее 10000, определяющее количество входных данных. Во второй строке подается число M, по модулю не превышающее 1000000 (миллион). Далее в N строках вводится N целых чисел, по модулю не превышающих 1000000 (миллион). Необходимо найти количество чисел, больше М, при этом анализируя не все числа, а пропуская на каждом шаге на одно число больше. Таким образом нужно проверять числа со следующим порядковым номером: 1, (пропуск одного), 3, (пропуск двух) и т.д.
Я написал такой код:

with open('6.txt', 'r') as f:
    file = [line.strip('\n') for line in f.readlines()]

n, m = int(file[0]), int(file[1])
count = 0

for line in file[2:]:
    p = line.split()
    k = 0
    skip = 1
    for i in p:
        if k >= len(p):
            break
        if int(p[k]) > m:
            count += 1
        k += 1 + skip
        skip += 1
print(count)

Входные данные имеют такой вид:

6
32454
342343
453453
5645456
324233
666666
777777

Если бы все корректно работало, код вернул бы число 3, так как остальные числа он бы пропустил. Однако код возвращает число 6, то есть он не пропускает итерации, как должен. В чем моя ошибка?

with open('6.txt', 'r') as f:
    file = [line.strip('\n') for line in f.readlines()]

n, m = int(file[0]), int(file[1])
count = 0

i = 2
skip = 1
while i<len(file):
    if int(file[i])>m:
        count += 1
    i += skip
    skip += 1