python入門講座 | List型の使い方2(リストから値を取り出すインデックスとスライスの方法)[第24回]

アラサーOLのためのpython入門講座
番地指定で単一の値を取り出すindexing(インデックス)とリストを切り出すslicing(スライス)を覚えましょう!

Ciao!みなさんこんにちは!このブログでは主に
(1)pythonデータ解析,
(2)DTM音楽作成,
(3)お料理,
(4)博士転職
の4つのトピックについて発信しています。

今回は「アラサーOLのためのpython入門講座」です!この講座では、プログラミング初心者アラサーOLのMi坊さんに、pythonを学習する上でのアドバイスを行います!「パソコンもプログラミングも初心者だけど、プログラミングができるようになりたい!」という方のためにstep-by-stepで解説していきます。

今日はList型変数(リスト)から値を取り出す方法を解説します。リストの「何番目の要素」と指定するindexingと「何番目から何番目まで」と指定するslicingの2種類のやり方があります。Pythonで円滑な処理を行うために必須の知識です!是非マスターしましょう!

この記事を読めば、List型変数から値を取り出す方法を知ることができます。ぜひ最後までお付き合いください!

Kaiko
Kaiko

この記事はこんな人におすすめ

  • 初心者だけどpythonを始めた!
  • pythonの基本的な使い方を知りたい!
  • 独学で学んだpythonの知識を整理したい!

Abstract | List型からは番地指定で値を取り出す

List型変数から格納された値を取り出すときは、index(インデックス)と呼ばれる番地を指定します。List型変数に値をN個の格納すると、格納した順に0からN-1までの番号が振られます。この番号がindexです。変数名[index]とすることで、その位置の値を抽出することができます。Indexingという処理です。

また、Slicing(スライス)という処理によって、List型変数からListを抽出することもできます。抽出したい最初のindexと最後のindexを指定することで、間にある要素をすべてListとして取り出せます。変数名[最初のindex:最後のindex+1]とします。

IndexingとSlicingはList型変数の操作で頻繁に行われる処理です。NumPy配列やPandas DataFrameを用いたデータ分析・データ処理にも通じる操作なので、マスターしましょう!



Method | List型変数から値を抽出する方法

List型変数から値を抽出する方法を解説します。実際に手を動かしながら学んでいきましょう!Jupyter Notebookを立ち上げてコーディングしながら読み進めてください。練習問題の後にコーディング例も掲載しますので、やってみてどうしてもわからなければそれを見て進めてみてください。

準備 | python notebookの新規作成

まずはpython notebookを用意しましょう。いつものpython_practiceのディレクトリに「practice_list_value」という名前のpython notebookを作成してください。ターミナルを立ち上げて~/python_practiceに移動、jupyter notebookを起動し、ブラウザから新規→Python3でpython notebookを開いて、ファイル→リネームでファイル名を決定します。
もしやり方がわからなければ、過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」などで詳しく解説しているので、これらを見ながらやってみてください。

python notebookを起動したら、適宜Markdownセルに説明書きを加えながら下記の説明に沿ってコードを書いて実行していきましょう。Markdownセルやコードセルなどの用語やこれらの使い方は過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」を参照してください。練習問題の後にpython notebookの例を掲載します。もし書き方がわからなければそちらを見てください。



Indexing (インデックス) | 番地指定で単一の値を抽出する

作成したリストから値を一つ取り出す方法を解説します。リストから値を取り出すには

var_list[0]

のように変数のあとに[]をつけ、その中にindex(インデックス)と呼ばれる数字を指定します。番地を指定して値を取り出すイメージです。実際に例題をやりながら確認しましょう。

最初からi番目の値を取り出す

リストの「最初から何番目」というようにindexを指定して値を取り出してみましょう。最初の要素は「0番目」となります。以下を実行してみて、リストの0番目、1番目、2番目の値を出力してみましょう。

# define a list variable
var_list = [1,2,3,4,5]

# 0th element
print('0th:', var_list[0])

# 1st element
print('1st:', var_list[1])

# 2nd element
print('2nd:', var_list[2])

var_listには1から5までの5つの値が格納されています。0番目、1番目、2番目はそれぞれ、1、2、3なのでこれらが出力されます。

要素の数以上の数字をindexに指定するとエラーとなります。この例の場合、要素は5つなので指定できるのは4番目までです。5番目を指定するとエラーとなります。以下を実行してみましょう。

# 4th (final element)
print('4th', var_list[4])

