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な備忘録として