3

文字列がありますs(abは引用符で囲まれていないため、 として直接評価することはできません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(","))

簡単にするために、文字列に有効な仕様が含まれていない場合の例外処理を省略しました。また、このバージョンでは、必要に応じて空白を削除しません。キーが常に文字列で、値が常に であるという解釈を好む場合は、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 に答える