Про справочник и его окно редактирования можно прочитать здесь.
1. Запустим информационную базу в режиме “конфигуратор” (описание).
2. Откроем конфигурацию (Пункт меню “Конфигурация” -> открыть конфигурацию, либо выбрав одноименную кнопку на панели инструментов)
3. В дереве конфигурации выберем соответствующую ветку “Справочники”.
4. Создадим справочник для этого воспользуемся пунктом “Действия – Добавить”, также можно воспользоватся контекстным меню, нажав по соответствующей группе.
5. В результате откроется окно редактирования (рис.1).
В поле Имя вводим имя справочника, если имя будет содержать несколько слов, то пишите их слитно и все с заглавной буквы. Пример «Отделы продаж», лучше записать как ОтделыПродаж, но можно и Отделы_продаж.
А в поле синоним вводим имя которое будет видеть пользователь, его можно изменять постоянно, в отличии от имени.
Имя для программы (использования в коде), а синоним для пользователя (визуальный). При изменении имени придется менять только код программы, т.к. ссылки на справочник в данных изменяется автоматически.
Телефонный справочник на C#
Также можно указать синонимы для каждого вида окна.
На закладке подсистемы указываете наиболее подходящую для него подсистему или несколько.
Если вы хотите сделать справочник иерархическим, указываете это в закладке Иерархия. К примеру у сотрудников это может быт Подразделения.
Если у вас будет несколько организаций (к примеру), то можно задать с помощью Владельца. Т.к. поле обязательно всем, но можно использовать и иерархию.
Самое главное это создание реквизитов. Я увеличил длину наименования, т.к. будет содержать ФИО сотрудника. Чтобы удалить/отключить наименование или код, просто укажите длину 0.
Т.к. я указал стандартный реквизит Наименование как ФИО, то пользователю будет не понятно что в него вводить. Так же я думаю пользователь не поймет что такое. Для этого можно указать синоним, нажимаем кнопку «Стандартные реквизиты» и указываем синоним.
Результат, форма нового элемента. Заметьте Табельный номер это Код, и его изменять нельзя.
Т.к. Код не должен заполнятся автоматически, убираем галку Автонумерация на закладке Нумерация.
Результат. Отдел это Владелец, а Подразделение — родитель.
Источник: manual1c.ru
Пишем справочник по математике под Android, подключаем рекламу Begun
Проанализировав маркет я понял, что на нем очень много игр, развлекательных и социальных приложений. По-настоящему нужных приложений очень мало, поэтому я решил сделать «карманный» справочник по высшей математике с удобной навигацией по темам, состоящий из трех разделов: математический анализ, аналитическая геометрия, теория вероятностей. Далее обо всем по порядку.
Структура приложения
О создании приложения такого плана на Хабре уже писали в посте Пишем шпаргалку на Android. Разумеется есть некоторые отличия. Первое и главное из них в том, что в нашем приложении нужно будет сделать чуть побольше Activity, второе — добавление в приложение социальных возможностей, таких как отправить письмо разработчику и самостоятельно поучаствовать в создании приложения любому желающему, также добавим в приложение меню опций и несколько диалоговых окон, ну и собственно подключим к нему рекламу Begun, чтобы хоть как-то оправдать затраты на приобретение аккаунта разработчика на маркете.
Справочники в 1С 8.3 — создание и свойства на примерах
Activity
MainActivity
При запуске приложения пользователь будет видеть экран MainActivity:
Он содержит три кнопки, при нажатии на которые осуществляется переход на MatanActivity, GeomActivity, или TerverActivity, содержащие в своих файлах-разметки элементы ListView, представляющие набор соответствующих тем по нужному предмету. Подробный код MainActivity представлен ниже:
public class MainActivity extends Activity <
AdView ad ;
//Объявление идентификатора диалогового окна HELP и диалогового окна Exit
static final int EXIT_DIALOG = 0 ;
static final int HELP_DIALOG = 1 ;
//Вызов меню опций с одной кнопкой About
Override
public boolean onCreateOptionsMenu ( Menu menu ) <
MenuInflater inflater = getMenuInflater ( ) ;
inflater. inflate ( R. menu . gameoptions , menu ) ;
menu. findItem ( R. id . about_menu_item ) ;
menu. findItem ( R. id . btn_email ) ;
return true ;
>
//обработка нажатий на эл-ты меню опций
//Вызов диалога HELP из меню опций при нажатии на «О приложении» и переход на EmailActivity при нажатии на «свяжитесь с нами»
Override
public boolean onOptionsItemSelected ( MenuItem item ) <
switch ( item. getItemId ( ) ) <
case R. id . about_menu_item :
showDialog ( HELP_DIALOG ) ;
return true ;
case R. id . btn_email :
startActivity ( new Intent ( getApplicationContext ( ) ,EmailActivity. class ) ) ;
return true ;
default :
return super . onOptionsItemSelected ( item ) ;
>
>
/** Called when the activity is first created. */
Override
protected void onCreate ( Bundle savedInstanceState ) <
super . onCreate ( savedInstanceState ) ;
requestWindowFeature ( Window . FEATURE_NO_TITLE ) ; //скрываем заголовок
setContentView ( R. layout . second ) ;
//подключение рекламы
// Получаем вид
ad = ( AdView ) findViewById ( R. id . ad ) ;
ad. onDebug = true ;
// Устанавливаем слушатели событий
// callback — слушатель, благодаря которому можно получить информацию
// о событиях в библиотеке. Пока доступны следующие листенеры: AdLoaded, AdClickThru
// и AdStopped. Для инициализации необходимо передать параметр environmentVars,
// который содержит информацию о зарегистрированной площадке в системе
// (BEGUN_PAD_ID, BEGUN_BLOCK_ID).
// Для начала инициализации необходимо вызвать метод ad.init. Затем дождаться
// callback со статусом adLoaded и только после этого вызвать метод
// ad.api(«initAd»,al);
ad. setOnApiListener ( new Callback ( ) <
Override
public void init ( ) <
Log. d ( «BEGUN_AD» , «ad.api|initAd» ) ;
ArrayList < RequestParam >al = new ArrayList < RequestParam >( ) ;
RequestParam rp = new RequestParam ( ) ;
rp. name = «environmentVars» ;
rp. value = «pad_id:261629112|block_id:261629500» ;
al. add ( rp ) ;
ad. api ( «initAd» , al ) ;
Log. d ( «BEGUN_AD» , «CALLBACK params: » + al. toString ( ) ) ;
>
Override
public void callback ( String c ) <
Log. d ( «BEGUN_AD» , «CALLBACK API : » + c ) ;
if ( c. equals ( «AdLoaded» ) ) <
Log. d ( «BEGUN_AD» , «startAd » + c ) ;
ad. api ( «startAd» ) ;
>
>
> ) ;
Log. d ( «BEGUN_AD» , «ad.init» ) ;
ad. init ( ) ;
//Запуск MatanActivity
Button b = ( Button ) this . findViewById ( R. id . btn_mathan ) ;
b. setOnClickListener ( new OnClickListener ( ) <
public void onClick ( View arg0 ) <
startActivity ( new Intent ( getApplicationContext ( ) ,MatanActivity. class ) ) ;
>
> ) ;
//Запуск GeomActivity
Button d = ( Button ) this . findViewById ( R. id . btn_geom ) ;
d. setOnClickListener ( new OnClickListener ( ) <
public void onClick ( View arg0 ) <
startActivity ( new Intent ( getApplicationContext ( ) ,GeomActivity. class ) ) ;
>
> ) ;
Button c = ( Button ) this . findViewById ( R. id . btn_terver ) ;
c. setOnClickListener ( new OnClickListener ( ) <
public void onClick ( View arg0 ) <
startActivity ( new Intent ( getApplicationContext ( ) ,TerverActivity. class ) ) ;
>
> ) ;
//Создание диалоговых окон HELP_DIALOG и EXIT_DIALOG
Override
protected Dialog onCreateDialog ( int id )
<
switch ( id )
<
case HELP_DIALOG :
LayoutInflater inflater = ( LayoutInflater ) getSystemService ( Context . LAYOUT_INFLATER_SERVICE ) ;
View layout = inflater. inflate ( R. layout . help ,
( ViewGroup ) findViewById ( R. id . root ) ) ;
AlertDialog. Builder builder = new AlertDialog. Builder ( this ) ;
builder. setView ( layout )
. setCancelable ( true )
. setTitle ( «О приложении» )
. setNeutralButton ( «ОК» , new DialogInterface. OnClickListener ( )
<
public void onClick ( DialogInterface dialog, int id )
<
dialog. cancel ( ) ;
>
> ) ;
AlertDialog alert = builder. create ( ) ;
return builder. create ( ) ;
case EXIT_DIALOG :
AlertDialog. Builder builder3 = new AlertDialog. Builder ( this ) ;
builder3. setMessage ( «Уверены, что хотите выйти?» )
. setCancelable ( false )
. setPositiveButton ( «Да» , new DialogInterface. OnClickListener ( ) <
public void onClick ( DialogInterface dialog, int id ) <
SecondActivity. this . finish ( ) ;
>
> )
. setNegativeButton ( «Нет» , new DialogInterface. OnClickListener ( ) <
public void onClick ( DialogInterface dialog, int id ) <
dialog. cancel ( ) ;
>
> ) ;
AlertDialog alert3 = builder3. create ( ) ;
return builder3. create ( ) ;
default :
return null ;
>
//Вызов диалога EXIT_DIALOG при нажатии на клавишу back смартфона
Override
public void onBackPressed ( ) <
showDialog ( EXIT_DIALOG ) ;
>
Диалоговое окно «О приложении»
Диалоговое окно выхода из приложения
Реклама добавлена в приложение больше из интереса, чем из коммерческих соображений, т.к. очевидно, что на русском приложении много не заработать. Поэтому я подключил в него чисто русскую рекламу системы Begun, до этого на Хабре многое писалось про подключение рекламы, но в основном это были зарубежные «конторы».
Плюсы использования рекламы Бегун
1. Удобный, качественный API.
2. Удобный вывод денег на WebMoney.
3. Хорошая служба поддержки, стабильно отвечающая на любые ваши вопросы.
Минусы использования рекламы Бегун
Единственный минус заключается в том, что оплата осуществляется только за переходы, но в скором времени обещают запустить систему оплаты и за клики, и за показы.
Как подключить рекламу BEGUN
1. Заходим на сайт бегуна в раздел партнерам.
2. Жмем «Стать партнером».
3. Заполняем анкету.
4. Жмем зарегестрироваться.
5. Далее входим в свой кабинет на сайте.
6. В правом верхнем углу жмете «Написать» (Перейдете в меню написания письма в службу поддержки).
7. Пишите в службу поддержки о том, что у вас есть android-приложение и вы бы хотели подключить в него рекламу Begun, вам вышлют ваш pad_id и block_id, которые в ы и вставляете в код, написанный выше, вместо тегов .
Интеграция рекламы Begun в приложение
1. В classpath проекта необходимо добавить jar — библиотеку рекламы, доступную
по адресу appsmobile.begun.ru/begunAdView.jar.
2. Необходимо добавить в layout следующий блок:
В качестве родительского слоя рекомендуется использовать RelativeLayout.
3. Файл манифеста необходимо добавить следующие разрешения:
4. Инициализация библиотеки происходит следующим образом:
import ru.begun.adlib.AdView ;
import ru.begun.adlib.Callback ;
import ru.begun.adlib.RequestParam ;
AdView ad ;
// Получаем вид
ad = ( AdView ) findViewById ( R. id . ad ) ;
// Устанавливаем слушатели событий
// callback — слушатель, благодаря которому можно получить информацию
// о событиях в библиотеке. Пока доступны следующие листенеры: AdLoaded, AdClickThru
// и AdStopped. Для инициализации необходимо передать параметр environmentVars,
// который содержит информацию о зарегистрированной площадке в системе
// (BEGUN_PAD_ID, BEGUN_BLOCK_ID).
// Для начала инициализации необходимо вызвать метод ad.init. Затем дождаться
// callback со статусом adLoaded и только после этого вызвать метод
// ad.api(«initAd»,al);
ad. setOnApiListener ( new Callback ( ) <
Override
public void init ( ) <
ArrayList < RequestParam >al = new ArrayList < RequestParam >( ) ;
RequestParam rp = new RequestParam ( ) ;
rp. name = «environmentVars» ;
rp. value = «pad_id:|block_id:» ;
al. add ( rp ) ;
ad. api ( «initAd» , al ) ;
>
Override
public void callback ( String c ) <
if ( c. equals ( «AdLoaded» ) ) <
ad. api ( «startAd» ) ;
>
>
> ) ;
ad. init ( ) ;
Для возобновления показа рекламных объявлений после того, как библиотека была остановлена,
необходимо вызвать метод ad.api с параметром resumeAd.
Все, реклама подключена и работает!
main.xml
MatanActivity, GeomActivity и TerverActivity
После клика по элементам списка в MatanActivity, GeomActivity или TerverActivity будет осуществляться переход на соответствующую деятельность отображения материала по данной теме ViewMatanActivity, ViewGeomActivity или ViewTerverActivity
Код этих активити аналогичен указанным в посте Пишем шпаргалку на Android.
Единственное замечание во всех ViewActivity вместо кода:
WebView myWebView = ( WebView ) findViewById ( R. id . webview ) ;
String summary = «» + text + «» ;
myWebView. loadData ( summary, «text/html» , «utf-8» ) ; //загружаем текст в webview
лучше писать так:
WebView myWebView = ( WebView ) findViewById ( R. id . webview ) ;
String summary = «» + text + «» ;
myWebView. loadDataWithBaseURL ( «x-data://base» ,summary, «text/html» , «utf-8» , null ) ;
В противном случае код будет некорректно работать на устройствах с android 3.2. и некоторых других.
EmailActivity
EmailActivity реализует отправку письма со своими пожеланиями и предложениями разработчикам, а также представляет возможность перехода на страницу приложения в маркете.
public class EmailActivity extends Activity <
Button send ;
EditText address, subject, emailtext ;
Override
public void onCreate ( Bundle savedInstanceState ) <
super . onCreate ( savedInstanceState ) ;
requestWindowFeature ( Window . FEATURE_NO_TITLE ) ; //скрываем заголовок
setContentView ( R. layout . email ) ;
Button b = ( Button ) this . findViewById ( R. id . btn_market ) ;
b. setOnClickListener ( new OnClickListener ( ) <
public void onClick ( View arg0 ) <
Uri address = Uri. parse ( «market.android.com/details?id=com.mathhelper.math» ) ;
Intent surf = new Intent ( Intent. ACTION_VIEW , address ) ;
startActivity ( surf ) ;
>
> ) ;
// Наши поля и кнопка
send = ( Button ) findViewById ( R. id . emailsendbutton ) ;
address = ( EditText ) findViewById ( R. id . emailaddress ) ;
//subject = (EditText) findViewById(R.id.emailsubject);
emailtext = ( EditText ) findViewById ( R. id . emailtext ) ;
send. setOnClickListener ( new OnClickListener ( )
Override
public void onClick ( View v )
final Intent emailIntent = new Intent ( android. content . Intent . ACTION_SEND ) ;
emailIntent. setType ( «plain/text» ) ;
// Кому
emailIntent. putExtra ( android. content . Intent . EXTRA_EMAIL , new String [ ] < address. getText ( ) . toString ( ) >) ;
// О чём
emailIntent. putExtra ( android. content . Intent . EXTRA_TEXT ,emailtext. getText ( ) . toString ( ) ) ;
EmailActivity. this . startActivity ( Intent. createChooser ( emailIntent,
«Отправка письма» ) ) ;
>
> ) ;
>
>
email.xml
Файл разметки EmailActivity
Источник: habr.com
Как написать программу справочник
Питоновский словарь аналогичен HashMap в Java и Object в JavaScript.
Как создать словарь в Python: 6 способов
Пустой словарь создается с помощью фигурных скобок или функции dict():
info_dict = <> my_dict = dict()
Словари с данными, как и в случае со списками, можно создавать несколькими способами.
Способ 1: Перечисление ключей и значений
Данные словаря перечисляются в виде пар ключ: значение через запятую и заключаются в фигурные скобки:
Способ 2: Создание словаря с помощью dict()
При использовании этого метода ключи и значения тоже придется определить вручную:
>>> my_dict = dict(name = ‘Евгений’, age = 28, position = ‘Java-разработчик’) >>> print(my_dict)
Способ 3: Создание словаря с помощью zip() и dict()
Если есть два списка, в одном из которых хранятся ключи, а в другом – значения, словарь можно создать при помощи zip() и dict():
>>> keys = [‘цвет’, ‘размер’, ‘количество’, ‘цена’] >>> values = [‘синий’, ’35х45х60′, 5, 2500] >>> info = dict(zip(keys, values)) >>> print(info)
Способ 4: Создание словаря из списка кортежей и кортежа списков
Если имеется список кортежей, в которых первый элемент служит ключом, а второй – значением, словарь можно сформировать с помощью dict():
>>> item = [(‘модель’, ‘Aura’), (‘цвет’, ‘пурпурный’), (‘наличие’, ‘на складе’)] >>> item_dict = dict(item) >>> print(item_dict)
Точно так же этот подход работает с кортежeм списков:
>>> employee= ([‘имя’, ‘Никита’], [‘отчество’, ‘Сергеевич’], [‘фамилия’, ‘Колобков’], [‘возраст’, 32]) >>> empl_dict = dict(employee) >>> print(empl_dict)
Способ 5: Метод fromkeys()
Если нужно создать словарь, у всех ключей которого – одинаковые значения, можно воспользоваться методом fromkeys():
>>> new_dict = dict.fromkeys([‘север’, ‘юг’, ‘восток’, ‘запад’], 0) >>> print(new_dict)
Способ 6: Использование генератора словарей
Словари можно создавать на основе списков и строк. При этом одновременно можно проводить различные действия с числами и символами – математические операции, подсчет, сравнение и так далее:
>>> numbers = [2, 18, 5, 7, 2, 32, 6, 9, 4, 8, 9, 12, 14, 14] >>> my_dict = >>> print(my_dict)
В генераторах можно использовать преобразование типов данных и условия:
>>> st = ’12 31 4 53 6 7 4 90 8 7 56 3 42′ >>> my_dict = >>> print(my_dict)
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»
Особенности словарей
Начиная с Python 3.6, словари являются упорядоченными коллекциями – пары ключ: значение хранятся в словаре в порядке добавления. В отличие от строк и списков, словари не поддерживают срезы и конкатенацию, а к элементу словаря нельзя обратиться по индексу – в качестве индексов в словарях выступают ключи:
>>> my_dict = >>> print(my_dict[‘цвет’], my_dict[‘ количество ‘]) красный 53 кг
Ключи в словаре не должны повторяться – если добавить в словарь ключ, идентичный существующему, Python сохранит только один ключ с последним значением:
>>> my_dict = >>> print(my_dict)
В качестве ключей можно использовать все типы данных, которые относятся к неизменяемым: int, float, Boolean (True/False), frozenset, строки, кортежи. Нельзя использовать списки, обычные множества set и словари, поскольку они являются изменяемыми. При этом в качестве значения в словарях можно использовать данные любого типа, включая словари – такие словари называются вложенными:
>>> hr_info = , ‘сотрудник2’: , ‘сотрудник3’: > >>> print(hr_info[‘сотрудник2’][‘должность’]) DevOps
Методы словарей в Python 3
Словари поддерживают некоторые методы, общие с другими типами данных, и имеют несколько своих собственных. Рассмотрим общие и уникальные методы на примерах.
Длина словаря и принадлежность элемента:
>>> my_dict = >>> print(len(my_dict)) 4 >>> print(‘есть на складе’ if ‘футболка’ in my_dict else ‘нет в наличии’) нет в наличии
Сумма ключей, максимальный и минимальный элементы
Функция sum() подсчитывает сумму ключей словаря и работает только в том случае, когда ключи являются числами:
>>> my_dict = >>> print(sum(my_dict)) 13
Функции min() и max() работают для большинства типов данных:
>>> my_dict = >>> print(min(my_dict), max(my_dict)) количество цена >>> print(min(my_dict, key=len)) цена
Объединение словарей
Словари можно объединять – если в них есть одинаковые ключи, в полученном словаре значение будет взято из последнего словаря:
>>> my_dict1 = >>> my_dict2 = >>> print(<**my_dict1, **my_dict2>)
Сравнение словарей
Словари считаются одинаковыми, если в них совпадают и ключи, и значения:
>>> my_dict = >>> my_dict2 = >>> print(my_dict == my_dict2) False
Получение ключей, значений и элементов
Для работы с ключами используется метод keys(), со значениями – values(), с парами – items():
>>> my_dict = >>> print(my_dict.values()) dict_values([‘чай’, 100, 550, 256]) >>> print(my_dict.keys()) dict_keys([‘напиток’, ‘вес’, ‘цена’, ‘количество’]) >>> print(my_dict.items()) dict_items([(‘напиток’, ‘чай’), (‘вес’, 100), (‘цена’, 550), (‘количество’, 256)])
Добавление и изменение элементов
Для изменения значения какого-либо ключа используют оператор присваивания = :
>>> my_dict = >>> my_dict[‘имя’] = ‘Евгений’ >>> print(my_dict)
Если же такого ключа в словаре еще нет, новый элемент будет добавлен автоматически:
>>> my_dict = >>> my_dict[‘фамилия’] = ‘Егоров’ >>> print(my_dict)
Однако если обратиться к несуществующему элементу без присвоения ему значения, произойдет ошибка:
>>> my_dict = >>> print(my_dict[‘город’]) Traceback (most recent call last): File «», line 1, in KeyError: ‘город’
Получение значения по ключу – get()
Чтобы избежать появления показанной выше ошибки, используют метод get(), которому можно передать значение по умолчанию – оно выведется, если такого ключа в словаре нет:
>>> my_dict = >>> print(my_dict.get(‘зарплата’, ‘не указана’)) не указана
Получение значения и/или добавление элемента с setdefault()
Другой метод для получения значения – setdefault(). Он действует двумя разными способами:
1) Если указанный ключ уже есть в словаре – возвращает его значение (даже при наличии значения по умолчанию):
>>> my_dict = >>> print(my_dict.setdefault(‘возраст’, ‘не указан’)) 25
2) Если ключа нет – вставляет элемент в словарь, возвращает значение:
>>> my_dict = >>> print(my_dict.setdefault(‘зарплата’, 150000)) 150000 >>> print(my_dict)
Дополнение словаря
Элементы одного словаря можно «обновить», дополнить элементами другого. В случае совпадения ключей, как и при показанном ранее объединении словарей, сохраняются значения второго словаря:
>>> my_dict1 = >>> my_dict2 = >>> my_dict1.update(my_dict2) >>> print(my_dict1)
Удаление элементов словаря
Как и в случае со списками, удалять элементы из словарей можно несколькими способами:
del – удаляет элемент с заданным ключом:
>>> my_dict = >>> del my_dict[‘название’] >>> print(my_dict)
pop() – возвращает удаленное значение:
>>> my_dict = >>> фильм = my_dict.pop(‘название’) >>> print(фильм) Зеленая миля
popitem() – удаляет последний добавленный элемент и возвращает его ключ: значение в виде кортежа:
>>> my_dict = >>> movie = my_dict.popitem() >>> print(movie) (‘название’, ‘Властелин колец’)
clear() – удаляет все элементы словаря:
>>> my_dict = >>> my_dict.clear() >>> print(my_dict) <>
Создание копии словаря
Копия словаря создается тем же методом, что и в случае со списками – с помощью copy():
>>> my_dict = >>> new_dict = my_dict.copy() >>> print(new_dict)
Практика
Задание 1
Напишите программу, которая получает на вход две строки, и формирует из них словарь. Ключами служат слова из первой строки, значениями – целые числа из второй.
Пример ввода:
яблоки сливы груши персики манго киви апельсины 34 56 23 89 55 32 11
keys = input().split() values = map(int, input().split()) my_dict = dict(zip(keys, values)) print(my_dict)
Задание 2
Напишите программу, которая получает на вход строку чисел, разделенных пробелами, и формирует словарь, в котором ключами служат четные числа, а значениями – слово четное .
Пример ввода:
45 6 8 23 21 87 65 45 38
nums = map(int, input().split()) my_dict = print(my_dict)
Задание 3
Напишите программу, которая получает на вход строку и подсчитывает, сколько раз в ней встречается каждый символ (независимо от регистра). Результат нужно вывести без фигурных скобок.
Пример ввода:
Есть только один способ избежать критики: ничего не делайте, ничего не говорите и будьте никем.
е-11 с-3 т-7 ь-4 -14 о-9 л-2 к-4 д-3 и-10 н-6 п-1 б-3 з-1 ж-1 а-2 р-2 :-1 ч-2 г-3 й-1 ,-1 в-1 у-1 м-1 .-1
st = input().lower() my_dict = print(*[str(k) + ‘-‘ + str(v) for k, v in my_dict.items()])
Задание 4
Напишите программу, которая получает 2 слова на разных строках и определяет, являются ли эти слова анаграммами.
Пример ввода 1:
меч мяч
Пример ввода 2:
Минотавр Норматив
Источник: proglib.io