У меня есть словарь, который выглядит так:
my_string = "{'C': [(1, 2, 'string'), (3, 4, 'second string')]}"
по какой-то причине, хотя это выглядит как dict
, когда я проверяю type(my_string)
, это оказывается строкой.
Когда я пытаюсь преобразовать его в словарь с помощью dict(my_string)
, я получаю сообщение об ошибке:
ValueError: dictionary update sequence element #0 has length 1; 2 is required
Это было строковое представление словаря, созданного: data = pickle.loads(open(PATH, 'rb').read())
Вы можете использовать ast.literal_eval
, доступный из python 2.6:
import ast
my_string = "{'C': [(1, 2, 'string'), (3, 4, 'second string')]}"
my_dic = ast.literal_eval(my_string)
print(type(my_dic))
print(my_dic)
выход:
$ python conv_dic.py
<type 'dict'>
{'C': [(1, 2, 'string'), (3, 4, 'second string')]}
Если это строка, вы должны иметь возможность использовать ast.literal_eval
из библиотеки абстрактного синтаксического дерева, чтобы разобрать ее в словарь.
Safely evaluate an expression node or a string containing a Python literal or container display. The string or node provided may only consist of the following Python literal structures: strings, bytes, numbers, tuples, lists, dicts, sets, booleans, and None.
import ast.literal_eval()
s = "{'C': [(1, 2, 'string'), (3, 4, 'second string')]}"
d = ast.literal_eval(s)
print(type(d))
# dict
print(d)
# {'C': [(1, 2, 'string'), (3, 4, 'second string')]}
Во всяком случае, у нас тот же ответ +1!
Другой вариант — использовать json.loads
для разбора строки как объекта json.
Это означает, что строка должна быть действительной json, что в вашем случае приводит к некоторым довольно неудобным операциям замены символов '
, (
и )
:
>>> import json
>>> s = "{'C': [(1, 2, 'string'), (3, 4, 'second string')]}"
>>> s.replace("'", '"').replace('(', '[').replace(')', ']')
>>> s
'{"C": [[1, 2, "string"], [3, 4, "second string"]]}'
>>> d = json.loads(s)
>>> d
{'C': [[1, 2, 'string'], [3, 4, 'second string']]}
Использование Python 3.7 работает. my_string = {'C': [(1, 2, 'строка'), (3, 4, 'вторая строка')]} test =dict(my_string)