我有一个字符串s
(注意a
andb
没有用引号括起来,所以它不能直接被评估为 a dict
):
s = '{a:1,b:2}'
我想将此变量转换为dict
这样的:
{'a':1,'b':2}
我怎样才能做到这一点?
我有一个字符串s
(注意a
andb
没有用引号括起来,所以它不能直接被评估为 a dict
):
s = '{a:1,b:2}'
我想将此变量转换为dict
这样的:
{'a':1,'b':2}
我怎样才能做到这一点?
这将适用于您的示例:
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
模块来制作更好的示例,但我不太清楚它的内部结构,所以我怀疑我是否有时间做出这个答案。
由于您的字符串格式错误为 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}
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))
你可以这样做:
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(","))
作为奖励,此版本还从键中去除空格以显示它是多么简单。
import simplejson
s = '{a:1,b:2}'
a = simplejson.loads(s)
print a