はじめに
paizaラーニング中、リスト内表記について、すぐに使用法を確認できるように、知っている範囲でまとめました。リスト内包表記はシンプルに記載でき、パイソニックなコードになり、かつ、スピードが上がるので好きな構文です。
オライリー・ジャパンの「Python入門3」とnote.nkmk.meの記事を参照させてもらっています。
リスト内包表記とは
リスト内包表記は、あるシーケンスや iterable (イテレート可能オブジェクト) のそれぞれの要素に対して、ある操作を行った結果を要素にしたリストを作ったり、ある条件を満たす要素だけからなる部分シーケンスの作成を簡潔に生成することができます。
基本構文
[ expression for item in interable ]
リスト内包表記は、括弧の中の 式、 for 句、そして0個以上の for か if 句で構成されます。
Sequential_number = [x for x in range(5)]
print(Sequential_number)
# [0, 1, 2, 3, 4]
for 句による操作
0から5までの数を2乗してリストに追加する。
squares = [x**2 for x in range(6)] #0から5まで
print(squares)
#[0, 1, 4, 9, 16, 25]
1から4までの数を2回ずつリストに追加する。
a = [n for n in range(1,5) for _ in range(2)]
print(a)
#[1, 1, 2, 2, 3, 3, 4, 4]
変数とfor
を2つ用いてリストを作成する。
rows = range(1, 4) #1から3まで
cols = range(1, 3) #1から2まで
cells = [(row,col)for row in rows for col in cols]
print(cells)
#[(1, 1), (1, 2), (2, 1), (2, 2), (3, 1), (3, 2)]
トランプの絵柄をS(スペード) , H(ハート) , D(ダイア) , C(クラブ) と表現するものとし、その絵柄の 1 からキングまでの各カードを S_1 , ... , S_13 のように表現するリストを作成する。
marks = ["S_", "H_", "D_", "C_"]
cords = [x + str(i) for x in marks for i in range(1,14)]
print(cords)
#['S_1', 'S_2', 'S_3', 'S_4', 'S_5', 'S_6', 'S_7', 'S_8', 'S_9', 'S_10', 'S_11', 'S_12', 'S_13', 'H_1', 'H_2', 'H_3', 'H_4', 'H_5', 'H_6', 'H_7', 'H_8', 'H_9', 'H_10', 'H_11', 'H_12', 'H_13', 'D_1', 'D_2', 'D_3', 'D_4', 'D_5', 'D_6', 'D_7', 'D_8', 'D_9', 'D_10', 'D_11', 'D_12', 'D_13', 'C_1', 'C_2', 'C_3', 'C_4', 'C_5', 'C_6', 'C_7', 'C_8', 'C_9', 'C_10', 'C_11', 'C_12', 'C_13']
if 句による操作
1から5までの奇数だけのリストを作る。
odd_number = [num for num in range(1, 6) if num % 2 == 1]
print(odd_number)
#[1, 3, 5]
複数の比較演算子を連結して、中間の要素のリストを作成する。
a = [x for x in range(10) if 2 <= x <= 5]
print(a)
#[2, 3, 4, 5]
if~else
を使用して'even'と'odd'を交互に表示する。
odd_even = ['odd' if i % 2 == 1 else 'even' for i in range(10)]
print(odd_even)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']
for 句とif 句の複合による操作
2つのリストの要素から、違うもの同士をペアにする。
a = [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
print(a)
#[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
for
とif
で記載するとこの通り
a = []
for x in [1,2,3]:
for y in [3,1,4]:
if x != y:
a.append((x, y))
print(a)
#[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
二重のリスト内包表記 (コードは要修正)
リストのフラット化
2階層のリストを1階層のリストに平坦化する。
a = [[1, 2], [3, 4]]
flat_list = [item for l in a for item in l]
#上と同じ
flat_list = [item for l in [[1, 2],[3, 4]] for i in l]
print(flat_list)
#[1, 2, 3, 4]
参考 Pythonでflatten(多次元リストを一次元に平坦化)
標準入力での活用
私の過去の記事ですが、標準入力でもいろいろなリスト内表記をまとめています。
むすびに
まとめることで頭が整理でき、身になるような気がします。新たな発見があり次第、加筆修正します。いろいろご助言いただけると嬉しいです。