質問

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

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

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

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

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


ありがとう事前テスト済みの機能。

その後、自分でやる。

役に立ちましたか?

解決

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

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

形式の正確な構造によっては、独自の単純なパーサーを記述する必要がある場合があります。

他のヒント

これは、望んでいたことを実行することに近いものです。

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

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

文字列結合とリスト内包表記によって簡単に実行できます

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

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

Value1、Value2が実際の値の単なるプレースホルダーである場合、 eval()と組み合わせて dict()関数を使用することもできます。

>>> s= "Name1=1;Name2=2;Name3='string'"
>>> print eval('dict('+s.replace(';',',')+')')
{'Name2: 2, 'Name3': 'string', 'Name1': 1}

これは、 dict()関数が構文 dict(Name1 = 1、Name2 = 2、Name3 = 'string')を理解するためです。文字列内のスペース(各セミコロンの後など)は無視されます。ただし、文字列値には引用符が必要です。

easytiger $ cat test.out test.py | sed 's/^/    /'
p_easytiger_quoting:1.84563302994
{'Name2': 'Value2', 'Name3': 'Value3', 'Name1': 'Value1'}
p_brian:2.30507516861
{'Name2': 'Value2', 'Name3': "'Value3'", 'Name1': 'Value1'}
p_kyle:7.22536420822
{'Name2': ['Value2'], 'Name3': ["'Value3'"], 'Name1': ['Value1']}
import timeit
import urlparse

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

def p_easytiger_quoting(s):
    d = {}
    s = s.replace("'", "")
    for x in s.split(';'):
        k, v = x.split('=')
        d[k] = v
    return d


def p_brian(s):
    return dict(item.split("=") for item in s.split(";"))

def p_kyle(s):
    return urlparse.parse_qs(s)



print "p_easytiger_quoting:" + str(timeit.timeit(lambda: p_easytiger_quoting(s)))
print p_easytiger_quoting(s)


print "p_brian:" + str(timeit.timeit(lambda: p_brian(s)))
print p_brian(s)

print "p_kyle:" + str(timeit.timeit(lambda: p_kyle(s)))
print p_kyle(s)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top