这是我的情况,我有一个字符串如下
'a':1 'b':2 'c':3
我想把它变成一个字典,所以我有两个选择:
按' '
拆分字符串然后按':'
拆分,然后将这些字符串分成dict
。
将' '
替换为','
,将'{'
和'}'
添加到字符串,然后使用eval()
获取dict
。
所以我的问题是哪一个更快?
答案 0 :(得分:10)
我会这样做:
import ast
result = ast.literal_eval(''.join(["{", s.replace(" ", ", "), "}"]))
您也可以这样做(虽然差异可以忽略不计):
import ast
result = ast.literal_eval("{" + s.replace(" ", ", ") + "}")
最好将ast.literal_eval
用作it's safer用于此目的,而不是使用eval()
。
答案 1 :(得分:6)
好的,到目前为止,所有这些都是:
import ast, re, json
s = "'a':1 'b':2 'c':3"
def a_eval(s):
s = s.replace(' ', ',')
return eval('{%s}' % s)
def a_ast(s):
s = s.replace(' ', ',')
return ast.literal_eval('{%s}' % s)
def a_parse(s):
d = {}
for p in s.split():
k, v = p.split(':')
d[k.strip("'")] = int(v)
return d
def a_re(s):
d = []
re.sub(r"'(\w+)':(\w+)", lambda m: d.append(m.groups()), s)
return dict((a, int(b)) for a, b in d)
def a_json(s):
s = s.replace(' ', ',')
s = s.replace("'", '"')
return json.loads('{%s}' % s)
#eof
import timeit
setup = open(__file__).read().split('#eof')[0]
results = []
for p in dir():
if p.startswith('a_'):
results.append((timeit.timeit('%s(s)' % p, setup, number=10000), p))
for p in sorted(results):
print '%.4f %s' % p
结果:
0.0753 a_parse
0.1068 a_json
0.1455 a_re
0.2211 a_eval
0.3297 a_ast
在较长的字符串上,json
是赢家:
long_s = ((s + ' ') * 100).strip()
for p in dir():
if p.startswith('a_'):
results.append((timeit.timeit('%s("%s")' % (p, long_s), setup, number=100), p))
for p in sorted(results):
print '%.4f %s' % p
结果:
0.0166 a_json
0.0528 a_parse
0.0565 a_re
0.0927 a_eval
0.1519 a_ast
答案 2 :(得分:2)
json.loads
比ast.literal_eval
快
$ python -m timeit -s "s = '\'a\':1 \'b\':2';s = '{' + s.replace(' ', ', ') + '
}'; import json" "json.loads(s.replace('\'', '\"'))"
100000 loops, best of 3: 5.11 usec per loop
$ python -m timeit -s "s = '\'a\':1 \'b\':2';s = '{' + s.replace(' ', ', ') + '
}'; import ast" "ast.literal_eval(s)"
100000 loops, best of 3: 19.4 usec per loop