15

私はこの問題に何度か遭遇しましたが、簡単な解決策を見つけられないようです。文字列があるとします

string = "a=0 b=1 c=3"

これを、a、b、c をキーとし、0、1、3 をそれぞれの値 (int に変換) とする辞書に変換したいと考えています。明らかに私はこれを行うことができます:

list = string.split()
dic = {}
for entry in list:
    key, val = entry.split('=')
    dic[key] = int(val)

しかし、私はその for ループがあまり好きではありません。非常に単純に見えるので、ある種のリスト内包表記に変換できるはずです。これは、 が文字列になる可能性がある、少し単純なケースで機能しvalます。

dic = dict([entry.split('=') for entry in list])

ただし、その場で val を int に変換する必要があり、このようなことを行うのは構文的に正しくありません。

dic = dict([[entry[0], int(entry[1])] for entry.split('=') in list])

私の質問は次のとおりです。リスト内包表記を使用して for ループを排除する方法はありますか? そうでない場合、私のためにそれを行うPythonメソッドが組み込まれていますか?

4

8 に答える 8

29

これのことですか?

>>> dict( (n,int(v)) for n,v in (a.split('=') for a in string.split() ) )
{'a': 0, 'c': 3, 'b': 1}
于 2009-08-07T19:07:15.993 に答える
3

リスト内包表記のないワンライナーはどうですか?

 foo="a=0 b=1 c=3"
 ans=eval( 'dict(%s)'%foo.replace(' ',',')) )
 print ans
{'a': 0, 'c': 3, 'b': 1}
于 2009-08-08T01:50:16.683 に答える
2

最近では、おそらく 2.7 で導入された辞書内包表記を使用する必要があります。

mydict = {key: int(value) for key, value in (a.split('=') for a in mystring.split())}

辞書の理解はより速く、より洗練されています (そして、私の意見では、より読みやすくなっています)。

from timeit import timeit

setup = """mystring = "a=0 b=1 c=3\""""
code1 = """mydict = dict((n,int(v)) for n,v in (a.split('=') for a in mystring.split()))""" # S.Lott's code
code2 = """mydict = {key: int(value) for key, value in (a.split('=') for a in mystring.split())}"""

print timeit(code1, setup=setup, number=10000) # 0.115524053574
print timeit(code2, setup=setup, number=10000) # 0.105328798294
于 2014-11-20T07:13:58.557 に答える
1
from cgi import parse_qsl
text = "a=0 b=1 c=3"
dic = dict((k, int(v)) for k, v in parse_qsl(text.replace(' ', '&')))
print dic

版画

{'a': 0, 'c': 3, 'b': 1}
于 2009-08-07T19:32:29.187 に答える
0

私はこれを行います:

def kv(e): return (e[0], int(e[1]))
d = dict([kv(e.split("=")) for e in string.split(" ")])
于 2010-06-12T22:37:04.500 に答える
-3

私は S.Lott のソリューションが気に入っていますが、別の可能性を思いつきました。
あなたはすでにそれを書く方法に似た文字列を持っているので、それをPython構文に適応させてからeval()することができます:)

import re
string = "a=0 b=1 c=3"
string2 = "{"+ re.sub('( |^)(?P<id>\w+)=(?P<val>\d+)', ' "\g<id>":\g<val>,', string) +"}"
dict = eval(string2)
print type(string), type(string2), type(dict)
print string, string2, dict

ここでの正規表現はかなり未加工であり、可能なすべての python 識別子をキャッチすることはできませんが、単純にするために単純にしたかったのです。もちろん、入力文字列の生成方法を制御できる場合は、Python 構文に従って生成し、評価してください。しかしもちろん、そこにコードが挿入されていないことを確認するために、追加のサニティ チェックを実行する必要があります。

于 2009-08-07T21:16:37.700 に答える