Превратить данные в словарь Python [закрыт]

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

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

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

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

В процессе парсинга столкнулся вот с такими данными:
<code>
{'OPTIONS': {'table': {'CODE': 'table', 'SORT': '30', 'TITLE': 'Выберите стол', 'TITLE2': 'Без стола', 'ITEMS': {'0': {'ID': '310079', '~ID': '310079', 'IBLOCK_ID': '2', '~IBLOCK_ID': '2', 'NAME': 'Стол укороченный 80*54 см для машины A-8700', '~NAME': 'Стол укороченный 80*54 см для машины A-8700', 'XML_ID': '104614/0', '~XML_ID': '104614/0', 'DETAIL_PICTURE': {'width': 0, 'height': 0, 'size': None, 'SRC': '/upload/resize_cache/iblock/a8e/225_175_1/a8e733dac9fb5c89722140ed5d890dbc.jpg'}, '~DETAIL_PICTURE': '79772', 'DETAIL_PAGE_URL': '/catalog/stol-ukorochennyy-80-54-sm-dlya-mashiny-a-8700/', '~DETAIL_PAGE_URL': '/catalog/stol-ukorochennyy-80-54-sm-dlya-mashiny-a-8700/', 'PROPERTY_TYPE_COMPLECT_VALUE': 'стол', '~PROPERTY_TYPE_COMPLECT_VALUE': 'стол', 'PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', '~PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', 'PROPERTY_TYPE_COMPLECT_VALUE_ID': '17005679', '~PROPERTY_TYPE_COMPLECT_VALUE_ID': '17005679', 'PROPERTY_PRICE_TRANSIT_VALUE': None, '~PROPERTY_PRICE_TRANSIT_VALUE': None, 'PROPERTY_PRICE_TRANSIT_VALUE_ID': None, '~PROPERTY_PRICE_TRANSIT_VALUE_ID': None, 'PROPERTY_DIOH_VALUE': '30', '~PROPERTY_DIOH_VALUE': '30', 'PROPERTY_DIOH_VALUE_ID': '21174690', '~PROPERTY_DIOH_VALUE_ID': '21174690', 'LANG_DIR': '/', '~LANG_DIR': '/', 'CODE': 'stol-ukorochennyy-80-54-sm-dlya-mashiny-a-8700', '~CODE': 'stol-ukorochennyy-80-54-sm-dlya-mashiny-a-8700', 'EXTERNAL_ID': '104614/0', '~EXTERNAL_ID': '104614/0', 'IBLOCK_SECTION_ID': '2604', '~IBLOCK_SECTION_ID': '2604', 'IBLOCK_TYPE_ID': 'catalog', '~IBLOCK_TYPE_ID': 'catalog', 'IBLOCK_CODE': '', '~IBLOCK_CODE': '', 'IBLOCK_EXTERNAL_ID': '', '~IBLOCK_EXTERNAL_ID': '', 'LID': 's1', '~LID': 's1', 'QUANTITY': 12, 'QUANTITY_R': 1, 'PRICES': {'0': {'ID': '304603', 'PRODUCT_ID': '310079', 'PRICE': '62.00', 'CURRENCY': 'USD', 'CATALOG_GROUP_ID': '1'}}, 'AVAILABLE': 1, 'AVAILABLE_CLASS': 'in_stock', 'AVAILABLE_TITLE': 'в наличии', 'AVAILABLE_DIOH': '', 'PRICE_VALUE': 4574, 'PRICE_PRINT_VALUE': '4 574 Р', 'PRICE_DISCOUNT_VALUE': 4574, 'PRICE_PRINT_DISCOUNT_VALUE': '4 574 Р', 'PRICE_USD_DISCOUNT_VALUE': 62, 'PRICE_USD_PRINT_DISCOUNT_VALUE': '$62', 'BONUS_VALUE': None, 'BONUS_FORMATED': ''}, '1': {'ID': '310101', '~ID': '310101', 'IBLOCK_ID': '2', '~IBLOCK_ID': '2', 'NAME': 'Стол стандартный 120*54 см для машины A-8700', '~NAME': 'Стол стандартный 120*54 см для машины A-8700', 'XML_ID': '58508/0', '~XML_ID': '58508/0', 'DETAIL_PICTURE': {'width': 0, 'height': 0, 'size': None, 'SRC': '/upload/resize_cache/iblock/8a9/225_175_1/8a9291bd8e43d1e7659b947a73cf3725.jpg'}, '~DETAIL_PICTURE': '121976', 'DETAIL_PAGE_URL': '/catalog/stol-standartnyy-120-54-sm-dlya-mashiny-a-8700/', '~DETAIL_PAGE_URL': '/catalog/stol-standartnyy-120-54-sm-dlya-mashiny-a-8700/', 'PROPERTY_TYPE_COMPLECT_VALUE': 'стол', '~PROPERTY_TYPE_COMPLECT_VALUE': 'стол', 'PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', '~PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', 'PROPERTY_TYPE_COMPLECT_VALUE_ID': '17005747', '~PROPERTY_TYPE_COMPLECT_VALUE_ID': '17005747', 'PROPERTY_PRICE_TRANSIT_VALUE': None, '~PROPERTY_PRICE_TRANSIT_VALUE': None, 'PROPERTY_PRICE_TRANSIT_VALUE_ID': None, '~PROPERTY_PRICE_TRANSIT_VALUE_ID': None, 'PROPERTY_DIOH_VALUE': '0', '~PROPERTY_DIOH_VALUE': '0', 'PROPERTY_DIOH_VALUE_ID': '18461402', '~PROPERTY_DIOH_VALUE_ID': '18461402', 'LANG_DIR': '/', '~LANG_DIR': '/', 'CODE': 'stol-standartnyy-120-54-sm-dlya-mashiny-a-8700', '~CODE': 'stol-standartnyy-120-54-sm-dlya-mashiny-a-8700', 'EXTERNAL_ID': '58508/0', '~EXTERNAL_ID': '58508/0', 'IBLOCK_SECTION_ID': '2604', '~IBLOCK_SECTION_ID': '2604', 'IBLOCK_TYPE_ID': 'catalog', '~IBLOCK_TYPE_ID': 'catalog', 'IBLOCK_CODE': '', '~IBLOCK_CODE': '', 'IBLOCK_EXTERNAL_ID': '', '~IBLOCK_EXTERNAL_ID': '', 'LID': 's1', '~LID': 's1', 'QUANTITY': 2, 'QUANTITY_R': 0, 'PRICES': {'0': {'ID': '304604', 'PRODUCT_ID': '310101', 'PRICE': '62.00', 'CURRENCY': 'USD', 'CATALOG_GROUP_ID': '1'}}, 'AVAILABLE': 1, 'AVAILABLE_CLASS': 'in_stock', 'AVAILABLE_TITLE': 'в наличии', 'AVAILABLE_DIOH': '', 'PRICE_VALUE': 4574, 'PRICE_PRINT_VALUE': '4 574 Р', 'PRICE_DISCOUNT_VALUE': 4574, 'PRICE_PRINT_DISCOUNT_VALUE': '4 574 Р', 'PRICE_USD_DISCOUNT_VALUE': 62, 'PRICE_USD_PRINT_DISCOUNT_VALUE': '$62', 'BONUS_VALUE': None, 'BONUS_FORMATED': ''}, '3': {'ID': '538652', '~ID': '538652', 'IBLOCK_ID': '2', '~IBLOCK_ID': '2', 'NAME': 'Стол Aurora фирменный с вырезом под ремень для моделей А-8700/A-0302/A-0818', '~NAME': 'Стол Aurora фирменный с вырезом под ремень для моделей А-8700/A-0302/A-0818', 'XML_ID': '276376', '~XML_ID': '276376', 'DETAIL_PICTURE': None, '~DETAIL_PICTURE': None, 'DETAIL_PAGE_URL': '/catalog/stol-aurora-a-8700-a-0302-a-0818/', '~DETAIL_PAGE_URL': '/catalog/stol-aurora-a-8700-a-0302-a-0818/', 'PROPERTY_TYPE_COMPLECT_VALUE': 'стол', '~PROPERTY_TYPE_COMPLECT_VALUE': 'стол', 'PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', '~PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', 'PROPERTY_TYPE_COMPLECT_VALUE_ID': '16848683', '~PROPERTY_TYPE_COMPLECT_VALUE_ID': '16848683', 'PROPERTY_PRICE_TRANSIT_VALUE': '02/10/2021', '~PROPERTY_PRICE_TRANSIT_VALUE': '02/10/2021', 'PROPERTY_PRICE_TRANSIT_VALUE_ID': '21132669', '~PROPERTY_PRICE_TRANSIT_VALUE_ID': '21132669', 'PROPERTY_DIOH_VALUE': '113', '~PROPERTY_DIOH_VALUE': '113', 'PROPERTY_DIOH_VALUE_ID': '21186562', '~PROPERTY_DIOH_VALUE_ID': '21186562', 'LANG_DIR': '/', '~LANG_DIR': '/', 'CODE': 'stol-aurora-a-8700-a-0302-a-0818', '~CODE': 'stol-aurora-a-8700-a-0302-a-0818', 'EXTERNAL_ID': '276376', '~EXTERNAL_ID': '276376', 'IBLOCK_SECTION_ID': '2604', '~IBLOCK_SECTION_ID': '2604', 'IBLOCK_TYPE_ID': 'catalog', '~IBLOCK_TYPE_ID': 'catalog', 'IBLOCK_CODE': '', '~IBLOCK_CODE': '', 'IBLOCK_EXTERNAL_ID': '', '~IBLOCK_EXTERNAL_ID': '', 'LID': 's1', '~LID': 's1', 'QUANTITY': 651, 'QUANTITY_R': 115, 'PRICES': {'0': {'ID': '488624', 'PRODUCT_ID': '538652', 'PRICE': '62.00', 'CURRENCY': 'USD', 'CATALOG_GROUP_ID': '1'}}, 'AVAILABLE': 1, 'AVAILABLE_CLASS': 'in_stock', 'AVAILABLE_TITLE': 'в наличии', 'AVAILABLE_DIOH': '', 'PRICE_VALUE': 4574, 'PRICE_PRINT_VALUE': '4 574 Р', 'PRICE_DISCOUNT_VALUE': 4574, 'PRICE_PRINT_DISCOUNT_VALUE': '4 574 Р', 'PRICE_USD_DISCOUNT_VALUE': 62, 'PRICE_USD_PRINT_DISCOUNT_VALUE': '$62', 'BONUS_VALUE': None, 'BONUS_FORMATED': ''}, '2': {'ID': '400887', '~ID': '400887', 'IBLOCK_ID': '2', '~IBLOCK_ID': '2', 'NAME': 'Стол EURO1 для Juki DDL-8100/8700, DLN-5410, DU-1181', '~NAME': 'Стол EURO1 для Juki DDL-8100/8700, DLN-5410, DU-1181', 'XML_ID': '281969', '~XML_ID': '281969', 'DETAIL_PICTURE': {'width': 0, 'height': 0, 'size': None, 'SRC': '/upload/resize_cache/iblock/1cc/225_175_1/1cca5575d35210730f989c736263bf97.jpg'}, '~DETAIL_PICTURE': '124406', 'DETAIL_PAGE_URL': '/catalog/stol-euro1-dlya-juki-ddl-8100-8700/', '~DETAIL_PAGE_URL': '/catalog/stol-euro1-dlya-juki-ddl-8100-8700/', 'PROPERTY_TYPE_COMPLECT_VALUE': 'стол', '~PROPERTY_TYPE_COMPLECT_VALUE': 'стол', 'PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', '~PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', 'PROPERTY_TYPE_COMPLECT_VALUE_ID': '19751439', '~PROPERTY_TYPE_COMPLECT_VALUE_ID': '19751439', 'PROPERTY_PRICE_TRANSIT_VALUE': None, '~PROPERTY_PRICE_TRANSIT_VALUE': None, 'PROPERTY_PRICE_TRANSIT_VALUE_ID': None, '~PROPERTY_PRICE_TRANSIT_VALUE_ID': None, 'PROPERTY_DIOH_VALUE': '57', '~PROPERTY_DIOH_VALUE': '57', 'PROPERTY_DIOH_VALUE_ID': '21174884', '~PROPERTY_DIOH_VALUE_ID': '21174884', 'LANG_DIR': '/', '~LANG_DIR': '/', 'CODE': 'stol-euro1-dlya-juki-ddl-8100-8700', '~CODE': 'stol-euro1-dlya-juki-ddl-8100-8700', 'EXTERNAL_ID': '281969', '~EXTERNAL_ID': '281969', 'IBLOCK_SECTION_ID': '2604', '~IBLOCK_SECTION_ID': '2604', 'IBLOCK_TYPE_ID': 'catalog', '~IBLOCK_TYPE_ID': 'catalog', 'IBLOCK_CODE': '', '~IBLOCK_CODE': '', 'IBLOCK_EXTERNAL_ID': '', '~IBLOCK_EXTERNAL_ID': '', 'LID': 's1', '~LID': 's1', 'QUANTITY': 6, 'QUANTITY_R': 0, 'PRICES': {'0': {'ID': '305397', 'PRODUCT_ID': '400887', 'PRICE': '127.43', 'CURRENCY': 'USD', 'CATALOG_GROUP_ID': '1'}}, 'AVAILABLE': 1, 'AVAILABLE_CLASS': 'in_stock', 'AVAILABLE_TITLE': 'в наличии', 'AVAILABLE_DIOH': '', 'PRICE_VALUE': 9400, 'PRICE_PRINT_VALUE': '9 400 Р', 'PRICE_DISCOUNT_VALUE': 9400, 'PRICE_PRINT_DISCOUNT_VALUE': '9 400 Р', 'PRICE_USD_DISCOUNT_VALUE': 127.43, 'PRICE_USD_PRINT_DISCOUNT_VALUE': '$127.43', 'BONUS_VALUE': None, 'BONUS_FORMATED': ''}}}}, 'STATUS': 'OK'}
</code>
Перебрал несколько решений, но во всех получал ошибки (что-то про кавычки не те, ошибочные атрибуты и т.п.). Попытки исправить к успехам не привели.
Подскажите, пожалуйста, как это лучше распарсить с примером?
PS И еще вопрос: этот код - JSON?

