【Python】if文とfor文を1行で書く【リスト内包表記・3項演算子】
MAX
MAX999blog
Pythonのリストは、スライスを指定でリストを取得できる。
インデックス単体指定だと、そのインデックスの値を取得するだけだが、スライス指定することで、リストを取得できる。
また、スライスの特徴として、インデックスの範囲を超えて指定しても、エラーにならないことが挙げられる。
スライス指定する場合、この特徴を活かして、末尾のことを考えずに処理を書くこともある。
リストから値を取得する一番基本的な方法。
インデックスを指定して値を取得する。
1list_a = [1, 2, 3, 4, 5, 6]
2
3list_a[2]
4# 3
範囲外のインデックスを指定するとIndexErrorが返ってくる。
1list_a = [1, 2, 3, 4, 5, 6]
2
3list_a[10]
4# IndexError: list index out of range
なお、スライス指定をすることで、IndexErrorが発生しなくなる。
list[i:j]
でi <= index < j
の範囲のリストを取得できる。
i, j共に省略可能。
iとjの両方を省略した場合(list[:]
)はlist.copy()
と同じになる。
1list_a = [1, 2, 3, 4, 5, 6]
2# スライスで値取得
3list_a[2:]
4# [3, 4, 5, 6]
5
6# -1は末尾となるため、-2は末尾から2個目のインデックスを指す。
7list_a[-2:]
8# [5, 6]
9
10list_a[:3]
11# [1, 2, 3]
12
13list_a[:-3]
14# [1, 2, 3]
15
16# 2 <= index < 5の値を取得
17list_a[2: 5]
18# [3, 4, 5]
19
20# listのコピーを取得
21list_a[:]
22# [1, 2, 3, 4, 5, 6]
スライス指定の場合、存在しないインデックスを指定しても空リストが返ってくるだけでエラーとならない。
1# indexの範囲を超えてもエラーとならずに、存在するインデックスの分だけ値を取得できる
2list_a[-100:100]
3# [1, 2, 3, 4, 5, 6]
4
5# 対象のインデックスがない場合、空リストが返ってくる
6list_a[-100:-900]
7# []
スライスでは開始と終了位置の指定だけでなく、ステップ数も指定できる。
list[i: j: k]
で i<= index < j
の範囲でkステップ毎に値を取得できる。
1list_a = [1, 2, 3, 4, 5, 6]
2
3# list[i: j: k]でi <= index < jの範囲でkステップ毎に値を取得
4# 0 <= index < 100の範囲で2ステップ毎に値取得
5list_a[0:100:2]
6# [1, 3, 5]
7
8# i省略
9# list[i: j: k]でiを省略するとiは0となる
10list_a[:4:2]
11# [1, 3]
12
13# j省略
14# list[i: j: k]でjを省略するとlen(list)となる
15list_a[1::2]
16# [2, 4, 6]
17
18# k省略
19# list[i: j: k]でkを省略するとkは1となる
20list_a[1:6:]
21# [2, 3, 4, 5, 6]
22
23list_a[::2]
24# [1, 3, 5]
25
26list_a[::100]
27# [1]
インデックス指定とスライス指定では、範囲外のインデックス指定時に動作が大きく異なる。
インデックス単体指定では範囲外のインデックス指定時にIndex Errorが返ってくる。
スライス指定で範囲外のインデックス指定時には、IndexErrorは発生せず、対象インデックスが存在しない場合は空リストが返ってくる。
1list_a = [1, 2, 3, 4, 5, 6]
2
3# スライスで値取得
4# 2 <= index < 4(つまりindex=2, 3)の値取得
5list_a[2:4]
6# [3, 4]
7
8# indexの範囲を超えてもエラーとならずに、存在するインデックスの分だけ値を取得できる
9list_a[-100:100]
10# [1, 2, 3, 4, 5, 6]
11
12# 対象のインデックスがない場合、空リストが返ってくる
13list_a[-100:-900]
14# []
15
16# list[i: j: k]でi <= index < jの範囲でkステップ毎に値を取得
17# 0 <= index < 100の範囲で2ステップ毎に値取得
18list_a[0:100:2]
19# [1, 3, 5]
20
21# i省略
22# list[i: j: k]でiを省略するとiは0となる
23list_a[:4:2]
24# [1, 3]
25
26# j省略
27# list[i: j: k]でjを省略するとlen(list)となる
28list_a[1::2]
29# [2, 4, 6]
30
31# k省略
32# list[i: j: k]でkを省略するとkは1となる
33list_a[1:6:]
34# [2, 3, 4, 5, 6]
値をリストで取得しても問題がなく、リストの長さが不明瞭な場合などは、スライスをうまく使うことで、エラー処理を減らせるかもしれない。