pythonのリスト内包表記

mapの代わりに使う

[ 式 for 変数名 in イテラブルオブジェクト]
>>> a=[1,2,3,4,5,6,7,8,9]
>>> [i % 3 for i in a]
[1, 2, 0, 1, 2, 0, 1, 2, 0]

条件式も使える
>>> [i if i % 3 == 0 else -1 for i in range(10)]
[0, -1, -1, 3, -1, -1, 6, -1, -1, 9]

末尾のifでフィルタができる

[ 式 for 変数名 in イテラブルオブジェクト if 条件式 ]
>>> [i for i in range(10) if i % 3 == 0]
[0, 3, 6, 9]

# 条件式と組み合わせる。3の倍数だけ取り出し、奇数は負数にする
>>> [i if i % 2 == 0 else -i for i in range(10) if i % 3 == 0]
[0, -3, 6, -9]

二次元リスト

>>> a=[1,2,3]
>>> [i for i in a]
[1, 2, 3]

>>> [i for i in a for _ in range(2)]
[1, 1, 2, 2, 3, 3]

>>> [i for _ in range(2) for i in a]
[1, 2, 3, 1, 2, 3]

左側のforが外側のループになる。イメージは

# [i for i in a for _ in range(2)]
for i in a:
   for _ in range(2):
      i

#  [i for _ in range(2) for i in a]
for _ in range(2):
   for i in a:
      i

flatten

>>> a=[[1,2,3], [7,8,9], [10,11,12]]
>>> [i for sublist in a for i in sublist]
[1, 2, 3, 7, 8, 9, 10, 11, 12]

以下のようには書けない
>>> [i for i in sublist for sublist in a]
NameError: name 'sublist' is not defined