Python >> Tutoriel Python >  >> Python

Comment convertir une représentation sous forme de chaîne d'un dictionnaire en dictionnaire ?

Problème :Comment convertir le str représentation d'un dict en un dict ?

Exemple :Créons une liste de joueurs NBA. Vous avez LeBron là-bas, Harden, Steph et tous les gars talentueux. Faites en sorte qu'il ressemble à ceci.

basketball = '{"LeBron James": "Los Angeles Lakers", "James Harden" : "Houston Rockets", "Stephen Curry" : "Golden State Warriors", "Trae Young" : "Atlanta Hawks", "Luka Doncic" : "Dallas Mavericks", "Giannis Antetokounmpo" : "Milwaukee Bucks", "Bradley Beal" : "Washington Wizards", "Anthony Davis" : "Los Angeles Lakers", "Kawhi Leonard" : "Los Angeles Clippers", "Jamal Murray" : "Denver Nuggets"}'

Cela ressemble à un dictionnaire, mais ce n'en est pas un. C'est une chaîne. Comment passer d'une chaîne à un dictionnaire ?

Présentation de la solution :Vous pouvez le faire en le convertissant en dictionnaire. Vous pourriez le faire longuement en tapant tout, mais cela impliquerait de faire quelques ajustements. Au lieu de cela, il existe plusieurs façons de le faire et un grand NON-NON que vous ne devriez pas utiliser (Méthode 1) :

Exercice :Exécutez le code. Les trois variables sont-elles toutes de type dictionnaire ?

Commençons par celui que vous ne devriez pas utiliser.

Méthode 1 :eval() est dangereux

La fonction eval de Python est intégrée et cela peut sembler être une bonne idée à utiliser. Cependant, en utilisant le eval() La fonction est dangereuse car elle peut exécuter toutes sortes de code Python sur votre système d'exploitation, comme la suppression ou la création de fichiers. Vous ne devriez jamais faire confiance au code d'Internet qui est emballé dans un eval() ou exec() fonction!

Ned Batchelder couvre bien ce sujet dans son blog. Même avec les protections que vous mettez en place, cela pourrait ne pas suffire.

d = eval(basketball)

Le eval() La fonction évalue la chaîne et comprend qu'il s'agit d'un dictionnaire. Donc, il renvoie le dictionnaire. Le résultat est stocké dans la variable d .

Au fur et à mesure que vous commencez à travailler avec Python, vous devez faire attention à ne pas utiliser d'options telles que eval() . Le fait est qu'il existe de meilleures options à utiliser. Et il existe une alternative simple qui peut vous mener là où vous voulez.

Méthode 2 :AST

AST est un autre module intégré pour Python. Vous n'avez pas besoin d'installer AST car il est juste là pour vous. Importez-le simplement en haut de votre code en utilisant import ast . La bibliothèque aide l'interpréteur Python à analyser l'arbre de syntaxe abstraite, ce que vous pouvez appeler la "grammaire de votre code".

Vous aurez spécifiquement besoin d'utiliser literal_eval (ou ast.literal_eval ). Vous pouvez évaluer la chaîne qui contient un affichage littéral ou conteneur. Cela fonctionne pour toutes les structures Python, y compris les dictionnaires.

d = ast.literal_eval(basketball)

Pour cette instance, vous l'utiliseriez comme ceci. L'utilisation de cette méthode vous permet de convertir votre chaîne en dictionnaire.

Si cela vous aide, vous pouvez toujours essayer de créer une petite comparaison entre les deux. Si vous avez besoin de plus de conviction, créez une déclaration d'impression. Cela montrera que vous avez une classe qui est un dictionnaire. Si ce n'est pas le cas, vous voudrez peut-être vérifier à nouveau votre code.

print(type(d))

Il s'agit de la solution la plus courante au problème. Comparez cet article pour en savoir plus !

Mais si vous cherchez quelque chose de différent, nous avons une autre option à vous proposer.

Méthode 3 :JSON

JSON signifie JavaScript Object Notation. Il utilise la syntaxe JavaScript, mais il est utilisé pour plus que JavaScript.

Tout comme avec AST, JSON est un module intégré pour Python, ce qui signifie que vous n'aurez jamais besoin de l'installer. Il vous suffit de saisir import json en haut de votre script.

Pour cet exemple, nous utiliserons la méthode json.loads, qui équivaut à lire le fichier, ou dans ce cas notre futur dictionnaire.

Maintenant, vous vous demandez peut-être pourquoi nous n'utiliserions pas json.load . Il y a une bonne raison à cela. Avec la fonction de chargement, cela suppose que vous avez déjà configuré un fichier JSON. L'utilisation de charges vous permet de convertir votre chaîne, dans ce cas, en dictionnaire.

Si vous deviez utiliser json.load() , vous obtiendrez une erreur d'attribut. Veuillez ajouter le "s" après le chargement. Vous nous remercierez plus tard.

d = json.loads(basketball)

Pour notre exemple, nous vous recommandons de le transformer en variable.

C'est si facile. Lorsque vous l'exécuterez, vous verrez qu'il se transforme en un dictionnaire Python. Mais comment savoir si la conversion a fonctionné ? Eh bien, c'est similaire à la méthode précédente. Vous avez quelques options vers lesquelles vous pouvez vous tourner. Mais le meilleur est de loin d'utiliser la fonction type. C'est juste bon à utiliser. Et comme nous l'avons mentionné ci-dessus, vous pouvez le faire pour comparer les deux variables.

Maintenant, comment voudriez-vous non seulement convertir la chaîne en dictionnaire, mais aussi l'écrire dans un fichier JSON ? C'est assez facile à faire, surtout si vous avez déjà écrit des fichiers en Python.

Vous voudrez utiliser une instruction with open pour écrire votre fichier JSON en utilisant "w" pour l'écriture. La seule différence est ce que vous écrivez dans la ligne suivante. Au lieu d'utiliser l'écriture, vous utiliseriez json.dump() ainsi que la variable et le fichier de sortie. Cela ressemblera à ceci.

with open("players.json", "w") as f:
	json.dump(d, f)

Lorsque vous avez terminé, il écrit le dictionnaire JSON complet dans votre fichier. Vous pouvez l'ouvrir et le tour est joué, c'est comme par magie.

Quelle que soit la route que vous décidez d'emprunter, vous disposez de solutions qui peuvent vous être utiles. Et hé, nous espérons que vous en avez appris quelque chose.