Теперь научимся превращать строки с данными в словари.
Это полезно, если вы получаете настройки из текстового файла или обрабатываете ввод от пользователя.
Создайте функцию 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сли ни один из предыдущих способов не сработал, просто добавляем значение в словарь как есть.
Посмотреть код
Решение
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
Мой вариант решения “Словарной строки”. Более изящного способа определить является ли переменная int или float не нашел