如何将字符串转换为字典或列表?

9
我有类似以下的字符串:
'[1, 2, 3]'

"{'a': 1, 'b': 2}"
我该如何将它们转换为列表或字典?
有人提到,ast.literal_eval或eval可以解析转换为列表或字典的字符串。
ast.literal_eval和eval有什么区别?
5个回答

16

ast.literal_eval解析'抽象语法树'。你几乎已经有了json,可以使用json.loads,但需要双引号而不是单引号才能使字典键有效。

ast.literal_eval解析'抽象语法树'。你几乎已经有了json,可以使用json.loads,但需要双引号而不是单引号才能使字典键有效。

import ast

result = ast.literal_eval("{'a': 1, 'b': 2}")
assert type(result) is dict

result = ast.literal_eval("[1, 2, 3]")
assert type(result) is list
作为额外福利,这个方法不存在`eval`的风险,因为它不会涉及函数求值的业务。`eval("subprocess.call(['sudo', 'rm', '-rf', '/'])")` 可以删除你的根目录,但是 `ast.literal_eval("subprocess.call(['sudo', 'rm', '-rf', '/'])")`会可靠地失败,让你的文件系统保持完好。

7

使用eval函数:

l = eval('[1, 2, 3]')

d = eval("{'a':1, 'b': 2}")

请确保您知道这些字符串的来源,并且不允许用户输入被评估并执行任何恶意操作。


3

Python脚本将此字符串转换为字典:

import json

inp_string = '{"1":"one", "2":"two"}'
out = json.loads(inp_string)
print out["1"]

输出结果如下:
"one"

2
您可以使用ast.literal_eval()eval()函数将字符串转换为列表/字典。ast.literal_eval()只考虑Python的语法的一个小子集是有效的:

提供的字符串或节点只能由以下Python文字结构组成:字符串、数字、元组、列表、字典、布尔值和None。

__import__('os').system('rm -rf /')传递给ast.literal_eval()将引发错误,但eval()会愉快地清除您的驱动器。

由于看起来您只允许用户输入一个普通字典,请使用ast.literal_eval()。它安全地做你想要的事情,仅此而已。


1
你可以使用eval(),但只能使用安全的数据。否则,如果解析不安全的数据,请查看更安全的ast.literal_eval()
JSON解析器也是一种可能性,大多数Python字典和列表具有相同的语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接