data = {'OPTIONS': {'table': {'CODE': 'table', 'SORT': '30', 'TITLE': 'Выберите стол', 'TITLE2': 'Без стола', 'ITEMS': {'0': {'ID': '310079', '~ID': '310079', 'IBLOCK_ID': '2', '~IBLOCK_ID': '2', 'NAME': 'Стол укороченный 80*54 см для машины A-8700', '~NAME': 'Стол укороченный 80*54 см для машины A-8700', 'XML_ID': '104614/0', '~XML_ID': '104614/0', 'DETAIL_PICTURE': {'width': 0, 'height': 0, 'size': None, 'SRC': '/upload/resize_cache/iblock/a8e/225_175_1/a8e733dac9fb5c89722140ed5d890dbc.jpg'}, '~DETAIL_PICTURE': '79772', 'DETAIL_PAGE_URL': '/catalog/stol-ukorochennyy-80-54-sm-dlya-mashiny-a-8700/', '~DETAIL_PAGE_URL': '/catalog/stol-ukorochennyy-80-54-sm-dlya-mashiny-a-8700/', 'PROPERTY_TYPE_COMPLECT_VALUE': 'стол', '~PROPERTY_TYPE_COMPLECT_VALUE': 'стол', 'PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', '~PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', 'PROPERTY_TYPE_COMPLECT_VALUE_ID': '17005679', '~PROPERTY_TYPE_COMPLECT_VALUE_ID': '17005679', 'PROPERTY_PRICE_TRANSIT_VALUE': None, '~PROPERTY_PRICE_TRANSIT_VALUE': None, 'PROPERTY_PRICE_TRANSIT_VALUE_ID': None, '~PROPERTY_PRICE_TRANSIT_VALUE_ID': None, 'PROPERTY_DIOH_VALUE': '30', '~PROPERTY_DIOH_VALUE': '30', 'PROPERTY_DIOH_VALUE_ID': '21174690', '~PROPERTY_DIOH_VALUE_ID': '21174690', 'LANG_DIR': '/', '~LANG_DIR': '/', 'CODE': 'stol-ukorochennyy-80-54-sm-dlya-mashiny-a-8700', '~CODE': 'stol-ukorochennyy-80-54-sm-dlya-mashiny-a-8700', 'EXTERNAL_ID': '104614/0', '~EXTERNAL_ID': '104614/0', 'IBLOCK_SECTION_ID': '2604', '~IBLOCK_SECTION_ID': '2604', 'IBLOCK_TYPE_ID': 'catalog', '~IBLOCK_TYPE_ID': 'catalog', 'IBLOCK_CODE': '', '~IBLOCK_CODE': '', 'IBLOCK_EXTERNAL_ID': '', '~IBLOCK_EXTERNAL_ID': '', 'LID': 's1', '~LID': 's1', 'QUANTITY': 12, 'QUANTITY_R': 1, 'PRICES': {'0': {'ID': '304603', 'PRODUCT_ID': '310079', 'PRICE': '62.00', 'CURRENCY': 'USD', 'CATALOG_GROUP_ID': '1'}}, 'AVAILABLE': 1, 'AVAILABLE_CLASS': 'in_stock', 'AVAILABLE_TITLE': 'в наличии', 'AVAILABLE_DIOH': '', 'PRICE_VALUE': 4574, 'PRICE_PRINT_VALUE': '4 574 Р', 'PRICE_DISCOUNT_VALUE': 4574, 'PRICE_PRINT_DISCOUNT_VALUE': '4 574 Р', 'PRICE_USD_DISCOUNT_VALUE': 62, 'PRICE_USD_PRINT_DISCOUNT_VALUE': '$62', 'BONUS_VALUE': None, 'BONUS_FORMATED': ''}, '1': {'ID': '310101', '~ID': '310101', 'IBLOCK_ID': '2', '~IBLOCK_ID': '2', 'NAME': 'Стол стандартный 120*54 см для машины A-8700', '~NAME': 'Стол стандартный 120*54 см для машины A-8700', 'XML_ID': '58508/0', '~XML_ID': '58508/0', 'DETAIL_PICTURE': {'width': 0, 'height': 0, 'size': None, 'SRC': '/upload/resize_cache/iblock/8a9/225_175_1/8a9291bd8e43d1e7659b947a73cf3725.jpg'}, '~DETAIL_PICTURE': '121976', 'DETAIL_PAGE_URL': '/catalog/stol-standartnyy-120-54-sm-dlya-mashiny-a-8700/', '~DETAIL_PAGE_URL': '/catalog/stol-standartnyy-120-54-sm-dlya-mashiny-a-8700/', 'PROPERTY_TYPE_COMPLECT_VALUE': 'стол', '~PROPERTY_TYPE_COMPLECT_VALUE': 'стол', 'PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', '~PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', 'PROPERTY_TYPE_COMPLECT_VALUE_ID': '17005747', '~PROPERTY_TYPE_COMPLECT_VALUE_ID': '17005747', 'PROPERTY_PRICE_TRANSIT_VALUE': None, '~PROPERTY_PRICE_TRANSIT_VALUE': None, 'PROPERTY_PRICE_TRANSIT_VALUE_ID': None, '~PROPERTY_PRICE_TRANSIT_VALUE_ID': None, 'PROPERTY_DIOH_VALUE': '0', '~PROPERTY_DIOH_VALUE': '0', 'PROPERTY_DIOH_VALUE_ID': '18461402', '~PROPERTY_DIOH_VALUE_ID': '18461402', 'LANG_DIR': '/', '~LANG_DIR': '/', 'CODE': 'stol-standartnyy-120-54-sm-dlya-mashiny-a-8700', '~CODE': 'stol-standartnyy-120-54-sm-dlya-mashiny-a-8700', 'EXTERNAL_ID': '58508/0', '~EXTERNAL_ID': '58508/0', 'IBLOCK_SECTION_ID': '2604', '~IBLOCK_SECTION_ID': '2604', 'IBLOCK_TYPE_ID': 'catalog', '~IBLOCK_TYPE_ID': 'catalog', 'IBLOCK_CODE': '', '~IBLOCK_CODE': '', 'IBLOCK_EXTERNAL_ID': '', '~IBLOCK_EXTERNAL_ID': '', 'LID': 's1', '~LID': 's1', 'QUANTITY': 2, 'QUANTITY_R': 0, 'PRICES': {'0': {'ID': '304604', 'PRODUCT_ID': '310101', 'PRICE': '62.00', 'CURRENCY': 'USD', 'CATALOG_GROUP_ID': '1'}}, 'AVAILABLE': 1, 'AVAILABLE_CLASS': 'in_stock', 'AVAILABLE_TITLE': 'в наличии', 'AVAILABLE_DIOH': '', 'PRICE_VALUE': 4574, 'PRICE_PRINT_VALUE': '4 574 Р', 'PRICE_DISCOUNT_VALUE': 4574, 'PRICE_PRINT_DISCOUNT_VALUE': '4 574 Р', 'PRICE_USD_DISCOUNT_VALUE': 62, 'PRICE_USD_PRINT_DISCOUNT_VALUE': '$62', 'BONUS_VALUE': None, 'BONUS_FORMATED': ''}, '3': {'ID': '538652', '~ID': '538652', 'IBLOCK_ID': '2', '~IBLOCK_ID': '2', 'NAME': 'Стол Aurora фирменный с вырезом под ремень для моделей А-8700/A-0302/A-0818', '~NAME': 'Стол Aurora фирменный с вырезом под ремень для моделей А-8700/A-0302/A-0818', 'XML_ID': '276376', '~XML_ID': '276376', 'DETAIL_PICTURE': None, '~DETAIL_PICTURE': None, 'DETAIL_PAGE_URL': '/catalog/stol-aurora-a-8700-a-0302-a-0818/', '~DETAIL_PAGE_URL': '/catalog/stol-aurora-a-8700-a-0302-a-0818/', 'PROPERTY_TYPE_COMPLECT_VALUE': 'стол', '~PROPERTY_TYPE_COMPLECT_VALUE': 'стол', 'PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', '~PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', 'PROPERTY_TYPE_COMPLECT_VALUE_ID': '16848683', '~PROPERTY_TYPE_COMPLECT_VALUE_ID': '16848683', 'PROPERTY_PRICE_TRANSIT_VALUE': '02/10/2021', '~PROPERTY_PRICE_TRANSIT_VALUE': '02/10/2021', 'PROPERTY_PRICE_TRANSIT_VALUE_ID': '21132669', '~PROPERTY_PRICE_TRANSIT_VALUE_ID': '21132669', 'PROPERTY_DIOH_VALUE': '113', '~PROPERTY_DIOH_VALUE': '113', 'PROPERTY_DIOH_VALUE_ID': '21186562', '~PROPERTY_DIOH_VALUE_ID': '21186562', 'LANG_DIR': '/', '~LANG_DIR': '/', 'CODE': 'stol-aurora-a-8700-a-0302-a-0818', '~CODE': 'stol-aurora-a-8700-a-0302-a-0818', 'EXTERNAL_ID': '276376', '~EXTERNAL_ID': '276376', 'IBLOCK_SECTION_ID': '2604', '~IBLOCK_SECTION_ID': '2604', 'IBLOCK_TYPE_ID': 'catalog', '~IBLOCK_TYPE_ID': 'catalog', 'IBLOCK_CODE': '', '~IBLOCK_CODE': '', 'IBLOCK_EXTERNAL_ID': '', '~IBLOCK_EXTERNAL_ID': '', 'LID': 's1', '~LID': 's1', 'QUANTITY': 651, 'QUANTITY_R': 115, 'PRICES': {'0': {'ID': '488624', 'PRODUCT_ID': '538652', 'PRICE': '62.00', 'CURRENCY': 'USD', 'CATALOG_GROUP_ID': '1'}}, 'AVAILABLE': 1, 'AVAILABLE_CLASS': 'in_stock', 'AVAILABLE_TITLE': 'в наличии', 'AVAILABLE_DIOH': '', 'PRICE_VALUE': 4574, 'PRICE_PRINT_VALUE': '4 574 Р', 'PRICE_DISCOUNT_VALUE': 4574, 'PRICE_PRINT_DISCOUNT_VALUE': '4 574 Р', 'PRICE_USD_DISCOUNT_VALUE': 62, 'PRICE_USD_PRINT_DISCOUNT_VALUE': '$62', 'BONUS_VALUE': None, 'BONUS_FORMATED': ''}, '2': {'ID': '400887', '~ID': '400887', 'IBLOCK_ID': '2', '~IBLOCK_ID': '2', 'NAME': 'Стол EURO1 для Juki DDL-8100/8700, DLN-5410, DU-1181', '~NAME': 'Стол EURO1 для Juki DDL-8100/8700, DLN-5410, DU-1181', 'XML_ID': '281969', '~XML_ID': '281969', 'DETAIL_PICTURE': {'width': 0, 'height': 0, 'size': None, 'SRC': '/upload/resize_cache/iblock/1cc/225_175_1/1cca5575d35210730f989c736263bf97.jpg'}, '~DETAIL_PICTURE': '124406', 'DETAIL_PAGE_URL': '/catalog/stol-euro1-dlya-juki-ddl-8100-8700/', '~DETAIL_PAGE_URL': '/catalog/stol-euro1-dlya-juki-ddl-8100-8700/', 'PROPERTY_TYPE_COMPLECT_VALUE': 'стол', '~PROPERTY_TYPE_COMPLECT_VALUE': 'стол', 'PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', '~PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', 'PROPERTY_TYPE_COMPLECT_VALUE_ID': '19751439', '~PROPERTY_TYPE_COMPLECT_VALUE_ID': '19751439', 'PROPERTY_PRICE_TRANSIT_VALUE': None, '~PROPERTY_PRICE_TRANSIT_VALUE': None, 'PROPERTY_PRICE_TRANSIT_VALUE_ID': None, '~PROPERTY_PRICE_TRANSIT_VALUE_ID': None, 'PROPERTY_DIOH_VALUE': '57', '~PROPERTY_DIOH_VALUE': '57', 'PROPERTY_DIOH_VALUE_ID': '21174884', '~PROPERTY_DIOH_VALUE_ID': '21174884', 'LANG_DIR': '/', '~LANG_DIR': '/', 'CODE': 'stol-euro1-dlya-juki-ddl-8100-8700', '~CODE': 'stol-euro1-dlya-juki-ddl-8100-8700', 'EXTERNAL_ID': '281969', '~EXTERNAL_ID': '281969', 'IBLOCK_SECTION_ID': '2604', '~IBLOCK_SECTION_ID': '2604', 'IBLOCK_TYPE_ID': 'catalog', '~IBLOCK_TYPE_ID': 'catalog', 'IBLOCK_CODE': '', '~IBLOCK_CODE': '', 'IBLOCK_EXTERNAL_ID': '', '~IBLOCK_EXTERNAL_ID': '', 'LID': 's1', '~LID': 's1', 'QUANTITY': 6, 'QUANTITY_R': 0, 'PRICES': {'0': {'ID': '305397', 'PRODUCT_ID': '400887', 'PRICE': '127.43', 'CURRENCY': 'USD', 'CATALOG_GROUP_ID': '1'}}, 'AVAILABLE': 1, 'AVAILABLE_CLASS': 'in_stock', 'AVAILABLE_TITLE': 'в наличии', 'AVAILABLE_DIOH': '', 'PRICE_VALUE': 9400, 'PRICE_PRINT_VALUE': '9 400 Р', 'PRICE_DISCOUNT_VALUE': 9400, 'PRICE_PRINT_DISCOUNT_VALUE': '9 400 Р', 'PRICE_USD_DISCOUNT_VALUE': 127.43, 'PRICE_USD_PRINT_DISCOUNT_VALUE': '$127.43', 'BONUS_VALUE': None, 'BONUS_FORMATED': ''}}}}, 'STATUS': 'OK'}

