将Python中列表的字符串表示转换为字典

3

如何将类似下面的字符串表示的list转换成一个dictionary?

a = '[100:0.345,123:0.34,145:0.86]'

期望输出:

{100:0.345,123:0.34,145:0.86}

首先尝试使用ast.literal_eval将字符串转换为列表,但是出现了错误:无效语法

5个回答

8
由于使用了错误的括号,导致显示为无效语法,可以将其更改为


ast.literal_eval(a.replace("[","{").replace("]", "}"))

或者您可以自己在字典理解中解析字符串。
{x.split(":")[0]: x.split(":")[1] for x in a[1:-1].split(",")}

如果你的字符串中有其他的[],那么以下方法可能更加健壮。

ast.literal_eval("{" + a[1:-1] +"}")

2
如果在引号字符串字面值内部有额外的 [],例如 '[100:"[",123:0.34,145:0.86]',则此方法将无法正常工作。 - blhsing
2
@blhsing请查看编辑,其中的方法应该更加稳健。 - Sven Harris

5
我会尝试一下。
eval(a.replace('[', '{').replace(']', '}'))

1
为什么使用eval是一种不好的做法 - ast.literal_eval更安全。 - Patrick Artner
1
这取决于变量 a 来自哪里... 如果它不是来自用户输入,那么为了这个目的而导入 ast 可能会有些麻烦。 - Aemyl

1
将其转换为字典:

代码:

data = '[100:0.345,123:0.34,145:0.86]'

new_data = dict(y.split(':') for y in (x.strip().strip('[').strip(']')
                                       for x in data.split(',')))

print(new_data)

或者,如果您需要数字而不是字符串:

new_data = dict((map(float, y.split(':'))) for y in (
    x.strip().strip('[').strip(']') for x in data.split(',')))

结果:

{'100': '0.345', '123': '0.34', '145': '0.86'}

{145.0: 0.86, 123.0: 0.34, 100.0: 0.345}

0

将括号转换为花括号,使用literal_eval函数。

rebracket = {91: 123, 93: 125}
a = '[100:0.345,123:0.34,145:0.86]'
literal_eval(a.translate(rebracket))

0

给定一个字典的字符串表示:

a = '[100:0.345,123:0.34,145:0.86]'

忽略包含的大括号[..],并在逗号上分解元素:

a = a[1:-1].split(",")

对于每个元素,分离键和值:

d1 = [x.split(":") for x in a]

将解析后的数据重组为字典:
d2 = { int(k[0]) : float(k[1]) for k in d1}

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