13

'A=5, b=7'フォームの文字列をdict に変換する関数を作成しようとしています{'A': 5, 'b': 7}。次のコード スニペットは、メインforループ内で発生するものです。文字列の単一の部分を単一の dict 要素に変換します。

これで問題ありません:

s = 'A=5'
name, value = s.split('=')
d = {name: int(value)}

これではありません:

s = 'A=5'
d = {name: int(value) for name, value in s.split('=')}
ValueError: need more than 1 value to unpack

タプルが辞書内包表記になっていると、タプルをアンパックできないのはなぜですか? これが機能するようになれば、関数全体を単一のコンパクトな dict 内包表記にすることが簡単にできます。

4

7 に答える 7

20

あなたのコードでs.split('=')は、リストを返します:['A', '5']。そのリストを反復処理すると、毎回1つの文字列が返されるため(1回目は'A'、2回目'5')、その1つの文字列を2つの変数に解凍することはできません。

あなたは試すことができます: for name,value in [s.split('=')]

おそらく、分割したい文字列の反復可能性があります-そうすると、dictの理解は単純になります(2行):

 splitstrs = (s.split('=') for s in list_of_strings) 
 d = {name: int(value) for name,value in splitstrs }

もちろん、ワンライナーに夢中になっている場合は、それを組み合わせることができますが、私はしません。

于 2012-08-23T15:10:26.290 に答える
7

確かにこれを行うことができます:

>>> s = 'A=5, b=7'
>>> {k: int(v) for k, v in (item.split('=') for item in s.split(','))}
{'A': 5, ' b': 7}

ただし、この場合は、次のより命令的なコードを使用します。

>>> d = {}
>>> for item in s.split(','):
        k, v = item.split('=')
        d[k] = int(v)


>>> d
{'A': 5, ' b': 7}
于 2012-08-23T15:18:19.200 に答える
5

を使うと地獄に落ちると信じがちな人もいますevalが...

s = 'A=5, b=7'
eval('dict(%s)' % s)

または、安全のために (指摘してくれた mgilson に感謝):

s = 'A=5, b=7'
eval('dict(%s)' % s, {'__builtins__': None, 'dict': dict})
于 2012-08-23T15:18:59.683 に答える
2

このコードはどうですか:

a="A=5, b=9"
b=dict((x, int(y)) for x, y in re.findall("([a-zA-Z]+)=(\d+)", a))
print b

出力:

{'A': 5, 'b': 9}

このバージョンは、他の形式の入力でも機能します。たとえば、

a="A=5 b=9 blabla: yyy=100"

あなたにあげます

{'A': 5, 'b': 9, 'yyy': 100}
于 2012-08-23T15:13:39.520 に答える
2

エラーが発生している理由に対する mgilson の回答を参照してください。目的を達成するには、次を使用できます。

d = {name: int(value) for name,value in (x.split('=',1) for x in s.split(','))}

スペースを考慮するには、必要に応じて使用.strip()します (例: x.strip().split('=',1))。

于 2012-08-23T15:14:32.077 に答える
2
>>> strs='A=5, b=7'

>>> {x.split('=')[0].strip():int(x.split('=')[1]) for x in strs.split(",")}
{'A': 5, 'b': 7}

読みやすくするために、内包表記の代わりに通常の for-in ループを使用する必要があります。

strs='A=5, b=7'
dic={}
for x in strs.split(','):
  name,val=x.split('=')
  dic[name.strip()]=int(val)
于 2012-08-23T15:18:16.827 に答える
0

これはどう?

>>> s
'a=5, b=3, c=4'
>>> {z.split('=')[0].strip(): int(z.split('=')[1]) for z in s.split(',')}
{'a': 5, 'c': 4, 'b': 3}
于 2012-08-23T15:21:21.693 に答える