質問

私はこの問題全体に数回来ているし、簡単な解決策を見つけ出すように見えることはできません。 私は、文字列を持っていると言う。

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

Iは、a、b、cは、キーと0であると辞書にそれを変換したい1、及び3は、それぞれの値(intに変換される)です。もちろん、私はこれを行うことができます:

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

しかし、私は本当にループのこと好きではない、それはあなたのリストの内包表現のいくつかの並べ替えに変換することができるはずほど簡単なようです。そして、それは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の方法であっ内蔵されている?

役に立ちましたか?

解決

あなたはこれを意味するか?

>>> dict( (n,int(v)) for n,v in (a.split('=') for a in string.split() ) )
{'a': 0, 'c': 3, 'b': 1}

他のヒント

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

 foo="a=0 b=1 c=3"
 ans=eval( 'dict(%s)'%foo.replace(' ',',')) )
 print ans
{'a': 0, 'c': 3, 'b': 1}

次を試してみてください。

dict([x.split('=') for x in s.split()])

キーと値を作成するためのロジックが複雑になり、特にI時々このアプローチのように、:

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

def get_key_val(x):
    a,b = x.split('=')
    return a,int(b)

ans = dict(map(get_key_val,s.split()))

今では、おそらく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
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}

私はこれを行うだろう

def kv(e): return (e[0], int(e[1]))
d = dict([kv(e.split("=")) for e in string.split(" ")])

私は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の構文に従って、それを生成し、それを離れてEVALを購入します。 もちろん、あなたは何のコードがそこに注入されていないことを確認するために、追加の健全性チェックを実行する必要があります!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top