86

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

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

私がこれを行ったかのように、Pythonにその文字列を取り、辞書を構築する組み込みのクラス/関数はありますか:

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

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


ありがとう、私は自分で関連するコードを作成する方法を知っていますが、そのような小さな解決策は通常、起こるのを待っている地雷原であるため (つまり、誰かが書いている: Name1='Value1=2';) などです。テスト済みの機能。

じゃあ自分でやる。

4

6 に答える 6

149

ビルトインはありませんが、ジェネレータ内包表記を使用すると、これをかなり簡単に実現できます。

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

[編集] 更新から、引用を処理する必要があるかもしれないことを示しています。これは、探している正確な形式が何であるか (どの引用符文字が受け入れられるか、どのエスケープ文字など) に応じて、物事を複雑にします。csv モジュールを調べて、フォーマットをカバーできるかどうかを確認することをお勧めします。以下に例を示します: (CSV は一連のレコードを反復処理するように設計されているため、この例では API が少しぎこちないことに注意してください。したがって、最初の行を確認するために .next() 呼び出しを行っています。あなたのニーズに合わせてください):

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

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

于 2008-10-09T11:43:42.087 に答える
6

これは、あなたが望んでいたことをすることに近づいています:

>>> import urlparse
>>> urlparse.parse_qs("Name1=Value1;Name2=Value2;Name3=Value3")
{'Name2': ['Value2'], 'Name3': ['Value3'], 'Name1': ['Value1']}
于 2011-03-01T02:46:12.353 に答える
-2
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)
于 2013-03-26T23:59:36.120 に答える