for文がネストした内包表記を書こうとしたら一発でできなかったので忘れないようにメモ
以下のような辞書型を二次元のリストに変換する処理をやりたかった
> # これを
> d1 = {'a': {'aa': (1, 3), 'ab': (5, 7)}, 'b': {'ba': (2, 4), 'bb': (6, 8)}}
> # こうしたい
> _d1 = [('a', 'aa', 1, 3), ('a', 'ab', 5, 7), ('b', 'ba', 2, 4), ('b', 'bb', 6, 8)]
for文を内包表記で書くときは_forの前方に中身がくる_と安直に覚えていたので、内部のfor文を外側のfor文の前方に書いた。
> [(k, _k, vals[0], vals[1]) for _k, vals in obj.items() for k, obj in d1.items()]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'obj' is not defined
name 'obj' is not defined
ネストしたループは後方に書くのが正解
> [(k, _k, vals[0], vals[1]) for k, obj in d1.items() for _k, vals in obj.items()]
[('a', 'aa', 1, 3), ('a', 'ab', 5, 7), ('b', 'ba', 2, 4), ('b', 'bb', 6, 8)]