文字列がありますs
(a
とb
は引用符で囲まれていないため、 として直接評価することはできませんdict
):
s = '{a:1,b:2}'
この変数を次のように変換したいdict
:
{'a':1,'b':2}
これどうやってするの?
文字列がありますs
(a
とb
は引用符で囲まれていないため、 として直接評価することはできません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(","))
簡単にするために、文字列に有効な仕様が含まれていない場合の例外処理を省略しました。また、このバージョンでは、必要に応じて空白を削除しません。キーが常に文字列で、値が常に であるという解釈を好む場合は、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