web-dev-qa-db-ja.com

Pythonで、セミコロンで区切られた文字列を辞書に分割します

次のような文字列があります。

"Name1=Value1;Name2=Value2;Name3=Value3"

Pythonに組み込みのクラス/関数があります。Python$ ===は、文字列を取得して辞書を作成します。

dict = {
    "Name1": "Value1",
    "Name2": "Value2",
    "Name3": "Value3"
}

利用可能なモジュールを調べましたが、一致するものを見つけることができないようです。


おかげで、私は自分で関連するコードを作成する方法を知っていますが、そのような小さなソリューションは通常、地雷原が発生するのを待っている(つまり、誰かが書いている:Name1 = 'Value1 = 2';)などテストされた機能。

それでは自分でやります。

ビルトインはありませんが、ジェネレーターの理解でこれをかなり簡単に達成できます:

s= "Name1=Value1;Name2=Value2;Name3=Value3"
dict(item.split("=") for item in s.split(";"))

[編集]更新から、引用を処理する必要があるかもしれないことを示します。探している正確な形式(受け入れられる引用文字、エスケープ文字など)に応じて、これは事態を複雑にします。あなたのcsvモジュールを見て、あなたのフォーマットをカバーできるかどうかを確認したいかもしれません。例は次のとおりです(CSVは一連のレコードを反復処理するように設計されているため、この例ではAPIが少し不格好であることに注意してください。あなたのニーズに合わせて):

>>> s = "Name1='Value=2';Name2=Value2;Name3=Value3"

>>> dict(csv.reader([item], delimiter='=', quotechar="'").next() 
         for item in csv.reader([s], delimiter=';', quotechar="'").next())

{'Name2': 'Value2', 'Name3': 'Value3', 'Name1': 'Value1=2'}

ただし、フォーマットの正確な構造によっては、独自の単純なパーサーを作成する必要がある場合があります。

126
Brian

これは、あなたが望んでいたことを実行することに近くなります。

>>> import urlparse
>>> urlparse.parse_qs("Name1=Value1;Name2=Value2;Name3=Value3")
{'Name2': ['Value2'], 'Name3': ['Value3'], 'Name1': ['Value1']}
5
Kyle Gibson
s1 = "Name1=Value1;Name2=Value2;Name3=Value3"

dict(map(lambda x: x.split('='), s1.split(';')))
3
D. Om

文字列の結合とリストの理解によって簡単にできます

'、'。join(['%s =%s'%x for x for d.items()])

>>d = {'a':1, 'b':2}
>>','.join(['%s=%s'%x for x in d.items()])
>>'a=1,b=2'
0
vijay