тут готовый словарь:

>>> import pprint
>>> pprint.pprint(data, depth=4)

выведет:

{'OPTIONS': {'table': {'CODE': 'table',
                       'ITEMS': {'0': {...},
                                 '1': {...},
                                 '2': {...},
                                 '3': {...}},
                       'SORT': '30',
                       'TITLE': 'Выберите стол',
                       'TITLE2': 'Без стола'}},
 'STATUS': 'OK'}

вытащить содержимое по ключам:

>>> data['OPTIONS']['table']['ITEMS']['1']
{'ID': '310101', '~ID': '310101', 'IBLOCK_ID': '2', '~IBLOCK_ID': '2', 'NAME': 'Стол стандартный 120*54 см для машины A-8700', '~NAME': 'Стол стандартный 120*54 см для машины A-8700', 'XML_ID': '58508/0', '~XML_ID': '58508/0', 'DETAIL_PICTURE': {'width': 0, 'height': 0, 'size': None, 'SRC': '/upload/resize_cache/iblock/8a9/225_175_1/8a9291bd8e43d1e7659b947a73cf3725.jpg'}, '~DETAIL_PICTURE': '121976', 'DETAIL_PAGE_URL': '/catalog/stol-standartnyy-120-54-sm-dlya-mashiny-a-8700/', '~DETAIL_PAGE_URL': '/catalog/stol-standartnyy-120-54-sm-dlya-mashiny-a-8700/', 'PROPERTY_TYPE_COMPLECT_VALUE': 'стол', '~PROPERTY_TYPE_COMPLECT_VALUE': 'стол', 'PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', '~PROPERTY_TYPE_COMPLECT_ENUM_ID': '135', 'PROPERTY_TYPE_COMPLECT_VALUE_ID': '17005747', '~PROPERTY_TYPE_COMPLECT_VALUE_ID': '17005747', 'PROPERTY_PRICE_TRANSIT_VALUE': None, '~PROPERTY_PRICE_TRANSIT_VALUE': None, 'PROPERTY_PRICE_TRANSIT_VALUE_ID': None, '~PROPERTY_PRICE_TRANSIT_VALUE_ID': None, 'PROPERTY_DIOH_VALUE': '0', '~PROPERTY_DIOH_VALUE': '0', 'PROPERTY_DIOH_VALUE_ID': '18461402', '~PROPERTY_DIOH_VALUE_ID': '18461402', 'LANG_DIR': '/', '~LANG_DIR': '/', 'CODE': 'stol-standartnyy-120-54-sm-dlya-mashiny-a-8700', '~CODE': 'stol-standartnyy-120-54-sm-dlya-mashiny-a-8700', 'EXTERNAL_ID': '58508/0', '~EXTERNAL_ID': '58508/0', 'IBLOCK_SECTION_ID': '2604', '~IBLOCK_SECTION_ID': '2604', 'IBLOCK_TYPE_ID': 'catalog', '~IBLOCK_TYPE_ID': 'catalog', 'IBLOCK_CODE': '', '~IBLOCK_CODE': '', 'IBLOCK_EXTERNAL_ID': '', '~IBLOCK_EXTERNAL_ID': '', 'LID': 's1', '~LID': 's1', 'QUANTITY': 2, 'QUANTITY_R': 0, 'PRICES': {'0': {'ID': '304604', 'PRODUCT_ID': '310101', 'PRICE': '62.00', 'CURRENCY': 'USD', 'CATALOG_GROUP_ID': '1'}}, 'AVAILABLE': 1, 'AVAILABLE_CLASS': 'in_stock', 'AVAILABLE_TITLE': 'в наличии', 'AVAILABLE_DIOH': '', 'PRICE_VALUE': 4574, 'PRICE_PRINT_VALUE': '4 574 Р', 'PRICE_DISCOUNT_VALUE': 4574, 'PRICE_PRINT_DISCOUNT_VALUE': '4 574 Р', 'PRICE_USD_DISCOUNT_VALUE': 62, 'PRICE_USD_PRINT_DISCOUNT_VALUE': '$62', 'BONUS_VALUE': None, 'BONUS_FORMATED': ''}


Узнать, какое число больше [закрыт]

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

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

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

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

Нужно ввести два числа и программа должна написать, какое из чисел больше:
<code>
a = int(input("Введите a : ")) # Вводим число a
b = int(input("Введите b : ")) # Вводим число b
c = not(a < b) # Переменная c показывает результат Trve или False
print(c) # Вывод c
    if c == True # На этом фрагменте кода возникает ошибка
    print("a больше, чем b")
        else:
        print("b больше, чем a" )
</code>
Не работает... Где я ошибся?

a = int(input("Введите a : ")) # Вводим число a
b = int(input("Введите b : ")) # Вводим число b

if a > b:
    print("a больше, чем b")
elif a < b:
    print("b больше, чем a")
else:
    print("a равно b")

Если через булевые:

c = a > b
if c:
    print("a больше, чем b")
else:
    print("a меньше или равно b")


Форматирование значений из sqlite таблицы в python (pytelegrambotapi)
Создаю телеграм бота на python с помощью pytelegrambotapi. Столкнулся с проблемой вывода. Ниже данные которые я получаю из базы данных. Соответственно вопрос в том как убрать лишние скобки, а именно [(' ... ',)].

id:[('320905252',)]
⛩[('imfamous',)]

Код вывода:

bot.send_message(message.chat.id, 'id:' + str(db.get_id(message.from_user.id)) + '\n⛩' +
                str(db.get_nickname(message.from_user.id)))

При этом если выводить только значение из базы данных (без текста в "" и '') то значение будет без скобок.
Пробовал такой формат, получаю такой же результат со скобками:

bot.send_message(message.chat.id, f"id {db.get_id(message.from_user.id)}")

Прикладываю SQL - запросы:

"""Получаем user_id"""
def get_id(self, user_id):
    with self.connection:
        return self.cursor.execute("SELECT `user_id` FROM `subscriptions` WHERE `user_id` = ?", (user_id,)).fetchone()

"""Получаем nickname"""
def get_nickname(self, nickname):
    with self.connection:
        return self.cursor.execute("SELECT `nickname` FROM `subscriptions` WHERE `user_id` = ?", (nickname,)).fetchone()

С решением данной проблемы помог gil9red!
Необходимо вызывать fetchone с возвращением одного значения -- ID.
Была ошибка в sql-запросе, ниже исправленный вариант:
<code>
"""Получаем user_id"""
def get_id(self, user_id):
    with self.connection:
        return self.cursor.execute("SELECT `user_id` FROM `subscriptions` WHERE `user_id` = ?", (user_id,)).fetchone()[0]
</code>


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

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

import tkinter as tk

root = tk.Tk()

tk.Button(root, text="Button").pack(padx=10, pady=10, expand=1, fill=tk.BOTH)

root.mainloop()

Кнопка будет подстраиваться под размер окна, при этом будет постоянный отступ от границ окна 10 пикселей.
Аналогично с помощью
grid:

import tkinter as tk

root = tk.Tk()

tk.Button(root, text="Button").grid(row=0, column=0, padx=10, pady=10, sticky=tk.NSEW)
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

root.mainloop()

Для колонки и строки, где размещен код устанавливается вес больше 0, из-за этого соответствующие колонки и строки расширяются до размера контейнера. Значение веса влияет на то, как будет растягиваться колонка или строка - чем больше вес, тем сильнее. Код немного сложнее, но настройки "веса" будет влиять на все виджеты, размещенные внутри соответствующих колонок и строк.
Теперь все то же самое, только через привязку к событию изменения размера окна и ручного размещения с помощью
place:

import tkinter as tk

root = tk.Tk()

def config(event):
    if event.widget == root:
        button.place(x=10, y=10, width=event.width-20, height=event.height-20)

root.bind("<Configure>", config)

button = tk.Button(root, text="Button")

root.mainloop()


Помогите решить задачу проверки угрозы королю на шахматной доске

На шахматной доске находятся король и несколько ферзей другого цвета.
Проверить находится ли король под угрозой и если да, кто ему угрожает.
Положение фигур задано массивом K(8,8): 0-клетка пуста, 1-король,
2-ферзь. Ферзь бьет по горизонтали, вертикали, диагонали

Спустя какое-то время было много вариантов как это сделать и в итоге ни один не сработал.
В конечном результате получил это, но понял, что нужно описывать ход ферзя, а не позицию, но не знаю как. Еще был вариант через матрицы, но я с ними не особо хорошо лажу)
пробовал создавать кортежи, списки, но...
<code>
king_x = (input("x: "))
king_y = (input("y: "))
queen1_x = (input("x: "))
queen1_y = (input("y: "))
queen2_x = (input("x: "))
queen2_y = (input("y: "))

if king_x == queen1_x and king_y == queen1_y:
    print("First queen take damage for king")
else:
    print("loxushka")
if king_x == queen2_x and king_y == queen2_y:
    print("Second queen take damage for king")
else:
    print("loxushka")
</code>

Алгоритм следующий: Задаем расположение короля, ферзей. Потом проверяем, находится ли король на общих вертикалях, горизонталях, диагоналях с ферзями. Если король под ударом, то выведутся координаты ферзей которые это делают.
Примерно так:
<code>
def point():
    return int(input("x: ")), int(input("y: "))

print("King")
king = point()

queens = []
for i in range(1,3):
    print("Queen" + str(i))
    queens.append(point())

*res, = filter(lambda p: p[0] == king[0], queens) # вертикаль
print(res)

*res, = filter(lambda p: p[1] == king[1], queens) # горизонталь
print(res)

*res, = filter(lambda p: (p[1] - p[0]) == (king[1] - king[0]), queens) # диагональ 1
print(res)

*res, = filter(lambda p: (king[0] + king[1]) == (p[0] + p[1]), queens) # диагональ 2
print(res)
</code>
Для 3D-шахмат будет немного отличаться.


Как изменить шаблон в зависимости от группы пользователя?
На мой сайт на Django необходимо добавить ссылку, которая будет появляться только если пользователь состоит в определённой группе. Я попробовал написать решение, но оно вызывает кучу ошибок
Если пользователю разрешено добавлять курсы, то обрабатывается шаблон button_for_teacher. А сам этот шаблон вставлен в base.html в теге include

def is_instructor(request, username):
    user = User.objects.get(username=username)
    if user.has_perm('course.can_add_course'):
        return render(request, 'courses/course/button_for_teacher.html')

button_for_teacher.html

{% extends "base.html" %}
{% block title %}
{% endblock %}
{% block content %}
<a href="{% url "manage_course_list" %}">Your courses</a>
{% endblock %}

base.html

{% include "courses/course/button_for_teacher.html" %}

View, отображающий список курсов для всех, на странице со списком и должна быть ссылка

class CourseListView(TemplateResponseMixin, View):
    model = Course
    template_name = 'courses/course/list.html'

    def get(self, request, subject=None):
        subjects = Subject.objects.annotate(total_courses=Count('courses'))
        courses = Course.objects.annotate(total_modules=Count('modules'))
        if subject:
            subject = get_object_or_404(Subject, slug=subject)
            courses = courses.filter(subject=subject)
        return self.render_to_response({'subjects':subjects,
            'subject':subject,
            'courses':courses})

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

# в файле courses/course/list.html добавьте в нужном месте
{% if user_can_manage_list %}
    <a href="{% url "manage_course_list" %}">Your courses</a>
{% endif %}

Во view:

def is_instructor(request):
   return request.user.has_perm('course.can_add_course')

class CourseListView(...):
....
  def get(self, request, subject=None):
    ...
    return self.render_to_response({'subjects':subjects,
            'subject':subject,
            'courses':courses,
            'user_can_manage_list': is_instructor(request.user)
    })


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

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

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

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

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

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

import telebot
from PIL import Image
import io

TOKEN = 'TOKEN'

bot = telebot.TeleBot(TOKEN)

def bright(source_img, brightness):
    source = Image.open(io.BytesIO(source_img))
    result = Image.new('RGB', source.size)
    for x in range(source.size[0]):
        for y in range(source.size[1]):
            r, g, b = source.getpixel((x, y))

            red = int(r * brightness)
            red = min(255, max(0, red))

            green = int(g * brightness)
            green = min(255, max(0, green))

            blue = int(b * brightness)
            blue = min(255, max(0, blue))

            result.putpixel((x, y), (red, green, blue))
    return result

@bot.message_handler(content_types=['photo'])
def give_photo(msg):
    file = bot.get_file(msg.photo[-1].file_id)
    downloaded_file = bot.download_file(file.file_path)
    new = bright(downloaded_file, 0.5)
    bot.send_photo(msg.chat.id, new)

bot.polling()

Это как пример. По ссылке вы можете взять готовые фильтры либо же изучив
Pillow написать свои.


Удаление значения, если есть вхождение в list
Есть список:

listt = ['testzxc','someqwe','thisert']
key = 'test'

Надо удалить значение в list, если есть вхождение по key.
Можно сделать, например, через filter или lambda?
Вот мое решение, обычное:

