HOWTO · Python
Python における `[:-1]` の意味
Python の `[:-1]` スライスが、最後の要素を除いたシーケンスを返す仕組みを学びます。
このページの内容
Python では、sequence[:-1] は最後の要素を除くすべての要素を含む新しいシーケンスを返します。文字列とリストで動作し、元のシーケンスは変更されません。この式はスライスと -1 を組み合わせたもので、-1 は末尾からインデックスを指定する際に最後の位置を示します。
Python におけるスライス
Python には、スライスを記述する等価な方法が 2 つあります。slice() コンストラクタとインデックス構文です。一般的な形式は sequence[start:stop:step] で、各部分はどこから始めるか、どこで止めるか、どれだけ進めるかを選びます。start と stop の境界は位置を示し、step は方向と間隔を制御します。
stop の位置は含まれません。インデックス 4 で終わるスライスは 4 より前の位置を含むため、sequence[1:4] はインデックス 1、2、3 を選びます。インデックスは末尾から数えることもできます。-1 は最後の要素、-2 はその前の要素を指します。省略された境界は、明示的に -1 と書くこととは異なります。通常の正のステップでは、省略された start はシーケンスの先頭から始まり、省略された stop はその末尾まで続きます。デフォルトはステップの方向に依存します。負のステップでは、走査は右から左へ移動します。省略された start は最後の位置から始まり、省略された stop は最初の位置を超えて続きます。この方向に応じた動作こそ、省略された stop が明示的に -1 と書くことと同じではない理由です。
コンストラクタは同じ部分を受け取ります。slice(start, stop, step) です。インデックス構文とは異なり、コンストラクタの引数を空にすることはできません。省略された境界は None で表します。たとえば、slice(None, 5) は省略された start と 5 の stop を使い、正のステップでは sequence[:5] と等価です。引数が 1 つの場合、slice(5) は stop を 5 に設定します。「インデックス 5 から始める」という意味ではありません。これらの形式は、スライスを値として保存したり渡したりする必要がある場合に便利です。
Python における [:-1] の意味
sequence[:-1] では start が省略されているため、スライスは先頭から始まります。stop は -1 で、これは最後の要素を示し、stop は含まれないため、その要素は結果にコピーされません。たとえば、これを "Python" に適用すると "Pytho" になり、["red", "green", "blue"] に適用すると ["red", "green"] になります。
同じ式は、同じ結果パターンで異なるシーケンス型に適用できます。この完結した例では、短い文字列と色の名前のリストを使い、スライスされた各値をそれぞれの行に表示します。入力値により、どの最後の項目が省略されるかが分かりやすくなり、出力された値は、元のデータがプログラムで後から使うために引き続き利用できることを示します。
word = "Python"
colors = ["red", "green", "blue"]
print(word[:-1])
print(colors[:-1])
Pytho
['red', 'green']
スライスは元のシーケンスを変更する代わりに結果を作成します。このため [:-1] は、最後の文字や項目を除いたバージョンが必要だが、元の値が後でまだ必要な場合に便利です。空のシーケンスでも動作し、別の空のシーケンスを返します。要素が 1 つだけのシーケンスでは、その唯一の要素が最後の要素であるため、結果は空になります。同じ stop 境界のルールが、両方の結果を説明します。