O. Словарная строка

Теперь научимся превращать строки с данными в словари.
Это полезно, если вы получаете настройки из текстового файла или обрабатываете ввод от пользователя.

Создайте функцию get_dict(text), которая принимает строку вида:

ключ1=значение1;ключ2=значение2;...

и возвращает словарь с этими парами.

Тип ключей — всегда строка. Значения попробуйте привести к int или float, если это возможно.

Примечание

В решении не должно быть вызовов требуемых функций.

Пример

Ввод

result = get_dict('a=A;b=2;c=-3.5')

Вывод

result = {'a': 'A', 'b': 2, 'c': -3.5}

Ввод

result = get_dict('id=3-76;ip=127.0.0.1;phone=+7-(123)-456-78-90')

Вывод

result = {'id': '3-76', 'ip': '127.0.0.1', 'phone': '+7-(123)-456-78-90'}

Решение

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

Помимо этого можно проверить и дробное число не как предлагает Яндекс, а избавившись от одного (только первого) символа точки. Если у нас дробное число, то результат станет целым положительным числом и должен пройти проверку isdigit().

Итак:
1) делим с помощью split() строку на части по точке с запятой
2) проходим по полученным строкам
3) каждую строку делим с помощью split() по знаку равно
4) если у нас есть вторая часть, значит это корректная словарная пара (ключ, значение) и мы с ней работаем
5) для каждого значения избавляемся от предполагаемого минуса слева с помощью lstrip() и проверяем не получилось ли у нас числа с помощью isdigit(). Если это число, преобразуем его в целое.
6) eсли не получилось, то проверяем не дробное ли у нас число. Снова избавляемся от предполагаемого минуса слева с помощью lstrip() и вместе с этим изабавляемся от первой точки, с помощью replace(‘.’, ”, 1) и проверям получилось ли у нас число. Если да, и первый символ не точка, то мы получили дробное число.
7) eсли ни один из предыдущих способов не сработал, просто добавляем значение в словарь как есть.

Посмотреть код

Решение

Python
def get_dict(text):
    result = {}
    if not text:
        return result

    pairs = text.split(';')
    for pair in pairs:
        key, value = pair.split('=', 1)
        if value:
            if value.lstrip('-').isdigit():
                result[key] = int(value)
            elif (
                value.lstrip('-').replace('.', '', 1).isdigit()
                and value.count('.') == 1
                and value[0] != '.'
            ):
                result[key] = float(value)
            else:
                result[key] = value

    return result
Подписаться
Уведомить о
guest
1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Джеймс
Джеймс
03.09.2025 16:23

Мой вариант решения “Словарной строки”. Более изящного способа определить является ли переменная int или float не нашел

def get_dict(text):

    new_dict = {}

    for piece in text.split(';'):
        key, value = piece.split('=')
        if value[0] == '-':
            value_check = value[1:]
        else:
            value_check = value
        if ''.join(value_check.split('.')).isdigit():
            if value_check.count('.') == 1:
                value = float(value)
            elif value_check.count('.') == 0:
                value = int(value)
        new_dict[key] = value
    return new_dict