# 5th -> Error
print('5th', var_list[5])

4番目までは指定できるので「4th: 5」は出力されますが、以降は出力されず「IndexError: list index out of range」と表示されます。

2次元的なリスト(list in list)のindexing

2次元的なリストから値を取り出す方法も見てみましょう。今度は[]を2つ使い、indexを2つ指定します。1つ目のindexが第0軸(縦)、2つ目が第1軸(横)です。以下を実行してみましょう。

# define a 2 dimensional list: 2 x 3
list_2d = [
    [1,2,3], # 1st row
    [4,5,6]  # 2nd row
]

# index == [0][0]: top-left
print('[0,0]', list_2d[0][0])

# index == [1][0]: 1 element down
print('[1,0]', list_2d[1][0])

# index == [0][1]: 1 element right
print('[0,1]', list_2d[0][1])

# index == [1][1]: 1 element down and right
print('[1,1]', list_2d[1][1])

1, 4, 2, 5という値が出力されます。2次元リストのindexは図1のように割り振られます。[0][0]は第0軸0番目、第1軸0番目なので、左上の要素です。1が出力されます。[1][0]は第0軸1番目、第1軸0番目なので、左下の要素で4です。他の要素も同様に、左上からの位置で指定されます。

図1. 2次元リストとindex
3次元以上の場合のindexing

3次元以上の場合も同様で、[]を増やしてくだけです。2x3x4というサイズの3次元リストの場合の以下の例を実行してみましょう。

# define a 3 dimensional list: 2 x 3 x 4
list_3d = [
    [
        [1,2,3,4],
        [5,6,7, 8],
        [9,10,11,12]
    ], 
    [
        [13,14,15,16],
        [17,18,19,20],
        [21,22,23,24]
    ]
]

# index: 0,0,0
print('[0][0][0]', list_3d[0][0][0]) # 1

# index: 1,0,0
print('[1][0][0]', list_3d[1][0][0]) # 13

# index: 0,1,2
print('[0][1][2]', list_3d[0][1][2]) # 7

3次元になるとちょっと複雑ですが、下図2のようなイメージを持ちましょう。[0][0][0]はaxis0, axis1, axis2の0番目なので、左上奥で値は「1」です。[1][0][0]はaxis0のindexが一つ増えるので「1」の一つ下です。図2では隠れて見えませんが、値は「13」です。[0][1][2]はaxis0のindexが0なので1番上の面、axis1のindexが1なので奥から2列目、axis2のindexが2なので左から3番目となりますので「7」です。

図2. 3次元リストのイメージ



最後からi番目の値を取り出す

「最後から何番目」という指定を行うこともできます。一番最後の値はindexを-1とすることで取り出せます。最後から2番目の値なら-2で、以下同様です。次のコードを実行してみましょう。

# define a list variable
var_list = [1,2,3,4,5]

# last element
print('-1th', var_list[-1])

# last - 1 th element
print('-2th', var_list[-2])

# last - 2 th element
print('-3th', var_list[-3])

最後の要素の「5」、その手前の「4」、さらに手前の「3」が出力されます。

2次元的なリストから値を取り出す

2次元的なリストから値を取り出す場合も同様です。以下を実行してみてください。

# define a 2 dimensional list: 2 x 3
list_2d = [
    [1,2,3], # 1st row
    [4,5,6]  # 2nd row
]

# index == [-1][-1]: bottom-right
print('[-1,0]', list_2d[-1][-1])

# index == [-1][-2]: bottom-center
print('[1,0]', list_2d[-1][-2])

[-1][-1]とすることで第0軸、第1軸ともに最後の要素である「6」、[-1][-2]とすることで第2軸だけ一つ手前に戻った「5」が出力されます。



Slicing (スライス) | リストからリストを取り出す

スライスと呼ばれる処理を行うことで、リストからリストを取り出すことができます。取り出した結果を別の変数に格納すれば、新たにリストを作成することもできます。

スライスをするときは、var_list[start:end]のように、indexを2つ書いてコロンでつなぎます。このようにするとstartからend-1までの要素がリストとして取り出されます。以下の例を実行してみましょう。

# define a list variable
var_list = [1,2,3,4,5]

# 0 to 1
print('0:2', var_list[0:2]) #[1,2]

# 1 to end-1
print('0:-1', var_list[0:-1]) #[1,2,3,4]

[0:2]とスライスすることで、0番目と1番目の要素がリストとして抽出されます。[0:-1]とすれば、最後から2番目まで、つまり0番目から3番目までの4つの要素が抽出されます。

