スライス

このレッスンで作るもの — リストの一部だけを切り出す スライス を覚えて、支出の直近 3 件を取り出します。

スライス

おこづかい帳の記録が 50 件たまったとき、画面に全部出すと読みにくくなります。ほしいのはたいてい「最近の数件」です。リストから一部分だけを取り出す仕組みが スライス です。

まず 1 件だけ取り出す書き方を確認します。リストは先頭を 0 として番号が振られていて、items[0] で 1 番目、items[1] で 2 番目が取れます。この番号を インデックス と呼びます。

items = ["りんご", "みかん", "ノート", "電車代"] print(items[0]) print(items[2])

りんごノート が表示されます。1 番目が 0 番であることに注意します。

インデックスが 0 から始まるのは、Python に限らず多くの言語で共通の作法です。「1 つ目は 0 番」と口に出して覚えてしまうのが早道です。

範囲で取り出す

items[開始:終了] と書くと、開始位置から終了位置の 手前まで を新しいリストとして取り出します。終了位置そのものは含みません。

items = ["りんご", "みかん", "ノート", "電車代"] print(items[1:3])

結果は ['みかん', 'ノート'] です。1 番から 3 番の手前、つまり 1 番と 2 番の 2 件が取れます。

開始を省くと先頭から、終了を省くと末尾までになります。items[:2] は最初の 2 件、items[2:] は 3 件目以降です。両方省いた items[:] はリスト全体のコピーになります。

末尾から数える

インデックスにはマイナスも使えます。-1 がいちばんうしろ、-2 がその 1 つ前です。

items = ["りんご", "みかん", "ノート", "電車代"] print(items[-1]) print(items[-3:])

電車代['みかん', 'ノート', '電車代'] が表示されます。items[-3:] は「うしろから 3 件目から最後まで」という意味で、直近 3 件を取り出す決まり文句です。

diagram (will load when visible)

動きを追ってみる

["りんご", "みかん", "ノート", "電車代"][-3:] を当てる流れを追います。

  1. 全体の件数は 4
  2. -3 は先頭から数えると 1 番の位置にあたる
  3. 終了を省いているので 1 番から最後までを取る
  4. 結果は ['みかん', 'ノート', '電車代'] の 3 件

うれしいのは、件数が足りないときの動きです。["りんご"][-3:] を当てても、エラーにはならず ['りんご'] がそのまま返ります。

items[10] のように無い番号を 1 つだけ指定すると IndexError で止まりますが、スライスは範囲がはみ出しても止まりません。この寛容さが、件数を気にせず書ける理由です。

元のリストは変わらない

スライスは 新しいリスト を作って返します。元のリストはそのまま残ります。

records = [{"name": "りんご", "price": 120, "category": "食費"}] recent = records[-3:]

recent は別のリストなので、recent.append(...) しても records は増えません。前回の appendremove が元を書き換えたのとは対照的です。

「元を変える操作」と「新しく作って返す操作」の区別は、これから何度も出てきます。append は前者、スライスは後者です。

文字列にも効く

スライスはリスト専用の記法ではありません。文字列にもそのまま使えます。文字列も「文字が順番に並んだもの」だからです。

text = "2026-04-01" print(text[:4]) print(text[-2:])

202601 が表示されます。日付から年だけ、日だけを切り出すといった処理が 1 行で書けます。第 8 章でファイルの中身を扱うときに、この形をまた使います。

よくある間違い

  1. 終了位置を含むと思い込むitems[0:3] は 4 件ではなく 3 件です。「終了の手前まで」と覚えます。取れた件数が 1 つ足りない、多いと感じたらここを疑います。
  2. items[-3]items[-3:] を混同する — コロンが無いと 1 件だけ、あるとリストが返ります。前者の戻り値は辞書や文字列、後者はリストです。
  3. 空リストで items[0] を読む[] に対する items[0]IndexError です。len(items) で件数を確かめるか、スライスを使えば避けられます。

やってみよう

関数 recent_three(records) を実装してください。records は支出の辞書が並んだリストです。末尾から 3 件を取り出して return します。

3 件に満たないときは、あるだけ全部を返します。空リストのときは空リスト [] を返します。スライスを使えば、件数で場合分けせずに 1 行で書けます。順番は元のリストのままにして、並べ替えはしません。

要件

  1. 関数名は recent_three で、引数は records の1つ
  2. リストの末尾3件をスライスで取り出して return する
  3. 3件に満たないときはあるだけ全部を返し、エラーにしない
  4. 元のリストの順番を保ち、並べ替えない

入出力例

recent_three([{"category":"食費","name":"りんご","price":120},{"category":"日用品","name":"ノート","price":200},{"category":"交通費","name":"電車代","price":320},{"category":"食費","name":"牛乳","price":180},{"category":"娯楽","name":"映画","price":1800}])[{"category":"交通費","name":"電車代","price":320},{"category":"食費","name":"牛乳","price":180},{"category":"娯楽","name":"映画","price":1800}] recent_three([{"category":"食費","name":"りんご","price":120},{"category":"日用品","name":"ノート","price":200},{"category":"娯楽","name":"映画","price":1800}])[{"category":"食費","name":"りんご","price":120},{"category":"日用品","name":"ノート","price":200},{"category":"娯楽","name":"映画","price":1800}] recent_three([{"category":"食費","name":"りんご","price":120},{"category":"食費","name":"牛乳","price":180}])[{"category":"食費","name":"りんご","price":120},{"category":"食費","name":"牛乳","price":180}] recent_three([])[] recent_three([{"category":"娯楽","name":"映画","price":1800},{"category":"食費","name":"りんご","price":120},{"category":"交通費","name":"電車代","price":320},{"category":"日用品","name":"ペン","price":150}])[{"category":"食費","name":"りんご","price":120},{"category":"交通費","name":"電車代","price":320},{"category":"日用品","name":"ペン","price":150}]

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
main.py
学習モード

メモ

スライス

⌘S で保存