J'ai un dictionnaire qui apparaît comme:
my_string = "{'C': [(1, 2, 'string'), (3, 4, 'second string')]}"
pour une raison quelconque, même s'il semble être un dict , lorsque je vérifie le type ( my_string) il semble être une chaîne.
Lorsque j'essaye de le convertir en dictionnaire par dict (my_string) , l'erreur: p >
ValueError: l'élément de séquence de mise à jour du dictionnaire # 0 a la longueur 1; 2 est obligatoire
3 Réponses :
Vous pouvez utiliser ast.literal_eval disponible à partir de python 2.6:
$ python conv_dic.py
<type 'dict'>
{'C': [(1, 2, 'string'), (3, 4, 'second string')]}
sortie:
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)
S'il s'agit d'une chaîne, vous devriez pouvoir utiliser ast.literal_eval de la bibliothèque Abstract Syntax Tree pour l'analyser en un dict.
Évaluez en toute sécurité un nœud d'expression ou une chaîne contenant un littéral Python ou un affichage de conteneur. La chaîne ou le nœud fourni ne peut être constitué que des structures littérales Python suivantes: chaînes, octets, nombres, tuples, listes, dictées, ensembles, booléens et 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')]}
Quoi qu'il en soit, nous avons la même réponse +1!
Une autre option consiste à utiliser json.loads pour analyser la chaîne en tant qu'objet json.
Cela signifie que la chaîne doit être valide json, ce qui dans votre cas conduit à des remplacer les opérations des caractères ', ( et ):
>>> 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']]}
L'utilisation de python 3.7 fonctionne. ma_string = {'C': [(1, 2, 'string'), (3, 4, 'second string')]} test = dict (ma_string)
C'était une représentation sous forme de chaîne d'un dict qui a été créé par:
data = pickle.loads (open (PATH, 'rb'). Read ())