1
0

Python いろいろなリスト内包表記の使用法について

Posted at

はじめに

 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)]

forifで記載するとこの通り

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(多次元リストを一次元に平坦化)

標準入力での活用

私の過去の記事ですが、標準入力でもいろいろなリスト内表記をまとめています。

むすびに

 まとめることで頭が整理でき、身になるような気がします。新たな発見があり次第、加筆修正します。いろいろご助言いただけると嬉しいです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0