1

文字列の形式は のようなもの"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

最初の方法のf1()方が速いように見えますが、私のアプリケーションでは、何百万回も呼び出されるため、まだ多くの時間 (全体の約 30%) を使用しています。

もっと効果的な方法はありますか?それともcython

4

2 に答える 2

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'}

これsplitは、キーと値のペア ( p) を取得するための文字列で、最初にスペースが続きます。次に、各ペアを「:」で分割して、ディクショナリに追加する各キー/値を生成します。

変換は行われていないことに注意してください。すべてのキー/値は引き続き文字列です。これ以上のことを行うには、入力文字列を期待される型に変換するややスマートな関数が必要になります。

于 2013-05-30T03:45:41.710 に答える
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())

{'a': 1, 'c': 'x', 'b': 2, 'd': 2.13e-05}
于 2013-05-30T03:48:55.020 に答える