listt = ['testzxc', 'someqwe', 'thisert']
new_listt = []
key = 'test'
for item in listt:
    if key in item:
        next
    new_listt.append(item)
print(new_listt)

PS Хочу сделать это через
while или
for, но есть ли магия python, какое-то изящное решение?

Можно и с
filter, и с
lambda:

key = 'test'
my_list = ['testzxc', 'someqwe', 'thisert']

new_list = list(filter(lambda i: key not in i , my_list))

>>> new_list
['someqwe', 'thisert']

но старый добрый list comprehension все же понятнее, как по-мне:

new_list = [i for i in my_list if key not in i]


Cравнение элементов списка с соседними элементами Python
не как не могу решить задачу есть сгенерированный список.

from itertools import product
from  more_itertools import unique_everseen

a = [1,2,3,4,5]
b = [11,12,13,14,15]
c = [21,22,23,24,25]
d = [31,32,33,34,35]
e = [41,42,43,44,45]

f = [45,44,43,42,41]

result = []
for subset in product(a, b, c, d, e, f):
  x = list(unique_everseen(subset))
  if len(x) == 6:
     result.append(x)

for i in result:
    print(i)

Сейчас список выглядит так, тобишь повторяет 3 и более цифры в одной комбинации....

[1, 11, 21, 31, 41, 45]
[1, 11, 21, 31, 41, 44]
[1, 11, 21, 31, 41, 43]
[1, 11, 21, 31, 41, 42]
[1, 11, 21, 31, 42, 45]
[1, 11, 21, 31, 42, 44]
......
..........
[5, 15, 25, 35, 45, 44]
[5, 15, 25, 35, 45, 43]
[5, 15, 25, 35, 45, 42]
[5, 15, 25, 35, 45, 41]
12500 комбинаций.

Суть задачи такая чтобы из уже имеющего списка (result) получить совершено разные комбинации и при условии что в каждой комбинации не будет повторяться 3 одинаковые цифры , также порядок списка должен остаться прежним..... Я думаю нужно каким то образом отсортировать полученные данные а вот как это сделать не могу придумать
Я хочу получить примерно такой результат:

[1, 11, 21, 31, 41, 45]    [1, 11, 21, 31, 41, 45]
[2, 12, 22, 32, 41, 44]    [2, 11, 21, 32, 41, 44]
[3, 13, 23, 33, 41, 43]    [3, 11, 23, 33, 41, 43]
[4, 14, 24, 34, 41, 42]    [4, 14, 21, 31, 41, 42]
[5, 15, 25, 35, 42, 45]    [5, 11, 21, 35, 42, 45]
[6, 16, 26, 36, 42, 44]    [6, 12, 21, 32, 42, 44]

Что если таким образом:
<code>
from itertools import product

m = [[*range(1+i*10,1+i*10+5)] for i in range(5)]
m.append([*range(45,40,-1)])

*result, = product(*m)
len_m = len(m) * len(m) * len(m) + 1

for b in range(len_m):
    for i in result[b::len_m]:
        print(i)
</code>


Можно ли как-то сделать чтобы весь текст в cmd выводился на одном уровне? [дубликат]

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

Мне нужно, используя язык python, вывести в одну строчку цифры, чтобы по итогу получилось так: 0 1 2 [закрыт]

                                (2 ответа)

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

Здраствуйте, у меня есть проблем.
Мне надо вывести огромные в cmd типа этого:

░░███╗░░
░████║░░
██╔██║░░
╚═╝██║░░
███████╗
╚══════╝

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

░░███╗░  ░██████╗░
░████║░ ░╚════██╗
██╔██║░ ░░░███╔═╝
╚═╝██║░ ░██╔══╝░░
███████╗ ███████╗
╚══════╝ ╚══════╝

Но как это сделать? Стандартные команды не помогают и вообще возможно ли это?
Кстати вот сам массив:

NUMBERS = [
"""
░█████╗░
██╔══██╗
██║░░██║
██║░░██║
╚█████╔╝
░╚════╝░""",
"""
░░███╗░░
░████║░░
██╔██║░░
╚═╝██║░░
███████╗
╚══════╝""",
"""
██████╗░
╚════██╗
░░███╔═╝
██╔══╝░░
███████╗
╚══════╝""",
"""
██████╗░
╚════██╗
░█████╔╝
░╚═══██╗
██████╔╝
╚═════╝░""",
"""
░░██╗██╗
░██╔╝██║
██╔╝░██║
███████║
╚════██║
░░░░░╚═╝""",
"""
███████╗
██╔════╝
██████╗░
╚════██╗
██████╔╝
╚═════╝░""",
"""
░█████╗░
██╔═══╝░
██████╗░
██╔══██╗
╚█████╔╝
░╚════╝░""",
"""
███████╗
╚════██║
░░░░██╔╝
░░░██╔╝░
░░██╔╝░░
░░╚═╝░░░""",
"""
░█████╗░
██╔══██╗
╚█████╔╝
██╔══██╗
╚█████╔╝
░╚════╝░""",
"""
░█████╗░
██╔══██╗
╚██████║
░╚═══██║
░█████╔╝
░╚════╝░"""]

Отличается от другого вопроса он тем что тут нельзя применить zip. Даже если сделать такие условия то это будет долго и не факт что будет работать.

Ну почему же
zip то нельзя:

for t in zip(*map(str.split, NUMBERS)):
    print(*t)

Вывод:

░█████╗░ ░░███╗░░ ██████╗░ ██████╗░ ░░██╗██╗ ███████╗ ░█████╗░ ███████╗ ░█████╗░ ░█████╗░
██╔══██╗ ░████║░░ ╚════██╗ ╚════██╗ ░██╔╝██║ ██╔════╝ ██╔═══╝░ ╚════██║ ██╔══██╗ ██╔══██╗
██║░░██║ ██╔██║░░ ░░███╔═╝ ░█████╔╝ ██╔╝░██║ ██████╗░ ██████╗░ ░░░░██╔╝ ╚█████╔╝ ╚██████║
██║░░██║ ╚═╝██║░░ ██╔══╝░░ ░╚═══██╗ ███████║ ╚════██╗ ██╔══██╗ ░░░██╔╝░ ██╔══██╗ ░╚═══██║
╚█████╔╝ ███████╗ ███████╗ ██████╔╝ ╚════██║ ██████╔╝ ╚█████╔╝ ░░██╔╝░░ ╚█████╔╝ ░█████╔╝
░╚════╝░ ╚══════╝ ╚══════╝ ╚═════╝░ ░░░░░╚═╝ ╚═════╝░ ░╚════╝░ ░░╚═╝░░░ ░╚════╝░ ░╚════╝░

Печать цифр на выбор, а не всего набора:

for t in zip(*map(str.split, [NUMBERS[int(i)] for i in "42"])):
    print(*t)

Вывод:

░░██╗██╗ ██████╗░
░██╔╝██║ ╚════██╗
██╔╝░██║ ░░███╔═╝
███████║ ██╔══╝░░
╚════██║ ███████╗
░░░░░╚═╝ ╚══════╝


как можно получить вложенный список из списка
ДД! Я только учу питон, задача состоит в том, чтобы для каждого города вывести возможную цепочку из городов(последняя буква первого слово - первая буква следующего)
Я написала код, который это считает, но он выводит цепочки в одномерный список, соединяя их.
Как этот список разбить на подсписки?

cities = ["Kyiv", "Rovno", "Volodumir", "Obolon" , "Nirov"]

def cityGame(cities, cur, result):
    for city in cities:
        if cur[-1] == city[0].lower():
            result.append(city)
            tmp = cities[:]
            tmp.remove(city)
            cityGame(tmp, city,result)

result = []
for city in cities:
    tmp = cities[:]
    tmp.remove(city)
    result.append(city)
    cityGame(tmp, city, result)
print(result)