スライスのstartやendを記入しないことも可能です。endを指定せず、startだけ指定すれば、最後の要素まで抽出されます。 逆に、startを指定せず、endだけ指定すれば、最初からend-1まで抽出されます。 startもendも指定しなければすべての要素が抽出されます。以下の例を実行してみましょう。

# define a list variable
var_list = [1,2,3,4,5]

# start to last
print('2:', var_list[2:]) #[3,4,5]

# 0th to end-1
print(':4', var_list[:4]) #[1,2,3,4]

# all
print(':', var_list[:]) #[1,2,3,4,5]

[2:]とスライスすると、2番目以降の全要素が出力されます。[:4]とスライスすると、3番目までの要素が出力されます。[:]は全部の要素です。

2次元の場合 | 最後の次元を1次元のリストとして抽出できる

2次元の場合、最後の次元を1次元のリストとして取り出すことができます。List型では、2次元以上のリストとしてスライスすることはできません。このような処理をしたい場合にはNumPy配列に変換してからスライスしますが、こちらは別の記事で取り上げます。本格的なデータ分析の場合にはNumPy配列の方が高度な処理が簡単にできるので適しています。

まずは、最初の次元(第1軸)だけをindexingすることで、第2軸方向に1次元のリストを取り出します。以下の例を実行してみましょう。

# define a 2 dimensional list: 2 x 3
list_2d = [
    [1,2,3], # 1st row
    [4,5,6]  # 2nd row
]

# index == [0]: top row
print('[0]', list_2d[0])

# index == [1]: bottom row
print('[1]', list_2d[1])

それぞれ、[1, 2, 3]というリストと[4, 5, 6]というリストが抽出されます。

次に、第1軸をindexingしたうえで、第2軸をスライスする例もやってみましょう。第2軸のスライスは1次元リストのスライスと同様です。以下の例をやってみましょう。

# define a 2 dimensional list: 2 x 3
list_2d = [
    [1,2,3], # 1st row
    [4,5,6]  # 2nd row
]

# index == [0][0:2]: top row, left 2 elements
print('[0][0:2]', list_2d[0][0:2])

# index == [1][1:]: bottom row, right 2 elements
print('[1][1:]', list_2d[1][1:])

1つ目のprint()では[1, 2, 3]から0番目と1番目を取り出すので[1, 2]、2つ目では[4, 5, 6]から1番目以降を取り出すので[5, 6]となります。



Result | 練習問題

最後に練習問題です。以下の処理を行うコードを書いてみてください。

  1. 変数var_listにMac, iPad, iPhoneの3つの文字列をlistとして代入してください。
    変数var_listをindexingしてiPadをprint()関数で出力してください。
  2. 変数var_listをslicingして[‘iPad’, ‘iPhone’]をprint()関数で出力してください。
  3. 変数var_listをslicingして[‘Mac’, ‘iPad’]をprint()関数で出力してください。最後のindexとしては-1を使ってください。
  4. 変数po_listに[[‘Mac’, 1249.5, 5], [‘iPad’, 329.00, 12]]を代入してください。
    変数po_listをindexingして1249.5をprint()関数で出力してください。
  5. 変数po_listから[‘Mac’, 1249.5, 5]を抽出し、print()関数で出力してください。
  6. 変数po_listから[329.00, 12]を抽出し、print()関数で出力してください。

練習問題の回答例

できたら回答例を確認しましょう!下の画面をスクロールすると回答例が見られます!参考にしてみてください。また、今回の記事で出てきた他のコードも載っているので参考にしてください!

練習問題おつかれさまでした!
今日はここまでです。Python Notebookを終了しておきましょう。もしPython Notebookを終了方法がわからなければ過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」の「Python Notebookの起動・終了方法」の章を参照してください!



Conclusion | まとめ

最後までご覧いただきありがとうございます!
今回はlist型変数から値を取り出す方法を解説しました。インデックスやスライスはlist型の処理だけでなく、NumPy配列を用いたデータ分析でもよく使われます。ぜひマスターしましょう!

以上「python入門講座 | List型の使い方2(リストから値を取り出すインデックスとスライスの方法)」でした!
またお会いしましょう!Ciao!



References | 参考

以下の教科書を参考にして進めています!より詳しく学びたい方は購入して読んでみてください!

Pythonの参考教科書

コメント

タイトルとURLをコピーしました