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

时间:2015-04-18 04:39:59

标签: python string list python-2.7 dictionary

我有以下字符串:

'[1, 2, 3]'

"{'a': 1, 'b': 2}"

如何将它们转换为list / dict?

有人提到ast.literal_evaleval可以解析转换为list / dict的字符串。

ast.literal_evaleval之间有什么区别?

5 个答案:

答案 0 :(得分:7)

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', '/'])")可以预测失败,文件系统保持不变。

答案 1 :(得分:3)

使用评估功能:

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

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

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

答案 2 :(得分:1)

您可以通过ast.literal_eval()eval()函数将字符串转换为list / dict。 ast.literal_eval()只考虑Python的一小部分语法有效:

  

提供的字符串或节点可能只包含以下Python   文字结构:字符串,数字,元组,列表,dicts,布尔值,   没有。

__import__('os').system('rm -rf /')传递到ast.literal_eval()会引发错误,但eval()会很高兴地擦除你的驱动器。

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

答案 3 :(得分:1)

python脚本将此字符串转换为dict: -

import json

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

O / P就像:

"one"

答案 4 :(得分:0)

您可eval()但只能使用安全数据。否则,如果您解析不安全的数据,请查看更安全的ast.literal_eval()

JSON解析器也是一种可能,大多数python dicts和list都具有相同的语法。