1
votes

Comment convertir une chaîne en un dictionnaire qui semble déjà être un dictionnaire?

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


2 commentaires

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 ())


3 Réponses :


0
votes

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)


0 commentaires

1
votes

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')]}


1 commentaires

Quoi qu'il en soit, nous avons la même réponse +1!



0
votes

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']]}  


0 commentaires