Python将一个paritcular字符串转换为dict

zha*_*lin 1 python string dictionary

字符串的格式是这样的"a:1 b:2 c:x d:2.13e-5",是否有一些方法可以快速简单地将其转换为python dict?

--------------编辑行--------------

根据伟大的答案,我尝试了几种方法(在ipython中):

In [6]: import re

In [7]: %paste
def f1(line):
    item_dict = {}
    for item in line.split():
        kv = item.split(':')
        item_dict[kv[0]] = kv[1]

def f2(line):
    item_dict = {}
    item_pat = re.compile(r'(\w+):(.+)')
    for item in line.split():
        m_res = item_pat.match(item)
        item_dict[m_res.group(1)] = m_res.group(2)

def f3(line):
    dict(item.split(':') for item in line.split())
## -- End pasted text --

In [8]: line = 'a:1   b:3243 dsfds:4323llsjdf         \t fdsf:3232l'
In [9]: %timeit f1(line)
100000 loops, best of 3: 3.99 us per loop

In [10]: %timeit f2(line)
100000 loops, best of 3: 8.83 us per loop

In [11]: %timeit f3(line)
100000 loops, best of 3: 5.19 us per loop
Run Code Online (Sandbox Code Playgroud)

第一种方法f1()似乎更快,但在我的应用程序中,它仍然使用了很多时间(大约30%),因为它被调用了数百万次.

有没有更有效的方法?还是cython

Jon*_*art 8

>>> s = "a:1 b:2 c:x d:2.13e-5"
>>> dict( p.split(':') for p in s.split(' ') )
{'a': '1', 'c': 'x', 'b': '2', 'd': '2.13e-5'}
Run Code Online (Sandbox Code Playgroud)

split是字符串,首先是空格,以获取键值对(p).然后它用':'拆分每一对,以产生要添加到字典中的每个键/值.

请注意,没有进行任何转换.所有键/值仍然是字符串.要做得比这更好,你需要一个有点智能的功能,将任何输入字符串转换为您期望的类型.


jam*_*lak 6

import ast

def guess(s):
    try:
        return ast.literal_eval(s)
    except ValueError:
        return s    

s = "a:1 b:2 c:x d:2.13e-5"
print dict(map(guess, x.split(':')) for x in s.split())
Run Code Online (Sandbox Code Playgroud)
{'a': 1, 'c': 'x', 'b': 2, 'd': 2.13e-05}
Run Code Online (Sandbox Code Playgroud)

  • Yup`ast.literal_eval`非常适合将字符串转换为python文字(与`eval`不同,可以安全使用).http://docs.python.org/2/library/ast.html#ast.literal_eval (2认同)