Python >> Tutoriel Python >  >> Python

Comment convertir une chaîne en dictionnaire en Python ?

Formulation du problème

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

Input:
'{"1": "hi", "2": "alice", "3": "python"}'

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

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 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 en un dictionnaire Python au moyen du eval() fonction.

s = '{"1": "hi", "2": "alice", "3": "python"}'

d = eval(s)

print(d)
print(type(d))

La sortie est :

{'1': 'hi', '2': 'alice', '3': 'python'}
<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 un littéral de chaîne tel qu'un dictionnaire représenté par une chaîne. 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. De cette façon, vous pouvez convertir une représentation sous forme de chaîne s d'un dictionnaire en utilisant l'expression ast.literal_eval(s) .

import ast

s = '{"1": "hi", "2": "alice", "3": "python"}'
d = ast.literal_eval(s)

print(d)
print(type(d))

La sortie est :

{'1': 'hi', '2': 'alice', '3': 'python'}
<class 'dict'>

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

Pour convertir une représentation sous forme de chaîne d'un dict en dict, utilisez le json.loads() méthode sur la chaîne. Tout d'abord, remplacez tous les guillemets simples par des guillemets doubles échappés en utilisant l'expression s.replace("'", """) pour le faire fonctionner avec la bibliothèque JSON en Python. L'expression json.loads(s.replace("'", """)) convertit la chaîne s à un dictionnaire.

import json

s = '{"1": "hi", "2": "alice", "3": "python"}'

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

print(d)
print(type(d))

La sortie est :

{'1': 'hi', '2': 'alice', '3': 'python'}
<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 en dictionnaire en divisant la représentation sous forme de chaîne en une séquence de paires (clé, valeur). Ensuite, vous pouvez ajouter chaque paire (clé, valeur) à un dictionnaire initialement vide après un peu de ménage.

Voici une implémentation en Python nu :

s = '{"1": "hi", "2": "alice", "3": "python"}'

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 :

{'1': 'hi', '2': 'alice', '3': 'python'}
<class 'dict'>

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