Python >> Tutoriel Python >  >> Python

Comment convertir une chaîne Unicode en dictionnaire en Python ?

Formulation du problème

Étant donné une représentation sous forme de chaîne Unicode d'un dictionnaire. Comment le convertir en dictionnaire ?

Input:
u"{'a': 1, 'b': 2, 'c': 3}"

Output: 
{'a': 1, 'b': 2, 'c': 3}

Remarque :Le u'string' représente une chaîne Unicode qui a été introduite dans Python 3. Ceci est redondant car toutes les chaînes de Python 3 sont des chaînes Unicode.

Méthode 1 :eval()

Le eval() intégré La fonction prend un argument de chaîne, l'analyse comme s'il s'agissait d'une expression de code et évalue l'expression. Si la chaîne Unicode contient une représentation textuelle d'un dictionnaire, la valeur de retour est un dictionnaire Python normal. De cette façon, vous pouvez facilement convertir une chaîne Unicode en un dictionnaire Python au moyen du eval() fonction.

s = u"{'a': 1, 'b': 2, 'c': 3}"

d = eval(s)

print(d)
print(type(d))

La sortie est :

{'a': 1, 'b': 2, 'c': 3}
<class 'dict'>

Vous pouvez en savoir plus sur le eval() intégré fonction dans la vidéo suivante :

Méthode 2 :ast.literal_eval()

Le ast.literal_eval() La méthode évalue en toute sécurité une expression ou une chaîne contenant un littéral Python tel qu'une chaîne Unicode. Il convient également aux chaînes qui proviennent potentiellement de sources non fiables, résolvant de nombreux problèmes de sécurité du eval() méthode.

import ast

s = u"{'a': 1, 'b': 2, 'c': 3}"
d = ast.literal_eval(s)

print(d)
print(type(d))

La sortie est :

{'a': 1, 'b': 2, 'c': 3}
<class 'dict'>

Méthode 3 :json.loads() &s.replace()

Pour convertir une représentation sous forme de chaîne Unicode d'un dict en dict, utilisez le json.loads() méthode sur la chaîne. Cependant, la bibliothèque JSON nécessite que vous remplaciez d'abord tous les guillemets simples par des guillemets doubles échappés à l'aide de l'expression s.replace("'", "\"") . Autrement dit, l'expression json.loads(s.replace("'", "\"")) convertit la chaîne Unicode s à un dictionnaire.

import json

s = u"{'a': 1, 'b': 2, 'c': 3}"

d = json.loads(s.replace("'", "\""))

print(d)
print(type(d))

La sortie est :

{'a': 1, 'b': 2, 'c': 3}
<class 'dict'>

Malheureusement, cette méthode n'est pas optimale car elle échouera pour les représentations de dictionnaire avec des virgules et des guillemets simples comme parties de clés ou de valeurs de dictionnaire. Ce n'est pas non plus la plus simple, donc l'approche générale discutée dans la méthode 1 est préférée.

Vous pouvez plonger plus profondément dans le string.replace() méthode dans le didacticiel vidéo suivant :

Méthode 4 :Approche itérative

Vous pouvez également convertir une chaîne Unicode en dictionnaire en divisant la représentation sous forme de chaîne en une série d'éléments de dictionnaire et en les ajoutant de manière itérative élément par élément à un dictionnaire initialement vide.

Voici une implémentation en Python nu :

s = u"{'a': 1, 'b': 2, 'c': 'hello'            }"

def string_to_dict(s):
    new_dict = {}

    # Determine key, value pairs
    mappings = s.replace('{', '').replace('}', '').split(',')
    
    for x in mappings:
        key, value = x.split(':')

        # Automatically convert (key, value) pairs to correct type
        key, value = eval(key), eval(value)

        # Store (key, value) pair
        new_dict[key] = value
        
    return new_dict


d = string_to_dict(s)

print(d)
print(type(d))

La sortie est :

{'a': 1, 'b': 2, 'c': 3}
<class 'dict'>

Vous pouvez en savoir plus sur le fractionnement de chaînes dans le didacticiel vidéo suivant :