97

I have a string that looks identical to a list, let's say:

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

What would be the way to convert that to a list object?

0

3 Answers 3

148
>>> fruits = "['apple', 'orange', 'banana']"
>>> import ast
>>> fruits = ast.literal_eval(fruits)
>>> fruits
['apple', 'orange', 'banana']
>>> fruits[1]
'orange'

As pointed out in the comments ast.literal_eval is safe. From the docs:

Safely evaluate an expression node or a string containing a Python expression. The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None.

This can be used for safely evaluating strings containing Python expressions from untrusted sources without the need to parse the values oneself.

Sign up to request clarification or add additional context in comments.

4 Comments

Note: this doesn't work if you call a function inside of the array (or any type except strings, numbers, tuples, lists, dicts, booleans, and None). For these cases, you can use eval.
Note on note: ast.literal_eval is successful only for literals and nothing else. It does protect your program from code injection, for instance "['apple', 'orange', 'banana'];import os;os.remove('a_file')" will fail with literal_eval
I also have same issue but the my string list is like this fruits = "['apple', 'orange', 'banan'a']" how would you handle that comma between banana and a.
Saved me from getting into strings operations.
37

A simple call to eval() will do:

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

Or as explained in this article, the same can be accomplished a bit more safely (meaning: without risking unintended side-effects or malicious code injections) like this:

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

This solution has the advantage of not depending on additional modules.

7 Comments

This is accomplished a little more safely using eval(frtstring,{__builtins__:None},{})
-1 There is no reason to use eval() here. ast.literal_eval() will do the job in a much better, safer way.
Oops, I think it should be {'__builtins__':None}. Sorry about that.
While ast.literal_eval is better for this, eval works (and it is a useful once in a while so it is worth knowing about). I don't see any reason to downvote it since it does do what the question asked (+1 from me).
@mgilson: there are severe security implications to using eval(), that even {'__builtins__': None} is not going to save you from.
|
3

I think this is what ast.literal_eval is for.

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.