Результат кода
 ['Kyiv', 'Volodumir', 'Rovno', 'Obolon', 'Nirov', 'Rovno', 'Obolon', 'Nirov', 'Volodumir'....., когда нужно
[['Kyiv', 'Volodumir', 'Rovno', 'Obolon', 'Nirov'],['Rovno', 'Obolon', 'Nirov', 'Volodumir']..]

Вот так:
<code>
result = []
for city in cities:
    tmp = cities[:]
    tmp.remove(city)
    # добавляем новый подсписок в список с результатом
    # и дальше пополняем уже его, в том числе через функцию
    chain = []
    chain.append(city)
    result.append(chain)
    cityGame(tmp, city, chain)
print(result)
</code>


Как записывать введенное сообщение пользователем в базу данных (pytelegrambotapi)
У меня есть код, который работает и переносит сообщение пользователя в базу данных, но не совсем тот что, нужен:

@bot.message_handler(commands=['name'])
def nickname(message):
        bot.send_message(message.chat.id, 'Введите имя')
        db.update_nickname(message.from_user.id, message.text)
        bot.send_message(message.chat.id, 'Имя успешно задано!')

SQL запрос выглядит следующим образом:

def update_nickname(self, user_id, nickname):
        with self.connection:
            return self.cursor.execute("UPDATE `subscriptions` SET `nickname` = ? WHERE `user_id` = ?", (nickname, user_id))

В моем примере он заносит в ячейку "nickname" базы данных значение '/name' так как handler вызван на данную команду. Как мне заносить туда значение которое пользователь введет с клавиатуры после сообщения "Введите имя".

для получения "аргумента" команды можно использовать split(maxsplit=1):

message.text.split(maxsplit=1)
[In]: /name тест
[Out]: ['name', 'тест']

message.text.split(maxsplit=1)[1]
>> тест

либо используйте bot.register_next_step_handler:

@bot.message_handler(commands=['name'])
def nickname(message):
     msg = bot.send_message(message.chat.id, 'Введите имя')
     bot.register_next_step_handler(msg, nickname_2)

def nickname_2(message):
     db.update_nickname(message.from_user.id, message.text)
     bot.send_message(message.chat.id, 'Имя успешно задано!')


Discord.py как выдавать роль по реакции

import discord
from discord.ext import commands
import asyncio
import datetime
from datetime import date

bot = commands.Bot(command_prefix='>')

@bot.event
async def on_ready():
    print('Logged in as')
    print(bot.user.name)
    print('------')

@bot.command()
async def ping(ctx):
    await ctx.send('pong')

@bot.command(pass_context=True)
@commands.has_permissions(administrator=True)
@bot.event
async def weekstart(ctx):
    global vc
    guild = ctx.message.guild
    user = ctx.author
    channels = ctx.message.channel
    await ctx.message.delete()
    emb = discord.Embed(title=f'Эвент "выходные": запущен',
                    description='Для того чтобы приянть учатие в нем используйте реакцию ниже',
                    colour=discord.Color.purple())
    ad = discord.Embed(title=f'Эвент "выходные": запущен',
                    description='Через 12 часов будет завершен сбор игроков',
                    colour=discord.Color.green())
    adnoend = discord.Embed(title=f'Эвент "выходные": сбор игроков завершен',
                    description='Сбор игроков завершён,игровой канал создан,для завершения эвента воспользуйтесь командой >weekstop',
                    colour=discord.Color.orange())
    message = await ctx.send(embed=emb)
    mes = await user.send(embed=ad)
    await message.add_reaction('✅')
    await asyncio.sleep(10) # 24 часов это 86400 секунд
    await message.clear_reaction('✅')
    vc = await guild.create_voice_channel("Event weekends", category= None, reason=None)
    await vc.set_permissions(ctx.guild.default_role, connect = False)#там где *role айди роли ставите
    await vc.set_permissions(ctx.guild.get_role(810872023436886026), connect = True)
    inv = await vc.create_invite(reason=None)
    noend = discord.Embed(title=f'Эвент "выходные": сбор игроков завершен',
                    description=f"Сбор игроков завершён,игровой канал создан {inv} ",
                    colour=discord.Color.orange())
    ev = await ctx.send(embed=noend)
    ev1 = await user.send(embed=adnoend)

@bot.command(pass_context=True)
@commands.has_permissions(administrator=True)
@bot.event
async def weekstop(ctx):
    global vc
    channel = ctx.message.channel
    today = date.today()
    user = ctx.author
    guild = ctx.message.guild
    await ctx.message.delete()
    end = discord.Embed(title=f'Эвент "выходные": завершён',
                    description='Всем спасибо за участие!Канал будет полностью очищен через 5 секунд!',
                    colour=discord.Color.red())
    en = await ctx.send(embed=end)
    await asyncio.sleep(5)
    await channel.purge(limit=100)
    await vc.delete()
    await asyncio.sleep(3)
    dataevent = discord.Embed(title=f'Последний эвент был:',
                    description= f"{today}",
                    colour=discord.Color.orange())
    ev = await ctx.send(embed=dataevent)
    adend = discord.Embed(title=f'Эвент "выходные": завершён',
                    description='Эвент был успешно завершен!',
                    colour=discord.Color.red())
    anss = await user.send(embed=adend)

bot.run('token)

Как выдать поль пользователю при добавлении реакции по сообщением
сообщение отправляется командой
>weekstart и автоматически добавляет реакцию под сообщение

На просторах интернета вы можете найти разные реализации.Вот ЗДЕСЬ наглядно можно посмотреть на примеры действий с ролями без "лишнего".


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

      for strings in file:
          temp = reg_file.drop(np.where(reg_file['section'] != "Основные элементы")[0])
          for index, row in temp.iterrows():
              t1 = t1 + len(re.findall(row.loc['regex'], strings))
          temp = reg_file.drop(np.where(reg_file['section'] != "Элементы2")[0])
          for index, row in temp.iterrows():
              t2 = t2 + len(re.findall(row.loc['regex'], strings))

Т.е. беру пандами из файла нужный комплект регулярок (всего их 4) и считаю количество вхождений через
findall в каждой строке текста на каждый regexp. Учитывая, что и регэкспов много (около 10 каждого типа), если это работало на мелком тексте, то для большого время обработки неприемлемо большое. Как можно это выполнить быстрее?

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

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

re.findall компилирует регулярные выражения снова и снова. Тоже можно вынести из цикла.

Функция
get_regexes извлекает из датафрейма регулярные выражения и компилирует их. Функция
count_regexes применяет выражения к строкам:

def get_regexes(reg_file, section):
    return tuple(map(re.compile, reg_file[reg_file['section'] == section]['regex']))

def count_regexes(str_file, reg_file):
    regexes1 = get_regexes(reg_file, 'Основные элементы')
    regexes2 = get_regexes(reg_file, 'Элементы2')
    t1 = 0
    t2 = 0
    for s in str_file:
        t1 += sum(len(e.findall(s)) for e in regexes1)
        t2 += sum(len(e.findall(s)) for e in regexes2)
    return t1, t2

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

# поиск по отдельным фрагментам найдёт два вхождения:
re.findall('ab', 'aba') # одно
re.findall('ba', 'aba') # ещё одно

# поиск по общему выражению найдёт только одно вхождение:
re.findall('ab|ba', 'aba') # только одно

Если это не проблема, то ниже вариант с общим регулярным выражением.
get_compound_regex собирает регулярки в единое выражение и компилирует его.
count_regexes теперь содержит на один цикл меньше:

def get_compound_regex(reg_file, section):
    return re.compile('|'.join(
        '(?:{})'.format(e) for e in reg_file[reg_file['section'] == section]['regex']
    ))

def count_regexes(str_file, reg_file):
    e1 = get_compound_regex(reg_file, 'Основные элементы')
    e2 = get_compound_regex(reg_file, 'Элементы2')
    t1 = 0
    t2 = 0
    for s in str_file:
        t1 += len(e1.findall(s))
        t2 += len(e2.findall(s))
    return t1, t2

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

def count_regexes(str_file, reg_file):
    text = '\n'.join(str_file)
    e1 = get_compound_regex(reg_file, 'Основные элементы')
    e2 = get_compound_regex(reg_file, 'Элементы2')
    t1 = len(e1.findall(text))
    t2 = len(e2.findall(text))
    return t1, t2


Как получить значения словаря
я новичок в python. у меня есть словарь полученный из json:

        result = [
                  {
                    "a": 111,
                    "b": 222,
                    "c": {
                           "a": 1111,
                           "b": "2222",
                           "c": "3333"
                          }
                  }
                 ]

как сделать чтобы выводилось только значения третей переменой ("c":{....}) словаря, помогите плиз.
Вот что я попытался сделать но это не то.

for row in result:
    for elem in row:
        print(elem, end = ' ')
    print()


Допустим, есть датафрейм:

df:
    1   2   3   4   5   6   7   8   9  10  11  12
0   1   1   1   1   1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1   1   1   1   1   2
2   1   1   1   1   1   1   1   1   1   1   1   3
3   1   1   1   1   1   1   1   1   1   1   1   4
4   1   1   1   1   1   1   1   1   1   1   1   5
5  10  11  11  11  12  12  12  12  12  12  12  12

тогда:

res = df.apply(lambda x: x.unique().tolist(), axis=1)

res, соответственно, будет:

0             [1]
1          [1, 2]
2          [1, 3]
3          [1, 4]
4          [1, 5]
5    [10, 11, 12]

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

res = df.apply(lambda x: " ".join(x.unique().astype("str").tolist()), axis=1)

тогда res будет:

0           1
1         1 2
2         1 3
3         1 4
4         1 5
5    10 11 12

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


Разделение большого файла на несколько частей с помощью Python
Есть задача, нужно разделить файл на несколько частей, а потом собрать его. Думал решить через преобразования любого файла в ТХТ и вытаскивать по несколько тысяч строк, но выглядит как костыль. Файлы размером от 1Мб до 15Гб. Отдельную Библиотеку писать на С# к сожалению не умею, пытаюсь выкрутиться тем что есть. Заранее спасибо!!!
<code>

import os
import shutil
def split_file():
    splitLen= 500
    outputBase = 'E:/codes/piligrim/rezka/data'
    fil='E:/codes/piligrim/qwe.jpeg'
    input = open(fil,'rb').read().split(b'\x11',maxsplit=-1)
    i=100
    for lines in range (0,len(input),splitLen):
        outputData = input[lines:lines+splitLen]
        output=open(outputBase+str(i)+'.txt','wb')
        print(outputData)
        if i==100:
            output.write(b'\x11'.join(outputData))
            output.close()
        else:
            output.write(b'\x11'+b'\x11'.join(outputData))
            output.close()
        i+=1
    print("операция разделение файла прошла успешна")
def merge_file():
    with open('E:/codes/piligrim/gote/qwe2.txt' , 'wb') as fdst:
        sourscepath = 'E:/codes/piligrim/rezka/'
        for subdir,dirs,files in os.walk(sourscepath):
            sorted(files)
            print(files)
            for file in files:
                filename = sourscepath+file
                with open(filename,'rb') as fsrc:
                    shutil.copyfileobj(fsrc,fdst,1024*1024*10)
    print("операция слияния файла прошла успешно")

if __name__=="__main__":
    split_file()
    merge_file()
</code>

И так, у меня получилось) вот код который делает деление файла по ОПРЕДЕЛЕННОМУ БАЙТУ, я взял
\x11 не знаю что он означает, но мне это не нужно главное программа работает. Внимание если пробуете с большими файлами то нужно увеличить количество строк в
splitLen иначе получите тысячи файлов. В принципе если вам нужны эти тысячи файлов, то все нормально, но программа потратит больше времени на открытие каждого. напомню что нужно поменять расширение в готовом файле на исходное.

import shutil
def split_file():
    splitLen= 500
    outputBase = 'E:/codes/piligrim/rezka/data'
    fil='E:/codes/piligrim/qwe.jpeg'
    input = open(fil,'rb').read().split(b'\x11',maxsplit=-1)
    i=100
    for lines in range (0,len(input),splitLen):
        outputData = input[lines:lines+splitLen]
        output=open(outputBase+str(i)+'.txt','wb')
        if i==100:
            output.write(b'\x11'.join(outputData))
            output.close()
        else:
            output.write(b'\x11'+b'\x11'.join(outputData))
            output.close()
        i+=1
    print("операция разделение файла прошла успешна")
def merge_file():
    with open('E:/codes/piligrim/gote/qwe2.txt' , 'wb') as fdst:
        sourscepath = 'E:/codes/piligrim/rezka/'
        for subdir,dirs,files in os.walk(sourscepath):
            sorted(files)
            print(files)
            for file in files:
                filename = sourscepath+file
                with open(filename,'rb') as fsrc:
                    shutil.copyfileobj(fsrc,fdst,1024*1024*10)
    print("операция слияния файла прошла успешно")

if __name__=="__main__":
    split_file()
    merge_file()


Discord.py Помогите пж отправить сообщение участнику по ID
Помогите пожалуйста я хочу отправить сообщение участнику по его ID
<code>
@client.command(pass_context=True)
async def dm(ctx):
    user = 708709502341480510
    un = int(user)
    await un.send("Your message goes here")
</code>
но код не работает. Помогите пожалуйста, заранее спасибо!

Посмотреть в документации и переписАть так:
<code>
@client.command(pass_context=True)
async def dm(ctx):
    user_id = 708709502341480510
    user = await client.get_user(user_id)

    await client.send_message(user, "Your message goes here")
</code>


Webbrowser многократно открывает страницы
Я создал функцию
open_page(link) которая открывает страницы по ссылке(он нужен как параметр command для виджетов Tkinter, чтобы при нажатии на виджет нас перенаправляли на страницу).Проблема заключается в том, что при запуске браузер открывает сразу все ссылки, не нажав на этот виджет.

def open_link(link):
    webbrowser.open(link,new=1)

responce = requests.get(url, headers=headers)
soup = BeautifulSoup(responce.content, 'html.parser')
items = soup.findAll('div', class_='news-item__content')

comps = []

for item in items:
    comps.append({'title':  item.find('a', class_='news-item__title').get_text(
            strip=True), 'link': item.find('a', class_='news-item__title').get('href')})

for comp in comps:

    text_for_btn = comp['title']
    link_for_article = comp['link']

    btn = tk.Button(news, bg='white', text=text_for_btn, font='Colibri 13',relief='flat')
    btn.pack(side='top', padx=2, pady=3)
    btn.bind('<Button-1>',open_link(link_for_article))

Что логично. Вторым параметром в метод
bind нужно передать указатель на функцию. А вы вызываете саму функцию. Кроме того, первым параметром в обработчик нужно передать объект-событие. А если вам нужно передавать еще что-то, то нужно определять лямбду.
Итого:

def open_link(event, link):
    webbrowser.open(link,new=1)

................
btn.bind('<Button-1>',
         lambda e, link = link_for_article: open_link(e, link))


Как сократить объявления полей в Python с Tkinter?
На уроках решаем несложные задачки, используя Python и библиотеку Tkinter. В Tkinter можно объявить поле Entry и я сегодня был вынужден создать сразу 16 таких полей и получился вот такой код:
<code>
p1 = Entry(root, font = 'Calibri 18')
p2 = Entry(root, font = 'Calibri 18')
p3 = Entry(root, font = 'Calibri 18')
p4 = Entry(root, font = 'Calibri 18')
p5 = Entry(root, font = 'Calibri 18')
p6 = Entry(root, font = 'Calibri 18')
p7 = Entry(root, font = 'Calibri 18')
p8 = Entry(root, font = 'Calibri 18')
p9 = Entry(root, font = 'Calibri 18')
p10 = Entry(root, font = 'Calibri 18')
p11 = Entry(root, font = 'Calibri 18')
p12 = Entry(root, font = 'Calibri 18')
p13 = Entry(root, font = 'Calibri 18')
p14 = Entry(root, font = 'Calibri 18')
p15 = Entry(root, font = 'Calibri 18')
p16 = Entry(root, font = 'Calibri 18')
</code>
Можно ли это как-то упростить и записать в пару строк, а не в 16?

Просто создайте список, создавайте и добавляйте поля в этот список в цикле:

p = []

for i in range(16):
    entry = Entry(root, font = 'Calibri 18')
    entry.pack()
    p.append(entry)

Обращение к конкретному полю по индексу от
p[0] до
p[15].


Почему вылезло 409, если у меня даже вебхуков в коде нет?
У меня возникла новая проблема, я написал часть кода под отправку фотографий телеграм-боту, но при запуске кода возникает ошибка, связанная с getUpdates. Вебхуков нет, я в этом убедился. Может быть, это связано с отстуствием этого getUpdates? В каком месте это исправить?
Код:
<code>
import telebot
import config

bot = telebot.TeleBot(config.TOKEN)

@bot.message_handler(content_types = 'photo')
def give_photo(photo):
    gp = photo.photo()
    gp.getFile(photo.from_user.id, 'file_id')
    bot.send_photo(photo.chat.id, gp)
</code>
UPD: этот фрагмент связан с отправкой фотографий.

msg.photo[-1] - файл с максимальным размером

@bot.message_handler(content_types=['photo'])
def give_photo(msg):
    file = bot.get_file(msg.photo[-1].file_id)
    downloaded_file = bot.download_file(file.file_path)
    bot.send_photo(msg.chat.id, downloaded_file)


Почему я не могу импортировать модуль pynacl? (discrod.py - ModuleNotFoundError: No module named 'pynacl')

import discord
import pynacl

client = discord.Client()

@client.event
async def on_ready():
    print('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    if message.content.startswith('$'):
        if message.author.voice:
            await message.author.voice.channel.connect()
        return await message.channel.send(message.author.voice.channel)

После запуска программы появляется ошибка
ModuleNotFoundError: No module named 'pynacl'. Важно отметить, что pynacl уже есть в списке модулей.
Когда я устанавливаю модуль повторно
pip install PyNaCl/
pip3 install PyNaCl, консоль выводит, что модуль уже загружен.
Пробовал:
Перезагружать IDLE, компьютер, пробовал
import nacl (
ModuleNotFoundError: No module named 'nacl'), а не
import pynacl, переустанавливал модуль, а также использовал
import discrod.py[voice]. Если модуль не импортировать, то выводит следующую ошибку:
RuntimeError: PyNaCl library needed in order to use voice.
Пользуюсь IDLE Python 3.7.1

Короче говоря, я разобрался. Спасибо всем, кто принимал участие в обсуждении вопроса. Проблема была в том, что консоль Windows была "привязана" к версии Python 3.6.7, и все модули устанавливались на неё, а я работал в 3.7.1, соответственно, отсюда и ошибка.
Как исправил:

Проверил
python3 --version и обнаружил, что консоль привязана к ней.
Удалил версию Python 3.6.7.
Столкнулся с проблемой "Fatal error in launcher".
Удалил из AppData\Local\Programs\Python папку Python 3.6.
Обновил pip и скачал pynacl.
Готово! :D


Python BeautifulSoup получить цену [закрыт]

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

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

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

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

Цена: 58&nbsp;436 руб.

Как получить только 58436 ?

html = '<span class="price"><span>Цена:</span> 58&nbsp;436 <span class="currency">руб.</span></span>'

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')
span = soup.find_all('span')

cost = span.text.replace('Цена: ', '').replace('\xa0', '').replace(' руб.', '')

>>> cost
58436


Контакт с программой на Python через сервер на TOR
Опишу, что мне примерно нужно.
Я хочу, чтобы программа работала удалённо и я мог посылать ей команды.То есть как бы общаться с ней и получать от неё информацию.
Всё это через сервер на TOR. Как это можно осуществить, используя библиотеку Torpy?
То есть нужно создавать сайт на TOR?
И как использовать для этого Torpy?

Всё это через сервер на TOR.

То есть нужно создавать сайт на TOR?

Насколько я понял,вам нужно сделать get/post запрос к onion домену.
Вам поможет TORPY и TORPYGIT
(Так же можно делать это с помощью requests и встроенного в него proxy - ВОТ )


Discord.py как ограничить доступ к голосовому каналу
<code>
import discord
from discord.ext import commands
import asyncio
import datetime
from datetime import date

bot = commands.Bot(command_prefix='>')

@bot.event
async def on_ready():
    print('Logged in as')
    print(bot.user.name)
    print('------')

@bot.command()
async def ping(ctx):
    await ctx.send('pong')

@bot.command(pass_context=True)
@commands.has_permissions(administrator=True)
@bot.event
async def weekstart(ctx):
    global vc
    guild = ctx.message.guild
    user = ctx.author
    channels = ctx.message.channel
    await ctx.message.delete()
    emb = discord.Embed(title=f'Эвент "выходные": запущен',
                    description='Для того чтобы приянть учатие в нем используйте реакцию ниже',
                    colour=discord.Color.purple())
    ad = discord.Embed(title=f'Эвент "выходные": запущен',
                    description='Через 12 часов будет завершен сбор игроков',
                    colour=discord.Color.green())
    adnoend = discord.Embed(title=f'Эвент "выходные": сбор игроков завершен',
                    description='Сбор игроков завершён,игровой канал создан,для завершения эвента воспользуйтесь командой >weekstop',
                    colour=discord.Color.orange())
    message = await ctx.send(embed=emb)
    mes = await user.send(embed=ad)
    await message.add_reaction('✅')
    await asyncio.sleep(10) # 24 часов это 86400 секунд
    await message.clear_reaction('✅')
    vc = await guild.create_voice_channel("gaming", overwrites=overwrite, category=None, reason=None)
    inv = await vc.create_invite(reason=None)
    noend = discord.Embed(title=f'Эвент "выходные": сбор игроков завершен',
                    description=f"Сбор игроков завершён,игровой канал создан {inv} ",
                    colour=discord.Color.orange())
    ev = await ctx.send(embed=noend)
    ev1 = await user.send(embed=adnoend)

@bot.command(pass_context=True)
@commands.has_permissions(administrator=True)
@bot.event
async def weekstop(ctx):
    global vc
    channel = ctx.message.channel
    today = date.today()
    user = ctx.author
    guild = ctx.message.guild
    await ctx.message.delete()
    end = discord.Embed(title=f'Эвент "выходные": завершён',
                    description='Всем спасибо за участие!Канал будет полностью очищен через 5 секунд!',
                    colour=discord.Color.red())
    en = await ctx.send(embed=end)
    await asyncio.sleep(5)
    await channel.purge(limit=100)
    await vc.delete()
    await asyncio.sleep(3)
    dataevent = discord.Embed(title=f'Последний эвент был:',
                    description= f"{today}",
                    colour=discord.Color.orange())
    ev = await ctx.send(embed=dataevent)
    adend = discord.Embed(title=f'Эвент "выходные": завершён',
                    description='Эвент был успешно завершен!',
                    colour=discord.Color.red())
    anss = await user.send(embed=adend)

bot.run('token')
</code>
подскажите как сделать ограничение доступа к голосовому каналу для всех пользователей кроме определённой роли

Создаете голосовой канал:

channel = await create_voice_channel(*name, category = category)# там где категория указываете названия или айди.

Потом изменяете права:

await channel.set_permissions(*role, connect = False)#там где *role айди роли ставите


Import не видит папку
В корне лежит несколько репозиториев и исполняемый файл run.py.
Некоторые репы мои, некоторые нет и содержат сложную структуру, встречаются __init__, __main__ файлы. Я запускаю свой скрипт и получаю после цепочки import вызовов эту проблему:
ModuleNotFoundError: No module named repository_1/src
Но если в этой же консоли откуда я запускаю, вывести файлы, папки на месте.
Все import в цепочке написаны мною и пути даже в одной репе начинаются с корня. Я не уверен, что так правильно, но я не знаю способа лучше без sys.path.append
Т.е. в my_rep/src/scripts/say_hello.py все импорты написаны в духе\
<code>
from my_rep/src/utils/utils.py import hello_func
from my_rep_old/src/utils/utils.py import hello_func_old
</code>
И они поднимаются нормально. Но один из импортов не в мою репу падает.

Добавьте в папку
my_rep файл
__init__.py
Файлы
__init__.py необходимы, чтобы Python рассматривал каталоги как содержащие пакеты; это делается для того, чтобы предотвратить каталоги с общим именем, например string, от непреднамеренного скрытия допустимых модулей, которые происходят позже (глубже) на пути поиска модуля. В простейшем случае
__init__.py может быть просто пустым файлом, но он также может выполнять код инициализации для пакета или устанавливать переменную
__all__, описанную ниже.

package_x/
|--  __init__.py
|--    subPackage_a/
|------  __init__.py
|------  module_m1.py
|--    subPackage_b/
|------  __init__.py
|------  module_n1.py
|------  module_n2.py
|------  module_n3.py

Мы можем использовать
__init__.py в
subPackage_b для ограничения импортируемых модулей следующим образом:

__all__ = ['module_n2', 'module_n3']

После запуска:

>>>from package_x.subPackage_b import *
>>>module_n1.function_X()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named module_n1


Как проверить одинаковые ли значения определённого поля в словаре Python
Есть цикл (stickers_dict), который проходится по словарям. Нужно каким-то образом проверять, одинаковые ли значения у всех элементов словаря у определённых полей. Если да, то выполнять условие.
Прилагаю примеры: 1) словаря, который проходит проверку, 2) словаря, который не проходит проверку:

    {
        0: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
        1: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
        2: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
        3: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'}
    }

    {
        0: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
        1: {'stickerId': 2208, 'slot': '3', 'codename': 'krakow2017_signature_edward', 'name': 'Edward | Krakow 2017'},
        2: {'stickerId': 101, 'slot': '4', 'codename': 'comm01_backstab', 'name': 'Backstab'},
        3: {'stickerId': 2208, 'slot': '3', 'codename': 'krakow2017_signature_edward', 'name': 'Edward | Krakow 2017'}
    }

