スライス
このレッスンで作るもの — リストの一部だけを切り出す スライス を覚えて、支出の直近 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 件を取り出す決まり文句です。
動きを追ってみる
["りんご", "みかん", "ノート", "電車代"] に [-3:] を当てる流れを追います。
- 全体の件数は
4件 -3は先頭から数えると1番の位置にあたる- 終了を省いているので
1番から最後までを取る - 結果は
['みかん', 'ノート', '電車代']の 3 件
うれしいのは、件数が足りないときの動きです。["りんご"] に [-3:] を当てても、エラーにはならず ['りんご'] がそのまま返ります。
items[10]のように無い番号を 1 つだけ指定するとIndexErrorで止まりますが、スライスは範囲がはみ出しても止まりません。この寛容さが、件数を気にせず書ける理由です。
元のリストは変わらない
スライスは 新しいリスト を作って返します。元のリストはそのまま残ります。
records = [{"name": "りんご", "price": 120, "category": "食費"}]
recent = records[-3:]recent は別のリストなので、recent.append(...) しても records は増えません。前回の append や remove が元を書き換えたのとは対照的です。
「元を変える操作」と「新しく作って返す操作」の区別は、これから何度も出てきます。
appendは前者、スライスは後者です。
文字列にも効く
スライスはリスト専用の記法ではありません。文字列にもそのまま使えます。文字列も「文字が順番に並んだもの」だからです。
text = "2026-04-01"
print(text[:4])
print(text[-2:])2026 と 01 が表示されます。日付から年だけ、日だけを切り出すといった処理が 1 行で書けます。第 8 章でファイルの中身を扱うときに、この形をまた使います。
よくある間違い
- 終了位置を含むと思い込む —
items[0:3]は 4 件ではなく 3 件です。「終了の手前まで」と覚えます。取れた件数が 1 つ足りない、多いと感じたらここを疑います。 items[-3]とitems[-3:]を混同する — コロンが無いと 1 件だけ、あるとリストが返ります。前者の戻り値は辞書や文字列、後者はリストです。- 空リストで
items[0]を読む —[]に対するitems[0]はIndexErrorです。len(items)で件数を確かめるか、スライスを使えば避けられます。
やってみよう
関数 recent_three(records) を実装してください。records は支出の辞書が並んだリストです。末尾から 3 件を取り出して return します。
3 件に満たないときは、あるだけ全部を返します。空リストのときは空リスト [] を返します。スライスを使えば、件数で場合分けせずに 1 行で書けます。順番は元のリストのままにして、並べ替えはしません。
要件
- 関数名は recent_three で、引数は records の1つ
- リストの末尾3件をスライスで取り出して return する
- 3件に満たないときはあるだけ全部を返し、エラーにしない
- 元のリストの順番を保ち、並べ替えない
入出力例
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}]