如何将一个看起来已经是列表的字符串转换为列表?
如何将一个看起来像列表的字符串转换成列表?
有时候我们会遇到这样的情况,我们有一个字符串,它的格式看起来像一个列表,但实际上它仍然是一个字符串。如果我们想要将它转换成真正的列表,我们可以使用Python中的ast模块中的literal_eval()函数。
使用ast.literal_eval()函数可以解析包含Python字面值的字符串。它比使用eval()函数更安全,因为它会拒绝解析任何不是字面值的内容。下面是一个示例:
import ast ast.literal_eval("['11', '20', '0']")
输出结果为:['11', '20', '0']
另一方面,使用eval()函数则没有这种限制,它可以解析任何字符串。下面是一个使用eval()函数的示例:
eval("__import__('sys').version")
输出结果为:'2.7.5 (default, Oct 28 2013, 20:45:48) \n[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)]'
可以看到,eval()函数可以解析字符串中的任何内容,甚至是一些恶意代码。因此,为了安全起见,我们推荐使用ast.literal_eval()函数。
感谢提问者指出了与eval()函数的区别。
希望这个方法能对你有所帮助!
问题的出现原因是,有时候我们会遇到一个看起来像列表的字符串,但实际上它是一个字符串。这种情况下,我们需要将这个字符串转换成真正的列表。解决这个问题的方法是使用Python的ast模块中的literal_eval函数。
首先,我们导入ast模块:
import ast
然后,我们定义一个字符串s,它看起来像一个列表:
s = "['11', '20', '0']"
接下来,我们使用literal_eval函数将字符串转换成列表:
lst = ast.literal_eval(s)
现在,lst变量就是一个真正的列表了:
lst ['11', '20', '0']
如果我们希望将列表中的元素转换成整数,我们可以使用int()函数结合map函数或列表推导:
map(int, lst) [11, 20, 0]
最后,我们还可以通过调用help函数来查看literal_eval函数的帮助文档,以了解更多关于该函数的信息:
help(ast.literal_eval)
literal_eval函数的帮助文档告诉我们,它可以安全地评估一个表达式节点或包含Python表达式的字符串。提供的字符串或节点只能包含以下Python文字结构: 字符串、数字、元组、列表、字典、布尔值和None。