Проверять можно по любому полю, например, stickerId, которое имеет путь
stickers_dict[stickers_item]['stickerId']

Если проверка по одному полю, есть смысл функции проверки:

def check_by_key(my_dict, key_check):
    values = []

    for el in my_dict.values():
        values.append(el[key_check])

        if len(set(values) > 1:
            return False

    return True

Для
my_dict:

my_dict = {
        0: {'stickerId': 2154, 'slot': '1', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
        1: {'stickerId': 2154, 'slot': '2', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
        2: {'stickerId': 2154, 'slot': '3', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'},
        3: {'stickerId': 2154, 'slot': '4', 'codename': 'krakow2017_signature_gla1ve', 'name': 'gla1ve | Krakow 2017'}
    }

результат с разным
key_check:

>>> check_by_key(my_dict, 'stickerId')
True
>>> check_by_key(my_dict, 'codename')
True
>>> check_by_key(my_dict, 'slot')
False


Как избавиться от вложенности при переборе списков
Есть 10 списков, вида:

a1 = ['1','2','4']
a2 = ['a','b','d']
..
a10 = ['asd','add','fdd']

Как получить строки из этих списков, избегая вложенности?

out = []
for i in a1:
    for k in a2:
..
       for l in a10:
           res = f'{a1}__{a2} ..... {a10}'
           out.append(res)

используйте
itertools.product

import itertools

for el in itertools.product(a1, a2, ..., a10):
    print("__".join(el))


Как добавить запись в таблицу, при этом если она уже есть, обновить ее или не трогать если нету обновления по полям
Вот такой код работает, что если uuid совпадает, то не трогать запись, а мне надо, если там значения полей поменялись, то обновить строку, как сделать?
<code>
    sql_insert = "INSERT INTO `table1` (`id`, `created_at`, `updated_at`, `username`, `project`, `vm_state`, `power_state`, `email`, `status_send`,
 `emaildate`, `host`, `vmname`, `uuid`, `statusremove`) VALUES (NULL, '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '0', NULL, '%s', '%s', '%s', '0')
 ON DUPLICATE KEY UPDATE `table1`.`uuid` = '%s' " % (r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9],r[9])
</code>

INSERT INTO `table1` (`id`, `created_at`, `updated_at`, `username`, `project`,
                      `vm_state`, `power_state`, `email`, `status_send`,
                      `emaildate`, `host`, `vmname`, `uuid`, `statusremove`)
VALUES (NULL, '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '0', NULL, '%s', '%s', '%s', '0')
ON DUPLICATE KEY UPDATE
created_at = VALUES(created_at),
updated_at = VALUES(updated_at),
...
vmname = VALUES(vmname),
statusremove = VALUES(statusremove);

Функция VALUES() возвращает то значение, которое было бы присвоено в секции INSERT, не встреться ошибки дублирования. Так что второй раз передавать те же значения не надо (а вот если надо присвоить иное значение - то надо).
Поля с автоприсвоением (автоинкремент, автообновляемый дата-время) обновлять в секции UPDATE не требуется.
Если какое-то поле получает в качестве значения литерал, а не параметр, то в секции UPDATE можно также использовать литерал. Например, последняя строка может быть
statusremove = '0', потому что в списке VALUES вставляемых значений этому полю соответствует литерал
'0'.


Почему в мой код возвращает не то что мне нужно?
Я пытаюсь написать код выполняющий задание курса Основы программирования на Python, автор: Национальный исследовательский университет "Высшая школа экономики", на Coursera.
Задание
Дан список чисел. Выведите все элементы списка, которые больше предыдущего элемента.
Формат ввода
Вводится список чисел. Все числа списка находятся на одной строке.
Формат вывода
Выведите ответ на задачу.
Пример
Тест 1
Входные данные:
1 5 2 4 3
Вывод программы:
5 4
Мой код
<code>
spisok = input().split()
a = 1
sled = spisok[a]

for i in map(int, spisok):
    if i < int(sled):
        a += 1
        print(sled)
    else:
        a += 1
</code>
Программа вместо того, чтобы подставлять на место [а] в spisok[a] новый индекс, просто один раз печатает число по индексу 1. То есть вместо перебора индексов и сравнивания чисел код просто останавливается на первом же проходе...

mylist = input().split()

пройдитесь по списку с помощью перебора индексов (от 1)

for i in range(1, len(mylist)):
    if mylist[i] > mylist[i-1]:
        print(spisok[i])

5
4


Просто:

print(*(a for a in data if a[1] != -1))

а можно так:

print(*filter(lambda x: x[1] != -1, data))

Или без префиксной "звездочки":

for i in filter(lambda x: x[1] != -1, data):
    print(i)


ввод в одну строку двух переменных, у одной из которых несколько значений
Мне нужно сделать ввод в одну строку двух переменных, но одна из них содержит в себе несколько значений, как я могу это сделать?
Пример: 5 1 2 3 4, где 5 это переменная N, а 1 2 3 4, переменная a.
Сейчас же у меня получается:
5
1 2 3 4
Вот код который у меня есть на данный момент
<code>
n=int(input())
a = map(int,input().split())
g=1
while True:
 if g not in a:
  print(g)
  break
 else:
  g=g+1
</code>

n, *a = map(int, "1 2 3 4 5".split())

print( n ) # 1
print( a ) # [2, 3, 4, 5]

Первое значение попадет в
n, оставшиеся соберутся в
a в виде массива.


Помогите упростить условия и сделать код проще?
Задание:

Write a function called check_date. check_date should require two positional parameters: a string representing the name of a month, and an integer representing a date. check_date should also have a keyword parameter called is_leap_year, assumed to be False, representing whether or not it's a leap year.
Return True if the date is a valid calendar date. Return False if it is not. A date may not be a valid calendar date if the month isn't a real month, or if that date does not exist for that month.
You can see some examples at the end of this file. Remember: 30 days has September, April, June, and November.
All the rest have 31, except February, which has 28, until Leap Year gives it 29.
You may assume that day will be greater than 0 (you don't need to check negative or zero values for day)

Для решения задачи, описанной выше написал следующий код:
<code>
def check_date(name_month, date, is_leap_year = False):
    if date in range (1,30) and is_leap_year == True and name_month == "February":
        return True
    elif date in range (1, 32) and name_month in ("October", "January", "August", "December", "March", "July"):
        return True
    elif date in range (1, 31) and name_month in ("September", "April", "June", "November"):
        return True
    elif name_month not in ("October", "January", "August", "December", "March", "July", "September", "April", "June", "November", "February"):
        return False
    else:
        return False

print(check_date("January", 31))
print(check_date("February", 29, is_leap_year = True))
print(check_date("Techtember", 15, is_leap_year = True))
print(check_date("June", 31))
</code>
Все прекрасно работает, но мне он не нравится - слишком много условий.
Подскажите как сделать код более простым?
PS Я новичок в изучении Python.
PPS Спасибо!

Мне больше нравится через словари:

def check_date(name_month: str, date: int, is_leap_year=False) -> bool:
    calendar = {'January': 31, 'February': 28, 'March': 31, 'April': 30, 'May': 31, 'June': 30, 'July': 31, 'August': 31, 'September': 30, 'October': 31, 'November': 30, 'December': 31,}

    if is_leap_year:
        calendar['February'] = 29

    return date <= calendar.get(name_month, False)

Нужно только установить максимальную дату февраля 29-е, если год високосный...

>>> check_date("January", 31)
True
>>> check_date("February", 29, is_leap_year = True)
True
>>> check_date("Techtember", 15, is_leap_year = True)
False
>>> check_date("June", 31)
False

dict.get() вернет значение по ключу, либо default (необязательный параметр, None по-умолчанию): если месяц есть в словаре - вернет значение (дней), иначе вернет False (установленный вместо default)... дальше сравнивается date и то, что вернул dict.get() (инты с булевыми сравниваются в пайтоне преобразованием булевого в 1 или 0)


Plotly расположение графиков в subplots
Кусок из скрипта, который строит графики в реальном времени:
<code>
@app.callback(Output('live-update-graph', 'figure'),
          Input('interval-component', 'n_intervals'))
def update_graph_live(n):
       df=pd.read_csv('/home/gluk/forstream.csv')
       ln=len(df)
       if ln<500:
            df1=df.tail(ln)
       else:
            df1=df.tail(500)

       fig = plotly.tools.make_subplots(rows=2, cols=2,
                shared_xaxes=True,
                vertical_spacing=0.03,
                horizontal_spacing = 0.02,
                column_widths=[0.65, 0.35])
fig['layout']['margin'] = {
    'l': 0, 'r': 0, 'b': 0, 't': 0
}
fig['layout']['legend'] = {'x': 0, 'y': 1, 'xanchor': 'left'}

fig.append_trace({
    'x': df1['T'], #Время
    'y': df1['HAE'],#Канал Восток
    'name': 'HAE',
    'mode': 'lines+markers',
    'type': 'scatter'
},1,1)
fig.append_trace({
    'x': df1['T'], #Время
    'y': df1['HAN'], #Канал север
    'text': df1['T'],
    'name': 'HAN',
    'mode': 'lines+markers',
    'type': 'scatter'
},2,1)
fig.append_trace({ #График зависимости двух каналов
    'x': df1['HAE'],
    'y': df1['HAN'],
    'text': df1['T'],
    'name': 'HAE vs HAN',
    'mode': 'markers',
    'type': 'scatter',
},2,2

)
fig.update_layout(height=700,
    template="plotly_white",
    margin=dict(
        t=10,
        b=0
        ))
return (fig)
</code>
Задача сделать так, чтобы последний график (позиция 2,2) имел квадратную форму и занимал часть или всю позицию (1,2). Квадратная форма необходима для того, чтобы сделать один масштаб осей конкретно на этом графике. Пока не нашел как сделать такую конфигурацию subplots в plotly. Спасибо!!!

Попробуйте в методе
fig = plotly.tools.make_subplots после
rows=2, cols=2, явно указать спецификацию:
для сабплотов такого вида:

_______
   |
-------
_______

specs=[[{}, {}],
           [{"colspan": 2}, None]],

для

________
   |
   |----
___|____

[[{'rowspan': 2}, {}], [None, {}]]

для

_______
   |
---|
___|___

[ [None, {}], [{'rowspan': 2}, {}]]

и т. д.


Наложение маски из индексов на список
Необходимо по маске индексов получить список групп элементов списка. Пример:
Маска:

[[3, 4, 5, 6], [7, 8, 9], [10]]

Массив:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']

Результат (после наложении маски):

[['d', 'e', 'f', 'g'], ['h', 'i', 'j'], ['k']]

Можно ли это сделать с помощью встроенных функций для работы со списками?

Через генераторы именно для списков маск вида
list(list(int())):

masks = [[3, 4, 5, 6], [7, 8, 9], [10]]
data  = "abcdefghijklmnop"
retr  = [[data[i] for i in mask] for mask in masks]
print(retr)

Стандартных функций для таких действий не знаю, но ее можно сделать самому по принципу выше.


Как cделать чтобы Discord бот выдал роль пользователю при подключении к voice каналу?
Как сделать так чтобы человек присоединялся к воис каналу дискорд, бот выдавал ту или иную роль, а после то как человек выходит из канала роль забралась?
<code>
@client.event()
</code>

для голосового канала:

@client.event
async def on_voice_state_update(member, before, after):
    role = get(member.server.roles, name="Speaker")
    is_my_channel = after.channel and after.channel.id == 776564197873287202;
    if after.channel and after.channel!=before.channel and is_my_channel:
       await client.add_roles(member, role)
    # if before.channel and after.channel!=before.channel and is_my_channel:
    #   await client.remove_roles(member, role)

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

@client.event
async def on_member_join(member):
    role = get(member.server.roles, name="Admin")
    await client.add_roles(member, role)


Программа выдает ошибку IndexError: list index out of range
Необходимо найти длину поездки в лифте в количестве проеханых этажей, числа в массиве указывают на каой этаж приезжал лифт, всего в здании 30 этажей.
<code>
array = [1, 2, 3]
def elevator_distance(array):
    dist = 0
    for i in range(0, len(array)-1):
        if array[i] < array[i + 1]:
            s = array[i + 1] - array[i]
            dist = dist + s
            i += 1
        if array[i] > array[i + 1]:
            s = array[i] - array[i + 1]
            dist = dist + s
            i += 1
    return (dist)
print(elevator_distance(array))

</code>

ну а что вы хотите?
у вас есть основной цикл -

for i in range(0, len(array)-1):

в котором
i меняется каждый цикл на 1
а внутри этого цикла вы делаете

i += 1

и конечно сразу выходите за диапазон
у вас же в цикле дополнительно
i += 1 не происходит только в 1 случае, когда
array[i] == array[i + 1]
если я правильно понял, то ваш код должен делать следующее:

def elevator_distance(array):
    return sum(abs(array[i + 1] - array[i]) for i in range(len(array) - 1))


Python ошибка в int SyntaxError: cannot assign to function call [закрыт]

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

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

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

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

вот код:

int(age) = input('Ваш возраст: ')

вот ошибка при запуске кода:

SyntaxError: cannot assign to function call

помогите пожалуйста.

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

age = int(input('Ваш возраст: '))

или таким

age_text = input('Ваш возраст: ')
age = int(age_text)


Как запустить две функции одновременно?
Есть две функции:
hello() и
world()

def hello():
 while(True):
    print('hello')
def world():
 while(True):
    print('world')

Пытаюсь запустить их одновременно. Мой код :

from threading import Thread
def hello():
 while(True):
    print('hello')
def world():
 while(True):
    print('world')

thread1 = Thread(target=hello())
thread2 = Thread(target=world())

thread1.start()
thread2.start()
thread1.join()
thread2.join()

По итогу в консоль выводится только "hello".
То есть они запускаются не параллельно, а как-бы по очереди.
Как можно сделать так что-бы они работали именно параллельно?

проблема здесь
<code>
Thread(target=hello())
</code>
вы вызвали функцию из-за чего она запустилась как обычная, а не в потоке. Надо убрать круглые скобки после названия функции


Ошибка синтаксиса у несуществующего символа
Я пишу телеграм бота с локальной базой данных sqlite3.
При попытке извлечь данные из таблицы для проверки регистрации пользователя в боте выдает ошибку.

def bot_start(message):
    connection = sqlite3.connect('users.db')
    db = connection.cursor()

    db.execute("""CREATE TABLE IF NOT EXISTS users (
        telegram_user TEXT,
        rollgame_account TEXT,
        username TEXT,
        telegram_id INT

    )""")
    connection.commit()

    if db.execute("SELECT telegram_user FROM users WHERE telegram_id = {}".format(id)).fetchone()[0] == 'yes':
        client.register_next_step_handler(msg, bot_menu)
    else:
        client.register_next_step_handler(msg, bot_user_authorization)

Ошибка:

Traceback (most recent call last):
  File "bot.py", line 66, in <module>
    client.polling(none_stop = True, interval = 0)
  File "C:\Users\sakae\AppData\Local\Programs\Python\Python37-32\lib\site-packages\telebot\__init__.py", line 485, in polling
self.__threaded_polling(none_stop, interval, timeout, long_polling_timeout)
  File "C:\Users\sakae\AppData\Local\Programs\Python\Python37-32\lib\site-packages\telebot\__init__.py", line 544, in __threaded_polling
raise e
  File "C:\Users\sakae\AppData\Local\Programs\Python\Python37-32\lib\site-packages\telebot\__init__.py", line 507, in __threaded_polling
self.worker_pool.raise_exceptions()
  File "C:\Users\sakae\AppData\Local\Programs\Python\Python37-32\lib\site-packages\telebot\util.py", line 117, in raise_exceptions
raise self.exception_info
  File "C:\Users\sakae\AppData\Local\Programs\Python\Python37-32\lib\site-packages\telebot\util.py", line 69, in run
task(*args, **kwargs)
  File "bot.py", line 25, in bot_start
if db.execute("SELECT telegram_user FROM users WHERE telegram_id = {}".format(id)).fetchone()[0] == 'yes':
sqlite3.OperationalError: near "<": syntax error

Символа "<" в моем коде нет.

Ошибка возникает из-за того, что запрос вы формируете так:

"SELECT telegram_user FROM users WHERE telegram_id = {}".format(id)

У вас в коде нигде не объявлена переменная
id.
Но зато в питоне
id - это встроенная функция. А если вы любую встроенную функцию попытаетесь привести к строке, то увидите такое:

<built-in function id>

Вот отсюда и берётся
<.
Скорее всего у вас вместо
id должно быть что-то вроде
message.id или подобное (я не разбираюсь в телеграмных ботах, поэтому точнее не подскажу).


Как преобразовать строчное значение в список?
Есть строка:
"[1, 2, 3, 4]"
Как эту строку можно преобразовать в список?

Вариант 1

from ast import literal_eval

expr_str = "[1, 2, 3, 4]"

res = literal_eval(expr_str)

Вариант 2

import json

res = json.loads(expr_str)

Вариант 3

import yaml

res = yaml.safe_load(expr_str)

PS
yaml умеет парсить не вполне валидные JSON строки, например JSON строки с одинарными кавычками вместо двойных (по стандарту).
NOTE: не используйте
eval()

результат:

In [204]: res
Out[204]: [1, 2, 3, 4]


Заменить значения одного столбца в одном датафрейме значением по ключу из второго
Только начинаю разбираться в питоне, нужно решить прикладную задачку по работе.
Дано:
Две таблицы с общим полем 'Артикул', необходимо заменить значения во втором фрейме значениями из первого по артикулу.

df55 - склад
df1C = общая сводка

Пример:

    df55  = pd.DataFrame(
    {'Название':['Коврик для фитнесса голубой 10', 'Коврик для фитнесса 10 мм NBR фиолетовый', 'Гиря 16 кг', 'Блины 10кг','Фибол'],
      'Артикул':['SV-HK0067','SV-HK0068', 'SV-HK0069','SV-HK0070','SV-HK0071'],
   'Количество':['5', '7', '2', '4','6']})

df1С1 = pd.DataFrame(
    {'Название':['Коврик для фитнесса голубой 10', 'Коврик для фитнесса 10 мм NBR фиолетовый', 'Гиря 16 кг', 'Блины 10кг','Фибол','Перчатки','Груши'],
      'Артикул':['SV-HK0067','SV-HK0068', 'SV-HK0069','SV-HK0070','SV-HK0071', 'SV-HK0072', 'SV-HK0073'],
   'Склад 55 к-во':['3', '4', '5', '6','8','0','0'], 'Склад 43 к-во':['0', '0', '0', '0','0','0','0'], 'Склад 72 к-во':['0', '0', '0', '0','0','0','0']})

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

df_new = df55.loc[:, ['Артикул', 'Кол-во ']].set_index('Артикул')
dict_1 = df_new.to_dict()
df1C = (df1C
   .query("'Артикул' in @dict_1.keys()")
   .assign(Артикул=lambda x: x["55"].replace(dict_1)))

Выдает ошибку TypeError: unhashable type: 'list'
Понимаю, что скорее всего есть более простой вариант т.к. задача элементарная.
Заранее спасибо за помощь!

При исходных датафреймах:

df55:
                                   Название    Артикул Количество
0            Коврик для фитнесса голубой 10  SV-HK0067          5
1  Коврик для фитнесса 10 мм NBR фиолетовый  SV-HK0068          7
2                                Гиря 16 кг  SV-HK0069          2
3                                Блины 10кг  SV-HK0070          4
4                                     Фибол  SV-HK0071          6

df1C1:
                                   Название    Артикул Склад 55 к-во
0            Коврик для фитнесса голубой 10  SV-HK0067             3
1  Коврик для фитнесса 10 мм NBR фиолетовый  SV-HK0068             4
2                                Гиря 16 кг  SV-HK0069             5
3                                Блины 10кг  SV-HK0070             6
4                                     Фибол  SV-HK0071             8
5                                  Перчатки  SV-HK0072             0
6                                     Груши  SV-HK0073             0

вы можете сделать просто:

df1С1.update(df55.rename(columns={"Количество": "Склад 55 к-во"}))

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

                                   Название    Артикул Склад 55 к-во
0            Коврик для фитнесса голубой 10  SV-HK0067             5
1  Коврик для фитнесса 10 мм NBR фиолетовый  SV-HK0068             7
2                                Гиря 16 кг  SV-HK0069             2
3                                Блины 10кг  SV-HK0070             4
4                                     Фибол  SV-HK0071             6
5                                  Перчатки  SV-HK0072             0
6                                     Груши  SV-HK0073             0

UPDATE
Если я все-таки правильно понял автора вопроса, и обновлять датафрейм нужно по паре ключ-значение, соответсвующей Артикулу-Количеству, то сделать можно так (для наглядности я поменял местами первые позиции в df1C1:

df55:
                                           Название Склад 55 к-во
Артикул
SV-HK0067            Коврик для фитнесса голубой 10             3
SV-HK0068  Коврик для фитнесса 10 мм NBR фиолетовый             4
SV-HK0069                                Гиря 16 кг             5
SV-HK0070                                Блины 10кг             6
SV-HK0071                                     Фибол             8
SV-HK0072                                  Перчатки             0
SV-HK0073                                     Груши             0
                                           Название Склад 55 к-во
df1C1:
Артикул
SV-HK0068  Коврик для фитнесса 10 мм NBR фиолетовый             5
SV-HK0067            Коврик для фитнесса голубой 10             7
SV-HK0069                                Гиря 16 кг             2
SV-HK0070                                Блины 10кг             4
SV-HK0071                                     Фибол             6

res = df1С1.set_index("Артикул")
upd = df55.rename(columns={"Количество": "Склад 55 к-во"}).set_index("Артикул")
res.update(upd)
res = res.reset_index()

тогда res будет:

     Артикул                                  Название Склад 55 к-во
0  SV-HK0067            Коврик для фитнесса голубой 10             7
1  SV-HK0068  Коврик для фитнесса 10 мм NBR фиолетовый             5
2  SV-HK0069                                Гиря 16 кг             2
3  SV-HK0070                                Блины 10кг             4
4  SV-HK0071                                     Фибол             6
5  SV-HK0072                                  Перчатки             0
6  SV-HK0073                                     Груши             0


Selenium не может найти кнопку
HTML копки

 <button type="button" class="Buttonstyles__BaseButton-hz08m4-0 cjyoqz"><span class="Buttonstyles__ChildrenWrapper-hz08m4-3 bYSkKb"><div class="TextCallout1__TextCallout1Wrapper-qzrnab-0 hFWzEC"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Текст кнопки</font></font></div></span></button>
Что только не пробовал
driver.execute_script,
find_element_by_class_name,
find_element_by_xpath,
find_element_by_css_selector.

WebDriverWait не помогло.
Мне удалось вызвать
document.querySelector("#skip-tabbar > div:nth-child(2) > article > div:nth-child(3) > div.layout__CardWrapper-sc-775v9d-0.ktgUkv > div.layout__Right-sc-775v9d-2.kowpQa > div.ShowPhoneNumberButton__StyledButton-sc-1fetcgp-0.fXHQwR > button").click() но в selenium
selenium.common.exceptions.JavascriptException: Message: javascript error: Cannot read property 'click' of null

Если речь идет именно об этой кнопке
<code>
driver.find_element_by_xpath("//font/font[1]").click()
</code>


Почему экранируется кавычка в сырой (raw) строке?
Столкнулся с сырыми строками и решил проверить их работу на простом примере.
Пожалел.

print(r"\")

Результат:

  File "main.py", line 1
    print(r"\")
              ^
SyntaxError: EOL while scanning string literal

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

Вырезка из Python 3 FAQ (на английском):
Why can’t raw strings (r-strings) end with a backslash?

More precisely, they can’t end with an odd number of backslashes: the
unpaired backslash at the end escapes the closing quote character,
leaving an unterminated string.
Raw strings were designed to ease creating input for processors
(chiefly regular expression engines) that want to do their own
backslash escape processing. Such processors consider an unmatched
trailing backslash to be an error anyway, so raw strings disallow
that. In return, they allow you to pass on the string quote character
by escaping it with a backslash. These rules work well when r-strings
are used for their intended purpose.
If you’re trying to build Windows pathnames, note that all Windows
system calls accept forward slashes too:

f = open("/mydir/file.txt")  # works fine!

If you’re trying to build a pathname for a DOS command, try e.g. one of

dir = r"\this\is\my\dos\dir" "\\"
dir = r"\this\is\my\dos\dir\ "[:-1]
dir = "\\this\\is\\my\\dos\\dir\\"


TypeError: save() missing 1 required positional argument: 'self' в Django
Пытаюсь сохранить новую запись в базу, выдает ошибку

save() missing 1 required positional argument: 'self'

Что не так?
models.py

class Plugins(models.Model):
    title = models.CharField(max_length=150, verbose_name='Название')

    def get_absolute_url(self):
        return reverse('urls_view_current_plugins', kwargs={'pk': self.pk})

    def __str__(self):
        return self.title

tags.py

def add_plugin_in_db():
    plugin = Plugins
    plugin.title = 'title'
    plugin.save(force_insert=True)

Вместо

plugin = Plugins

примените

plugin = Plugins()

(в вашей  функции
add_plugin_in_db()), чтобы вы создали новый объект класса
Plugins.
Без скобок вы просто только создали новое имя для класса
Plugin.


Pyton matplotlib.pyplot.scatter для KNN [закрыт]

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

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

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

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

Подскажите как нарисовать KNN, у меня дата-фрейм с 17 колонками, везде инфа как создать двух мерный рисунок распределения, мне бы 17ти мерный отобразить, подскажите пожалуйста как. scatter просит х и у  но куда еще то 14 разместить для отображения? Или подскажите как вообще можно визуализировать KNN.

Если хотите визуализировать точки в более чем 3х-мерном пространстве, то вам придется сначала уменьшить размерность до двух или трехмерного пространства.
Я бы посоветовал попробовать t-SNE алгоритм - он очень хорошо кластеризирует похожие точки в многомерных пространствах и в итоге после работы алгоритма t-SNE получаем кластеры схожих точек.
Итоговый выбор алгоритма для уменьшения размерности будет зависеть от исходных данных и от результата, который вы хотите получить.
Здесь есть неплохое сравнение 6 алгоритмов.


Ошибка str is not callable
Возникла довольно нелепая проблема, пытаюсь прочитать текстовый файл, а оно ругается..

t=mx=0
with open("C:/Users/georg/Downloads/24__dd5.txt", "r") as f:
    s=f.readline()
    for i in range(len(s)):
        if s(i)=="X":
            t+=1
        else: mx= t; t = 0
print(mx)

Вот что выводит:
TypeError: 'str' object is not callable

У вас написано
s(i), что воспринимается интерпретатором как вызов функции. Вы скорее всего имели в виду
s[i]. Т.е. как-то так:

t = mx = 0
with open("C:/Users/georg/Downloads/24__dd5.txt", "r") as f:
    s = f.readline()
    for i in range(len(s)):
        if s[i] == "X":
            t += 1
        else:
            mx = t
            t = 0
print(mx)


Python dict dict
Есть два dict. Нужно пройтись с начало по goods, через его ID зайти store и там умножить quantity и price на ID=12345, а на ID=23456 с начало умножить quantity и price на одном dict и плюсовать их:
<code>
goods = {
    'Lampa': '12345',
    'Stol': '23456'
}

store = {
    '12345': [
        {
            'quantity': 27,
            'price': 42
        },
    ],
    '23456': [
        {
            'quantity': 22,
            'price': 510
        },
        {
            'quantity': 32,
            'price': 520
        },
    ],
}
</code>

summs = [sum(v['quantity']*v['price'] for v in store[goods[key]]) for key in goods]
pairs = [(goods[key], sum(v['quantity']*v['price'] for v in store[goods[key]])) for key in goods]

new_dict = {key: sum(v['quantity']*v['price'] for v in store[goods[key]]) for key in goods}
new_dict1 = {goods[key]: sum(v['quantity']*v['price'] for v in store[goods[key]]) for key in goods}


Замена элементов списка словарей по ключу на числа из этих элементов
Есть словарь вида:

rows = [{'customer': 1, 'item': '10 0 apple', 'item2': '3 milk', 'age': '24'},
    {'customer': 2, 'item': '25 water', 'item2': '2 orange', 'age': '23'},
    {'customer': 3, 'item': '25 water', 'item2': '2 orange', 'age': '23'},
    {'customer': 4, 'item': '4 0 0 cats', 'item2': '76 mango', 'age': '25'}]

Нужно вытащить из его элементов по ключу "item" числа и записать их вместо элементов. Если в элементе содержатся числа через пробелы или иные символы, то их необходимо слить в одно число. Например, из элемента '10 0 apple' должно получиться '100', '4 0 0 cats' - '400' и т.д.
Мой вариант кода вытаскивает числа из элементов, но не объединяет и не заменяет на сам элемент:

    count = 0
    for element in rows: # Определяем количество словарей в списке
        count += 1

    for i in range(0, count+1): # Перебираем каждый словарь списка
        numbers = []
        for j in rows[i]['item'].split(' '): # В каждом словаре сплитим элемент с ключом "item"
            try:
                int(j)
                numbers.append(j)
            except:
                pass
        print(numbers)

rows = [
    {'customer': 1, 'item': '10 0 apple', 'item2': '3 milk', 'age': '24'},
    {'customer': 2, 'item': '25 water', 'item2': '2 orange', 'age': '23'},
    {'customer': 3, 'item': '25 water', 'item2': '2 orange', 'age': '23'},
    {'customer': 4, 'item': '4 0 0 cats', 'item2': '76 mango', 'age': '25'}
]

Обойтите элементы списка и измените значение ключа
item:

for r in rows:
    r['item'] = ''.join(i for i in r['item'] if i.isdigit())

Теперь в
rows:

>>> rows
[
    {'customer': 1, 'item': '100', 'item2': '3 milk', 'age': '24'},
    {'customer': 2, 'item': '25', 'item2': '2 orange', 'age': '23'},
    {'customer': 3, 'item': '25', 'item2': '2 orange', 'age': '23'},
    {'customer': 4, 'item': '400', 'item2': '76 mango', 'age': '25'}
]

Оставит значение пустой строкой, если не найдет цифр...


Поиск по номеру месяца если в клавиатуре указаны название месяцев
Как сделать поиск по номеру месяца если в клавиатуре указаны название месяцев?
Может можно как-то изменить значение клавиатуры  или преобразовать название месяца в число?
Запрос SQLite

def select_mesac_narodgenya(message):
    conn = sqlite3.connect(settings.DATABASE)
    cursor = conn.cursor()
    sql = "SELECT last_name, first_name, third_name, data_r FROM dovidnyk WHERE strftime('%m', data_r) = ?"
    query = "%{}%".format(message.text.casefold())
    cursor.execute(sql, (query,))
    result = cursor.fetchall()
    for fn in result:
        msg =  "<i>👤 <u>ФИО</u></i>:  <b>{} {} {}</b>\n" \
               "<i>📅 <u>Дата рожlенbя</u></i>:  <b>{}</b>\n".format(fn[0], fn[1], fn[2], fn[3])
        bot.send_message(message.from_user.id, msg, reply_markup=keyboard, parse_mode='HTML')

Клавиатура - Январь, Февраль, .....

kb = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
kb.row(KEYBOARD['DATAR_01'], KEYBOARD['DATAR_02'], KEYBOARD['DATAR_03'])
kb.row(KEYBOARD['DATAR_04'], KEYBOARD['DATAR_05'], KEYBOARD['DATAR_06'])
kb.row(KEYBOARD['DATAR_07'], KEYBOARD['DATAR_08'], KEYBOARD['DATAR_09'])
kb.row(KEYBOARD['DATAR_10'], KEYBOARD['DATAR_11'], KEYBOARD['DATAR_12'])

Пример таблицы SQLite

Если я правильно понял, и на сервер после нажития кнопки прилетает название месяца, что-то вроде
press_key = 'Март', то воспользуйтесь словарем с названием в ключе и номером в значении:

months = {
    'январь': '01',
    'февраль': '02,
    'март': '03',
    'апрель': '04',
    'май': '05',
    'июнь': '06',
    'июль': '07',
    'август': '08',
    'сентябрь': '09',
    'октябрь': '10',
    'ноябрь': '11',
    'декабрь': '12',
}

а в запрос подставьте значение по этому ключу (
months[press_key.lower() будет равен
3 при
press_key = 'Март'):

SELECT last_name, first_name, third_name, data_r
FROM dovidnyk
WHERE strftime('%m', data_r) = months[press_key.lower()]

т.е. у вас код измениться на:

sql = f"SELECT last_name, first_name, third_name, data_r
        FROM dovidnyk
        WHERE strftime('%m', data_r) = {months[press_key.lower()]}"
cursor.execute(sql)
result = cursor.fetchall()


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

import re
car_id = input("Введите номер: ")
result = re.findall(r'^([АВЕКМНОРСТУХ]\d{3}[АВЕКМНОРСТУХ]{2})(\d{2,3})$'', car_id)
if car_id is not None:
    print(f"Результат: Номер {car_id} валиден. Регион: {car_id}")
else:
    print(f"Результат: Номер {car_id} не валиден")

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

Результат: Номер AF222hv193 валиден. Регион: AF222hv193

Но мне нужно чтобы в ответе после региона выходили последние 2-3 цифры. Как это сделать?

import re

regexp = re.compile(r'^[АВЕКМНОРСТУХ]\d{3}[АВЕКМНОРСТУХ]{2}(?P<reg>\d{2,3})$')
car_id = 'А123ВЕ456'

match = regexp.match(car_id)
if match:
    print(f"Результат: Номер {car_id} валиден. Регион: {match['reg']}")
else:
    print(f"Результат: Номер {car_id} не валиден")

stdout:

Результат: Номер А123ВЕ456 валиден. Регион: 456


Как повысить точность вычисления чисел с плавающей точкой
Помогите, пожалуйста, решить следующую проблему: максимальная погрешность при вычислениях 10^(-9), в моем случае погрешность 10^(-8). То есть при входных данных - 3.568248230554, правильный ответ - 10, допустимый ответ 9,999999999, ответ, который получился 9.999999990, то есть мне не хватает точности в один разряд. Как повысить точность с использованием только встроенных модулей python?
<code>
import decimal
from math import pi

d = decimal.Decimal(input("Please enter the d: "))
s = decimal.Decimal(pi) * (d/2) * (d/2)
print(s)
</code>