リストを使いデータをかたまりとして扱う
リストという機能を使うと、複数の文字や数字1つのかたまりとして扱うことができます。リストに対して条件を指定してデータを抜き出したり、関数を使い個数や合計を計算するなど、処理をすることができる範囲が広がります。
リストを定義する
30以下の素数に対してprimeというリストを定義し、結果を表示します。1,2,3のように数字が規則的に並ぶような場合はrange関数を使うことができますが、素数のように不規則に増えていくような場合にはリストを使うと効率的にデータを処理することができます。
- #1 リストを定義する
- prime=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
- print(prime)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
- 2行目で30以下の素数をprimeというリストとして定義しています。1つ1つの文字や数字を要素といい、リストを定義するときは角括弧[ ]でくくり、要素ごとにカンマ(,)で区分します。
- 3行目のようにprint関数で表示すると、リストの内容が出力されます。
リストの要素を取り出す
リストに対して関数を使い、いろいろな集計をすることができます。
リストの要素の集計
- #2 リストについて集計する
- print(f'合 計:{sum(prime)}')
- print(f'個 数:{len(prime)}')
- print(f'最大値:{max(prime)}')
- print(f'最小値:{min(prime)}')
合 計:129 個 数:10 最大値:29 最小値:2
- 2行目のようにsum関数を使い、要素の合計を計算することができます。
- 3行目のようにlen関数を使い、要素の個数を計算することができます。
- 4行目のようにmax関数を使い、要素の最大値を計算することができます。
- 5行目のようにmin関数を使い、要素の最小値を計算することができます。
リストの要素を取り出す
リストには先頭から順番が付けられており、順番を示す値をインデックスといいます。インデックスを指定することで必要な要素を切り取ることができます。この機能をインデクシングといいます。
- #3 リストの要素を取り出す
- print(f'1番目:{prime[0]}')
- print(f'10番目:{prime[9]}')
- print(f'後ろから1番目:{prime[-1]}')
- print(f'{prime[0]==prime[-10]},{prime[9]==prime[-1]}')
1番目:2 10番目:29 後ろから1番目:29 True,True
- 2行目のように、リストから特定の順番の要素を取り出すためには、リスト名の後に角括弧[ ]の中でインデックスを設定します。なお、インデックスの特徴は順番-1となることで、先頭の要素を取り出すときには、[1]ではなく[0]になります。
- 3行目のように、10番目の要素を取り出すときは、[9]というようにインデックスは順番-1になります。
- 4行目にように、リストの末尾の要素を取り出すときは、[-1]というように負の数を指定します。このように末尾からの順番を取り出すときにはマイナスのインデックスを指定します。
- 5行目にようにインデックスが0と-10のとき、9と-1を指定した場合、取り出される要素は一致します。このように正のインデックスと負のインデックスの絶対値の和は、リストの要素数である10と一致します。
スライシングで範囲を指定する
リストの要素は角括弧[開始の要素のインデックス:終了の要素のインデックス]のように(コロン)で区切って範囲を指定することで、複数の要素を抜き出すことができます。このことをスライシングといいます。インデックシングの結果は1つしかないので、整数など要素の属性と同じになりますが、スライシングの結果は複数あることがほとんどなのでリストで返ります。
- #4 リストから範囲を指定して要素を取り出す
- print(f'3番目から8番目まで:{prime[2:8]}')
- print(f'1番目から10番目まで:{prime[0:10]}')
- print(f'初めから5番目まで:{prime[:5]}')
- print(f'6番目から最後まで:{prime[5:]}')
- print(f'初めから5番目と6番目から最後まで:{prime[:5]+prime[5:]}')
- print(f'初めから最後まで:{prime[:]}')
3番目から8番目まで:[5, 7, 11, 13, 17, 19] 1番目から10番目まで:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29] 初めから5番目まで:[2, 3, 5, 7, 11] 6番目から最後まで:[13, 17, 19, 23, 29] 初めから5番目と6番目から最後まで:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29] 初めから最後まで:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
- リストの3番目から8番目までを抜き出すときには、インデックスを[2:8]と指定します。開始の部分はインデックスが0から振られるので-1とし、終了の部分は1つ先の9番目までを指定します。ところで9番目はインデックスでは8になるので、結果的には順番とインデックスは一致します。
- リストの当初から末尾の要素までを指定するときは、[0,10]と指定します。インデックスの最大値はリストの数-1なので、本来であれば10以上の値はありえませんが、終了では1つ先のインデックスである10(11,12,13もOK)を指定することになります。
- リストのはじめから特定の要素までの範囲をスライシングするためには、[ :5]のように、:の左側に何も指定しません。
- 特定の要素リストの最後までの範囲を指定するためには、[6: ]のように:の右側に何も指定しません。
- 全ての要素をスライシングするためには、角括弧を[ : ]とコロン:の前後に何も指定しません。
リストの中から要素を飛び飛びに選ぶ方法
リストの中で奇数番目、偶数番目の項目を抜き出したい場合や、3つおき、4つおきに抜き出したいときがあります。このときには、リストの角括弧[ ]の中に3つめのパラメーターとしてステップ(飛び飛びにする数)を指定します。
- #5 2つおき、3つおきにスライシングするとき
- print(f'3番目から7番目まで2つおき:{prime[2:7:2]}')
- print(f'4番目から8番目まで2つおき:{prime[3:8:2]}')
- print(f'1番目から8番目まで3つおき:{prime[0:8:3]}')
3番目から7番目まで2つおき:[5, 11, 17] 4番目から8番目まで2つおき:[7, 13, 19] 1番目から8番目まで3つおき:[2, 7, 17]
- 2行目のように、[2:7:2]とステップの値2を指定すると、2つおきにスライシングされます。インデックスの2は3番目の要素になるので、3番目、5番目、7番目の要素を抜き出すことができます。
- 3行目のように、[3:8:2]とすると、4番目から8番目までの要素を2つおきにスライシングすることができます。
- 4行目のように、[0:8:3]とすると、3つおきにスライシングすることができます。
ステップを使って先頭に向けてスライシングする
リストを末尾から先頭に向かって逆方向にスライシングすることができます。このためには、開始を大きな方のインデックス、終了を小さな方のインデックス、ステップにマイナスの値を設定します。
- #6 リストを逆からスライシングするとき
- print(f'8番目から3番目まで:{prime[7:1:-1]}')
- print(f'8番目からはじめまで:{prime[7::-1]}')
- print(f'最後から5番目まで:{prime[:3:-1]}')
- print(f'最後から初めまで:{prime[::-1]}')
8番目から3番目まで:[19, 17, 13, 11, 7, 5] 8番目から2番目まで:[19, 17, 13, 11, 7, 5, 3] 8番目からはじめまで:[19, 17, 13, 11, 7, 5, 3, 2] 最後から5番目まで:[29, 23, 19, 17, 13, 11] 最後から初めまで:[29, 23, 19, 17, 13, 11, 7, 5, 3, 2]
- リストの8番目から3番目のように、先頭の方向に向かってスライシングするときには角括弧を[7:1]のように指定します。開始については、インデックスは1つ小さい値を指定します。終了については、さらにスライシングする方向に1つ前(遡って)の値を指定します。
- リストの8番目から先頭までスライシングする場合、[7::-1]のように2番目の終了のパラメーターをブランクにします。
- リストの末尾から5番目までスライシングする場合[:3:-1]のように初めのパラメーターをブランクにします。
マイナスのインデックスを使ってスライシングする
マイナスのインデックスを使うと、リストの末尾からの順番でスライシングすることができます。リストの一番末尾の要素を指定するときには、リストの要素の数をインデックスとして指定する手間を省くことができます。
- #7 リストにマイナスのインデックスを使ってスライシングする方法
- print(f'最後から数えて8番目から最後数えて3番目まで:{prime[-8:-2]}')
- print(f'3番目から最後数えて9番目まで:{prime[2:9]}')
- print(f'最後から数えて6番目から初めまで:{prime[-6:]}')
- print(f'初めから最後から数えて7番目まで:{prime[:-6]}')
最後から数えて8番目から最後数えて3番目まで:[5, 7, 11, 13, 17, 19] 3番目から最後数えて9番目まで:[5, 7, 11, 13, 17, 19, 23] 最後から数えて6番目から初めまで:[11, 13, 17, 19, 23, 29] 初めから最後から数えて7番目まで:[2, 3, 5, 7]
- 末尾から数えて8番目から3番目をスライシングするときは、角括弧の[-8:-2]のように指定します。開始については、インデックスは順番と一致していますが、末尾については1つ末尾側の-2までを指定します。
- 1については、図からもわかるように[3:9]と指定した時と同じ結果になります。開始も終了も絶対値の合計がリストの要素の数の10になります。
- 末尾から数えて6番目から末尾までをスライシングするときは、[-6:]のように終了のパラメーターをブランクにします。
- 先頭から、末尾から数えて7番目までを指定するときには、[:-6]ように1つ先の-6をパラメーターとして設定します。
マイナスのインデックスを使い先頭方向にスライシングする
マイナスのインデックスを使い、先頭方向にスライシングすることもできます。
- #8 リストにマイナスのインデックスを使って逆にスライシングするとき
- print(f'最後から数えて3番目から最後から数えて8番目まで:{prime[-3:-9:-1]}')
- print(f'8番目から3番目まで:{prime[7:1:-1]}')
- print(f'最後から数えて8番目から最初まで:{prime[-8::-1]}')
- print(f'最後から最後から数えて2番目まで:{prime[:-3:-1]}')
最後から数えて3番目から最後から数えて8番目まで:[19, 17, 13, 11, 7, 5] 8番目から3番目まで:[19, 17, 13, 11, 7, 5] 最後から数えて8番目から最初まで:[5, 3, 2] 最後から最後から数えて2番目まで:[29, 23]
- 2行目のように8番目の要素から3番目の要素まで、先頭方向にスライシングするときは、角括弧を[-3:-9;-1]のように指定します。終了のパラメーターはスライシングする方向に1つ前(遡って)の値を指定するので-9とします。
- 2行目と同じ結果にするためには、3行目のように[7:1;-1]と指定します。
- 4行目のように、末尾から数えて8番目から先頭に向けてスライシングするときには、[-8::-1]のように、終了までのパラメーターには何も指定しません。
- 5行目のように、末尾の要素を開始とし、末尾から数えて2番目を終了とするようなスライシングするときは、[:-3:-1]と開始のパラメーターに何も指定しません。
リストの要素を抜き出すときに便利な機能
リストのスライシングを使うと、1つのリストから別のリストを作ることや、for文でリストから1つずつ要素を取り出して合計を求めるなど、幅広い範囲で応用することができます。
スライシングしたリストの処理
スライシングしたリストから別のリストを作る
- #9 スライシングした要素を他のリストにする
- prime_1=prime[2]
- prime_2=prime[2:8]
- prime_3=prime[2:3]
- print(f'元のリスト:{prime}')
- print(f'1つの要素を取り出す:{prime_1}')
- print(f'範囲を取り出す{prime_2}')
- print(f'1つの要素をリストとして取り出す{prime_3}')
元のリスト:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29] 1つの要素を取り出す:5 範囲を取り出す[5, 7, 11, 13, 17, 19] 1つの要素をリストとして取り出す[5]
- 2行目のように、1つだけ要素をインデクッシングして別の変数に代入すると、その属性は要素と同じものになります。ここでは、要素が整数なので、変数prime_1の属性は整数になります。
- 3行目のように、スライシングした結果を新しく定義した変数に代入すると、その変数の属性もリストとなります。このとき、元のリストは変化しないので、1つのリストを温存した上で、別のリストをコピーして使うことができます。
- 4行目のように、1つの要素をスライシングするときは、[2:3]のように指定します。
スライシングしたリストを合計する
for文を使いループされることにより、リストの内容を順次取り出し処理することができます。
- #10 リストをスライシングして合計する
- total=0
- for num in prime:
- print(num,end=' ')
- total+=num
- print()
- print(total)
2 3 5 7 11 13 17 19 23 29 129
- 3行目のように、for+変数+in+リスト名と指定することで、変数(ここではnum)として1つ1つ要素を取り出すことができます。
- 4行目のように、リストの要素からnumに代入した値をprint関数で表示することができます。
- 5行目では、変数totalに変数numの値を足しこんでいきます。なお、変数totalは2行目のように合計をする場合には0を代入して初期化しておく必要があります。なお、total+=numはtotalにtotal+numを代入するという意味になります。
- for文のループを抜けた後、7行目でtotalを表示することができます。
sum関数やlen関数を使い、リストの要素の合計や要素数求める
スライシングした結果について、sum関数を使い合計を計算したり、len関数を使い個数を数えたりすることができます。
- #13 スライシングしたリストの要素を合計する
- print(f'合計:{sum(prime[:9])}')
- print(f'個数:{len(prime[:9])}')
合計:100 個数:9
- 2行目のように、スライシングしたリストについて、sum関数を使い要素の合計を計算することができます。
- 3行目のように、スライシングしたリストについて、len関数で要素の個数を計算することができます。
インデックスを使った処理
インデックスを使ってリストの要素を順次取り出す方法
リストのインデックス(先頭からの順番)を処理の判断などに使うときには、インデックシングの機能を使って処理することができます。
- #11 リストをスライシングして合計する
- total=0
- for i in range(9):
- print(prime[i],end=' ')
- total+=prime[i]
- print()
- print(total)
- print(sum(prime[:9]))
2 3 5 7 11 13 17 19 23 29 129
- 3行目のように、カウンタ変数iをrange関数でループさせます。
- 4行目のように、リストからカウンタ変数iをスライシングして要素を取り出し表示することができます。
- 5行目のように、取り出した要素を変数totalに足しこんでいきます。
enumerate関数を使いカウンタ変数とリストの要素を同時に処理する
カウンタ変数(リストの中での順番)とリストの要素の両方を利用して処理をしたいことがあります。たとえば、i番目の要素がnumのような表示をするような場合です。このときには、enumerate関数を使って処理することができます。
- #12 カウンタ変数とリストの中身を同時に処理する
- for i,num in enumerate(prime):
- print(i,i+1,num)
0 1 2 1 2 3 2 3 5 3 4 7 4 5 11 5 6 13 6 7 17 7 8 19 8 9 23 9 10 29
- 2行目で、enumerate関数を使い、カウンタ変数と要素を取り出しています。はじめのiがカウンタ変数、次のnumがリストの要素を表します。enumerateは列挙する、数え上げるという意味があります。
- print関数でカウンタ変数と要素を出力しています。このときカウンタ変数は0から要素の個数-1までの間で増えるので、i番目とする場合に1を加える必要があります。