【Python講座2】リストとインデックス

今日はリストのようなデータ構造とそれを扱うインデックスについて紹介していきます。Pythonのチュートリアルは「3.1.4リスト」から見ていきます。

目次

何故リストやインデックスが必要なのか?

リスト、インデックスは、プログラミングをやっていなくても聞いたことがある人は多いと思います。

例えば、データには色々な形があります。Wordのような文書データや、写真のような画像データなどデータには様々なあります。こうしたデータに対して、「この場所を変えたい」と思ったら、どの場所のことかを示さないといけない。

そこで、データのどこそこ、データのこれこれ、というものを客観的な形で示せるようにする。それがインデックスやリストなんです。それは付箋のようなものですね。

インデックス

インデックスとは何でしょうか?SEOのサイトにこんな風に書かれていました。
インデックス(index)とは非常に様々なシーンで用いられる用語で、それぞれ異なる意味で使われます。本来インデックスとは「索引」「見出し」などの意味をもつ言葉で、データベースに関わるシーンで用いられる際には、格納されたデータをより早く検索したり抽出できるように作られる索引データのことを言います。
via SEO HACKS

これをプログラムに用いると、例えば、文字列の後ろに順序が分かる「索引」を添えることで、文字列の中のどの場所なのかを調べることが出来ます。

上記のように、こんな風に文字列は添字表記することができます。これがインデックスです。

Pythonプログラムのインデックスでは文字列[0番目からの順番]という形で表記します。

例えば、HelpAというwordの5番目を取り出したい時、どうすればよいでしょう?答えはword[4]です。

何故0番目から数えるのでしょうか?それは、正確に言うと文字の順番ではなく、文字列の間を順番に数えているからです。左端は1番目の文字より前にあるので、0番目にあたります。

前から0番目にあたるのがH、逆に後ろから数えて5番目にあたるのもHという訳です。
上の法則を辿ると、word[-4]は後ろから-4となるので、eになります。

また、一番後ろはword[-0]でなく、word[-1]になります。切れ目0が一番左はじ。
一番後ろは切れ目が-1になります。概念が独特ですが、まずはそういうことだと理解してみて下さい。

試しにターミナルで、叩いてみて下さい。こんな風になります。

また、文字数以上の値を参照しようとするとエラーになります。

因みに、
word =raw_input(“”)とターミナルで打ってみて下さい。

何も表示されませんが、これはユーザーに何か入力(input)してほしいと言っています。
画面を見ているあなたが何もしないでほっとくといつまでたっても何もおきません。
逆に何か文字を打つと、wordに言葉が代入され、wordを読み出すとさっき書いた言葉が画面に現れます。

また、ここで、len(word)と入力するとwordの文字数が分かります。

これはどんな使い方をするかというと、文字数が分からない文字列があった場合に、指定した位置になる情報を取得して確認することが出来たりします。

word[len(word)-1]と書けば、一番最後の文字を調べることが出来ます。

また、幅を見たい時は、len(word[0:2])などと入力することで、特定の場所の文字数を取得することが出来ます。

word[0:2]と書いた時、1~2番目の文字情報を取得しています。切れ目で考えましょう。切れ目の順番で0番目〜2番目を数えています。従って、2文字分を取得しています。

Lpixelという文字を見た時に、以下のように考えます。

word[2:5]…2~5番目の切れ目が見られる。

word[2:]…2の切れ目から書く。

word[:2]…2の切れ目まで書く。

このように調べることが出来ます。

文字列やリストなどのオブジェクトでは、上のように指定した範囲の要素を持つ新しいオブジェクトを作成して返すことが出来ます。この機能のことをスライスと呼びます。IT技術者向けのサイト、PythonWebさんの記事の例を見てみましょう。

スライスは、以下のような形をとります。

リスト

次にリストを見てみましょう。

リストとは、簡単に言うと、複数の要素を含んだデータ構造のことです。
例えば、aという名前のリストがあった時、こんな形のリストが考えられます。

[]内がリストの切れ目になります。[]の外はリスト内のデータでないので、呼び出すことが出来ません。

リストのインデックスも0から順番に数えます。例えば、こんな風に書くとどうなるでしょうか?

こんな風になります。チュートリアルでは、このような例が紹介されています。

また、リストは、沢山の要素が順番に並んでいますが、要素を足し算することも出来ます。この時、リストの内部でも演算が行われます。

例えば、上記のa[2]=a[2]+23という処理とは、
aというリストの0から数えて2番目の文字、数式に対して加算処理を行います。

例えば、a[2]=100なら、a[2]=a[2]+23とすると、結果、a[2]=123と足し算されます。
掛け算の処理も行うことも出来ます。3をリストに掛け算すると、そのリストの指定された内容が3回繰り返されます。掛け算はリストの足し算を指定された回数だけ繰り返しているのと同じことです。

また、リスト内の要素を入れ替えることも出来ます。
a[0:2]=[1,12]とすると、a内のリスト要素を1,12に入れ替えることが出来ます。
リストの長さはどこまでも長くすることが出来ますし、リスト内にリストを入れ子に表示することも出来ます。

qの長さは2、pの長さは要素の数だけ見れば3つになります。(リストを1要素)

appendとは付け加えるという意味で、リスト内に要素をappendすると、その要素が追加されます。

K先生は「Macでディレクトリの中にフォルダとかを入れ子に出来るのと同じ。」
と言っていましたが、、なるほど分かり易いですね。

さて、いかがだったでしょうか?今回はインデックスやリストといった要素を見てきました。こんな形でリストのどこに何があるのかを可視化して、実際にデータ処理に利用しています。

<補足>

リストとインデックスは全然違うもので、並列に書くのは、ちょっとおかしいんじゃないのか?という指摘を頂きました。

リストや似たような形のタプルは、鍵括弧でくくられたデータの形、データ構造ですが、インデックスはデータの構造というより、データの見方として考えた方が良いということでした。K先生有り難うございます。

冒頭のところ、で「インデックスとリストというデータ構造」と書いてしまいましたが、エンジニアさんからするとおかしいと分かってしまうよねと。。