将列表的字符串表示形式转换为实际的列表对象

Mar*_*kum 79 python string list

我有一个看起来与列表相同的字符串,让我们说:

fruits = "['apple', 'orange', 'banana']"
Run Code Online (Sandbox Code Playgroud)

将它转换为列表对象的方法是什么?

fra*_*xel 108

>>> fruits = "['apple', 'orange', 'banana']"
>>> import ast
>>> fruits = ast.literal_eval(fruits)
>>> fruits
['apple', 'orange', 'banana']
>>> fruits[1]
'orange'
Run Code Online (Sandbox Code Playgroud)

正如评论中指出的,ast.literal_eval安全的.来自文档:

安全地评估表达式节点或包含Python表达式的字符串.提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,dicts,布尔值和None.

这可以用于安全地评估包含来自不可信来源的Python表达式的字符串,而无需自己解析值.

  • 请注意:`ast.literal_eval`仅对文字成功,而不是其他任何内容.它确实保护你的程序免受代码注入,例如``['apple','orange','banana']; import os; os.remove('a_file')"`将失败并带有`literal_eval` (4认同)
  • *注意*:如果调用数组内部的函数(或除字符串,数字,元组,列表,dicts,布尔值和None之外的任何类型),则此方法无效.对于这些情况,您可以使用`eval`. (2认同)

Ósc*_*pez 25

一个简单的电话eval()会做:

fruits = eval("['apple', 'orange', 'banana']")
fruits
> ['apple', 'orange', 'banana']
Run Code Online (Sandbox Code Playgroud)

或者正如本文中所解释的那样,可以更安全地完成相同的操作(意思是:不会产生意外的副作用或恶意代码注入的风险),如下所示:

fruits = eval("['apple', 'orange', 'banana']", {'__builtins__':None}, {})
Run Code Online (Sandbox Code Playgroud)

该解决方案具有不依赖于附加模块的优点.

  • -1这里没有理由使用`eval()`.`ast.literal_eval()`将以更好,更安全的方式完成工作. (8认同)
  • 使用`eval(frtstring,{__ builtins __:None},{})可以更安全地完成此操作. (5认同)
  • 虽然`ast.literal_eval`对此更好,但'eval`有效(并且它偶尔会有用,因此值得了解).我没有看到任何理由进行投票,因为它确实做了问题(+1来自我). (4认同)
  • @mgilson:使用`eval()`有严重的安全隐患,即使``''__ builtin ___':无}也不会让你失望. (3认同)