web-dev-qa-db-fra.com

Conversion d'une représentation sous forme de chaîne d'une liste en un objet de liste réel

J'ai une chaîne qui ressemble à une liste, disons:

fruits = "['Apple', 'orange', 'banana']"

Quelle serait la façon de convertir cela en un objet liste?

75
Markum
>>> fruits = "['Apple', 'orange', 'banana']"
>>> import ast
>>> fruits = ast.literal_eval(fruits)
>>> fruits
['Apple', 'orange', 'banana']
>>> fruits[1]
'orange'

Comme indiqué dans les commentaires ast.literal_eval est sûr . De la documentation:

Évaluez en toute sécurité un nœud d'expression ou une chaîne contenant une expression Python. La chaîne ou le nœud fourni ne peut être composé que des structures littérales Python littérales: chaînes, nombres, tuples, listes, dict, booléens et Aucun.

Cela peut être utilisé pour évaluer en toute sécurité des chaînes contenant des expressions Python provenant de sources non fiables sans avoir besoin d'analyser les valeurs soi-même.

104
fraxel

Un simple appel à eval() fera:

fruits = eval("['Apple', 'orange', 'banana']")
fruits
> ['Apple', 'orange', 'banana']

Ou comme expliqué dans cet article , la même chose peut être accomplie un peu plus en toute sécurité (ce qui signifie: sans risquer d'effets secondaires involontaires ou d'injections de code malveillantes) comme ceci:

fruits = eval("['Apple', 'orange', 'banana']", {'__builtins__':None}, {})

Cette solution a l'avantage de ne pas dépendre de modules supplémentaires.

24
Óscar López

Je pense que c'est à ça que sert ast.literal_eval.

( http://docs.python.org/library/ast.html#ast.literal_eval )

2
mgilson