Программистам постоянно приходится преобразовывать различные типы данных, и очень важно делать это правильно. В этой статье мы разберем, как можно преобразовать строку в словарь.
Давайте вкратце припомним, что собой представляют строки и словари. Строка — это коллекция символов, каждый из которых, в принципе, тоже считается строкой, поскольку в Python нет соответствующего символьного типа данных. Словарь в Python хранит данные в виде пар ключ-значение. Ключи в словаре должны быть уникальны.
От редакции Pythonist: подробнее о строках читайте в статье «Строки в Python».
А теперь перейдем непосредственно к преобразованию строк в словари.
Конвертируем строку в словарь
Использование метода json.loads ()
Мы можем преобразовать строку в словарь с помощью функции json.loads(). Чтобы ее использовать, нужно импортировать модуль json.
# Импортировать json
import json
# Инициализировать строку
string = '{"bird1": "Pigeon", "bird2": "Peacock", "bird3": "Eagle", "bird4": "Dove"}'
# Вывести строку
print("String is ", string)
# Преобразовать строку в словарь при помощи json.loads()
res_dict = json.loads(string)
# Вывести словарь
print("The resultant dictionary is ", res_dict)
# Результат:
# String is {"bird1": "Pigeon", "bird2": "Peacock", "bird3": "Eagle", "bird4": "Dove"}
# The resultant dictionary is {'bird1': 'Pigeon', 'bird2': 'Peacock', 'bird3': 'Eagle', 'bird4': 'Dove'}
Сперва мы инициализируем строку, которую затем будем преобразовывать в словарь. Для инициализации используется переменная string. В этой строке содержатся названия разных видов птиц. При помощи оператора print выводим нашу строку.
Далее мы преобразуем строку в словарь при помощи функции json.loads(). В качестве параметра этой функции передается переменная string. Результат работы функции (словарь) мы присваиваем переменной res_dict. Затем при помощи оператора print выводим наш словарь.
Использование метода ast.literal.eval()
Еще одна функция, которую применяют для преобразования строк в словари, — ast.literal.eval(). Чтобы ее использовать, нужно импортировать библиотеку ast.
# Импортировать ast
import ast
# Инициализировать строку
string = '{"game1": "Cricket", "game2": "Football", "game3": "badminton"}'
# Вывести строку
print("String is ", string)
# Преобразовать строку в словарь при помощи ast.literal_eval()
res_dict = ast.literal_eval(string)
# Вывести словарь
print("The resultant dictionary is ", res_dict)
# Результат:
# String is {"game1": "Cricket", "game2": "Football", "game3": "badminton"}
# The resultant dictionary is {'game1': 'Cricket', 'game2': 'Football', 'game3': 'badminton'}
Сначала мы импортируем библиотеку ast. Затем инициализируем строку string, содержащую названия игр. При помощи оператора print выводим нашу строку.
После этого мы конвертируем строку в словарь при помощи функции ast.literal_eval(). В качестве параметра мы передаем ей нашу строку. Результат присваиваем переменной res_dict. После этого снова вызываем оператор print для вывода словаря.
Использование генераторного выражения
Для преобразования строки в словарь можно использовать и генераторное выражение.
# Инициализировать строку
string = "Amna - 80, Sara - 100, Javed - 65, Saim - 93, Bilal - 100"
# Вывести строку
print("String is ", string)
# Преобразовать строку в словарь, используя strip() и split()
res_dict = dict((a.strip(), int(b.strip()))
for a, b in (element.split('-')
for element in string.split(', ')))
# Вывести словарь
print("The resultant dictionary is ", res_dict)
print(type(res_dict))
# Результат:
# String is Amna - 80, Sara - 100, Javed - 65, Saim - 93, Bilal - 100
# The resultant dictionary is {'Amna': 80, 'Sara': 100, 'Javed': 65, 'Saim': 93, 'Bilal': 100}
# <class 'dict'>
Здесь мы инициализируем строку string, в которой будущие пары ключей и значений разделены дефисами и идут через запятую. Наша строка содержит имена студентов и их оценки.
Во вложенном цикле for мы используем строковые функции strip() и split(), чтобы привести пары ключ-значение к нормальному для словаря виду.
Функция split() делит строку на отдельные подстроки, используя в качестве разделителей запятые и дефисы. Функция strip() удаляет пробелы между подстроками. Эта техника не очень эффективна при преобразовании строк, поскольку для получения результата требуется много времени.
В заключение мы распечатали созданный словарь и убедились, что получили именно словарь, выведя его тип.
От редакции Pythonist: о методе split() читайте в статье «Строковые методы split() и join() в Python».
Заключение
В этой статье мы на примерах разобрали три способа преобразовать строку в словарь. Мы сделали это при помощи функции json.loads() из модуля json, функции ast.literal.eval() из модуля ast. Также мы показали, как можно конвертировать строку в словарь при помощи генераторного выражения. Этот способ, пожалуй, самый запутанный, зато позволяет преобразовать в словарь строку, изначально не отформатированную по типу словарных пар ключ-значение.
Перевод статьи Kalsoom Bibi «Python String to a Dict».

