3

我有一个字符串s(注意aandb没有用引号括起来,所以它不能直接被评估为 a dict):

s = '{a:1,b:2}'

我想将此变量转换为dict这样的:

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

我怎样才能做到这一点?

4

5 回答 5

5

这将适用于您的示例:

import ast
def elem_splitter(s):
    return s.split(':',1)

s = '{a:1,b:2}'
s_no_braces = s.strip()[1:-1] #s.translate(None,'{}') is more elegant, but can fail if you can have strings with '{' or '}' enclosed.
elements = (elem_splitter(ss) for ss in s_no_braces.split(','))
d = dict((k,ast.literal_eval(v)) for k,v in elements)

请注意,如果您的字符串格式为:

'{s:"foo,bar",ss:2}'  #comma in string is a problem for this algorithm

或者:

'{s,ss:1,v:2}' 

但它会传递一个字符串,如:

'{s ss:1,v:2}' #{"s ss":1, "v":2}

您可能还需要elem_splitter稍微修改,具体取决于您的需要:

def elem_splitter(s):
    k,v = s.split(':',1)
    return k.strip(),v # maybe `v.strip() also?`

*其他人可能会使用更多ast模块来制作更好的示例,但我不太清楚它的内部结构,所以我怀疑我是否有时间做出这个答案。

于 2013-01-09T13:56:35.797 回答
2

由于您的字符串格式错误为 json 和 Python dict,因此您既不能使用 json.loads 而不是 ast.literal_eval 直接转换数据。

在这种特殊情况下,您必须通过了解输入数据来手动将其转换为 Python 字典

>>> foo = '{a:1,b:2}'
>>> dict(e.split(":") for e in foo.translate(None,"{}").split(","))
{'a': '1', 'b': '2'}

正如蒂姆更新的那样,我的目光短浅,我错过了值应该是整数的事实,这是一个替代实现

>>> {k: int(v) for e in foo.translate(None,"{}").split(",") 
     for k, v in [e.split(":")]}
{'a': 1, 'b': 2}
于 2013-01-09T13:56:54.950 回答
2
import re,ast
regex = re.compile('([a-z])')
ast.literal_eval(regex.sub(r'"\1"', s))

出去:

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

编辑: 如果您碰巧有{foo1:1,bar:2}向正则表达式添加额外的捕获组之类的东西:

regex = re.compile('(\w+)(:)')
ast.literal_eval(regex.sub(r'"\1"\2', s))
于 2013-01-09T14:20:09.687 回答
0

你可以这样做:

s = "{a:1,b:2}"
content = s[s.index("{")+1:s.index("}")]
to_int = lambda x: int(x) if x.isdigit() else x
d = dict((to_int(i) for i in pair.split(":", 1)) for pair in content.split(","))

为简单起见,如果字符串不包含有效规范,我将省略异常处理,并且此版本不会删除您可能想要的空格。如果您更喜欢的解释是 key 始终是 string 而 value 始终是 an int,那么它就更容易了:

s = "{a:1,b:2}"
content = s[s.index("{")+1:s.index("}")]
d = dict((int(pair[0]), pair[1].strip()) for pair in content.split(","))

作为奖励,此版本还从键中去除空格以显示它是多么简单。

于 2013-01-09T14:05:27.467 回答
-2
import simplejson
s = '{a:1,b:2}'
a = simplejson.loads(s)
print a
于 2013-01-09T13:58:26.377 回答