Pythonでdictionaryの各要素に処理を加えた別のdictionaryをつくる
TL;DR
>>> { k:list(map(lambda s: int(s)**2, v.split('-'))) for (k,v) in src.items()} {'foo': [1, 4, 9], 'bar': [16, 25, 36]}
やりたいこと
入力
{ 'foo': '1-2-3', 'bar': '4-5-6', }
出力
{ 'foo': [1, 4, 9], 'bar': [16, 25, 36], }
みたいなこと。
解決
src = {'foo': '1-2-3', 'bar': '4-5-6'} dest = { k: list(map( lambda s: int(s)**2, v.split('-'), )) for (k, v) in src.items() } # {'foo': [1, 4, 9], 'bar': [16, 25, 36]}
知見
dict
は、items
メソッドで、(key, value)
のタプルのリストが得られる- 正確には得られるのは
dict_items
であり、append
などは無いが、リストとして扱う上では困らない
- 正確には得られるのは
- タプルのリストは
for
でそれぞれ多値を拾うことができるfor (name, age) in [('otiai10', 100), ('otiai20', 200)]
のように
map
関数でリストのそれぞれの要素に対して処理をapplyできる- ただし、この返り値は
map object
であり、list
ではないので、list()
でリストにしてやる必要がある
- ただし、この返り値は
- 文字列分割は
str.split(delim)
- 無名関数を
lambda
で作ることができる- ただし、複数行の
lambda
をつくることはできない?っぽいので、見通しも悪くなるので関数は別定義したほうがよい
- ただし、複数行の
dict
の初期化において、keyにも変数を使える- 下記参照
>>> key = 'name' >>> val = 'otiai10' >>> {key:val} {'name': 'otiai10'}
WETな備忘録として