如何在Python中将不带引号的字符串转换成字典

Har*_*son 5 python

我有一串

"{a:'b', c:'d',e:''}"
Run Code Online (Sandbox Code Playgroud)

请不要因为字典条目的键未加引号,所以上一个问题eval("{a:'b', c:'d',e:''}")所建议的简单方法不起作用。

将这个字符串转换成字典的最方便的方法是什么?

{'a':'b', 'c':'d', 'e':''}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 6

如果这是来自受信任的来源(由于eval不安全,请不要将其用于一般用户输入;但是,如果从潜在的恶意用户那里获取输入,则应使用JSON格式,而应使用json模块)可以配合使用eval

source = """{e: '', a: 'b', c: 'd'}"""

class identdict(dict):
    def __missing__(self, key):
        return key

d = eval(source, identdict())
print(d)
Run Code Online (Sandbox Code Playgroud)

版画

{'a': 'b', 'c': 'd', 'e': ''}
Run Code Online (Sandbox Code Playgroud)

这是如何工作的,我们创建了一个新的字典子类identdict来定义magic方法__missing__。调用此方法可查找字典中缺少的键。在这种情况下,我们只返回键,因此字典将键映射到它们自己。然后sourceeval使用uated identdict实例作为globals论据。evalglobals映射中查找变量的值;因为它是一个identdict,所以现在方便地访问的每个变量的值就是该变量的名称。

适用于更复杂的字符串作为值,以及适用于Python文字语法的任何东西。

  • 哈基。`"{e: '', a: 'b', if: 'd'}"` 失败。 (3认同)

Wil*_*ill 2

根据您要解析的内容的复杂性,这可能有效:

s = "{a:'b', c:'d',e:''}"
d = dict([
    (x.split(':')[0].strip(), x.split(':')[1].strip("' "))
    for x in s.strip("{}").split(',')
])
Run Code Online (Sandbox Code Playgroud)