このチュートリアルでは、Pythonでリストの最後の要素を見つける最も一般的な方法をいくつか見ていきます。
まず、最もシンプルでPythonらしい方法を取り上げ、その後に他の解決策をいくつか紹介します。
それでは、これから使うリストを見てみましょう。
exampleList = [1, 2, "Three", ["Four", 5], 6]
注:Pythonのリストは、必ずしも同じ型でない要素の集まりです。
1つのリストには、数値、文字列、ネストされたリストなどの要素を含むことができます。
Pythonのリストの最後の要素を取得する方法
Pythonでリストの最後の要素を取得する方法はいくつかあります。
いくつかはより直感的で実用的であり、いくつかは実際に元のリストをインプレースで変更します。
勝者の解決策 – ネガティブ・インデックスの使用
Pythonはリストの要素にアクセスする方法として、ネガティブインデックスという概念をサポートしています。
これは、[]
演算子を使うことで、逆順の要素にアクセスできることを意味します。
リストのインデックスがどのように機能するかはよく知られています。
firstElement = exampleList[0]
nthElement = exampleList[n-1]
...
最初の要素のインデックスは 0
で、2 番目の要素のインデックスは 1
、そして n
番目の要素のインデックスは n-1
です。
負のインデックスは同じロジックに従いますが、順序が逆になります。
最後の要素のインデックスは -1
で、最後から2番目の要素のインデックスは -2
というようになります。
lastElement = exampleList[-1]
print("Last element: ", lastElement)
print("exampleList: ", exampleList)
secondToLast = exampleList[-2]
print("Second to last element: ", secondToLast)
と出力されます。
Last element: 6
exampleList: [1, 2, 'Three', ['Four', 5], 6]
Second to last element: ['Four', 5]
ネガティブインデックスは元のリストを変更するものではありません。
これは、元のリストを変更することなく要素にアクセスする方法です。
これは圧倒的にシンプルでPythonicな解決策で、多くの人に好まれています。
インデックスを使用する
単純なインデックス付けは、通常 []
演算子を用いてリスト内の要素に元の順番でアクセスするために用いられます。
上記のように、最初の要素のインデックスは 0
で、2番目の要素のインデックスは 1
という具合になります。
このことから、最後の要素は len(exampleList)-1
のインデックスを持つと結論づけることができます。
lastElement = exampleList[len(exampleList)-1]
print("Last element: ", lastElement)
print("exampleList: ", exampleList)
secondToLast = exampleList[len(exampleList)-2]
print("Second to last element: ", secondToLast)
と出力されます。
Last element: 6
exampleList: [1, 2, 'Three', ['Four', 5], 6]
Second to last element: ['Four', 5]
ネガティブインデックスと同様に、インデックス法は元のリストに変更を加えることなく、リストの要素にアクセスするためにのみ使用されます。
pop() メソッドの使用法
Python では、与えられたリストの最後の要素を削除して、削除した項目を返すために pop()
メソッドが使われます。
pop()メソッドは、オプションで整数の引数を受け取ることができます。
この引数は削除したい要素のインデックスです。
つまり、exampleList.pop(0)を呼び出すと、最初の要素が削除されて返されます。
>
>
> 引数に負の数を指定した場合は、負のインデックスのロジックが実行されて、どの要素を削除するかが決まります。
exampleList.pop(-1) を呼び出すと、exampleList
の最後の要素が削除されます。
ただし、デフォルトの pop()
メソッドはすでに最後の要素をポップするので、実際にはインデックスを使用する必要は全くありません。
lastElement = exampleList.pop()
print("Last element: ", lastElement)
print("exampleList: ", exampleList)
と出力されます。
Last element: 6
exampleList: [1, 2, 'Three', ['Four', 5]]
pop()` メソッドは、定義上、ポップされた要素を削除することで元のリストを変更することに注意してください。
スライシングの使用
Pythonでは、リストのサブリストを取得するためにスライス記法が使われます。
この記法自体はとてもシンプルです。
exampleList[startIndex:[endIndex[:indexStep]]]
つまり、 startIndex
から始まり、 endIndex
までのインデックスを持つ exampleList
のサブリストを indexStep
というステップで取得することができます。
endIndexと
indexStepはオプションの引数である。
endIndex を空白にすると、そのデフォルト値は元のリストの末尾になる。
また、indexStep
のデフォルト値は 1
である。
リスト l=['a', 'b', 'c', 'd', 'e']
を l[1:3]
でスライスすると、結果として ['b', 'c', 'd']
というサブリストが生成されることになります。
これは、インデックスが 1, 2, 3
のリスト l
の要素を選択していることを意味します。
l[0:4:2]
は、偶数インデックス 0, 2, 4
の要素だけを含むサブリストを返します。
これから使うスライス記法の重要な特徴は、負のインデックスをサポートしていることです。
つまり、 l[-1:]
は次のように解釈できます:リスト l
の最後の要素から、リスト l
のすべての要素を取得します。
結果として得られるサブリストには、元のリストの最後の要素だけが含まれます。
lastElement = exampleList[-1:][0]
# exampleList[-1:] alone will return the sublist - [6]
# exampleList[-1:][0] will return the last element - 6
print("Last element: ", lastElement)
print("exampleList: ", exampleList)
と出力されます。
Last element: 6
exampleList: [1, 2, 'Three', ['Four', 5], 6]
このスライスメソッドは、リストの要素にアクセスし、それらを使って新しいリストを作成するためにのみ使用されます。
逆イテレータの使用
Python には、このメソッドで使用する 2 つの組み込み関数があります – reversed()
と next()
です。
reversed()はリストを引数として受け取り、そのリストの反転したイテレータを返します。
つまり、最後の要素から最初の要素に至るまで、イテレーションが逆になります。
next() はイテレータを受け取り、そのイテレータから次の要素を返します。
reversedIterator = reversed(exampleList)
lastElement = next(reversedIterator)
print("Last element: ", lastElement)
どちらが出力するかというと
Last element: 6
exampleList: [1, 2, 'Three', ['Four', 5], 6]
逆順イテレータメソッドは、リストの要素を逆順でアクセスするためにのみ使用されます – 元のリストには何も変更を加えません。
reverse() メソッドの使用
reverse()` メソッドはリストの要素を反転させるために使用します。
これは引数を取らず、値も返しませんが、その代わりに元のリストをインプレースで反転させます。
つまり、リストを反転させ、新しい最初の要素にアクセスすることができるのです。
# Update the original list by reversing its' elements
exampleList.reverse()
# Access the first element of the updated list
lastElement = exampleList[0]
print("Last element: ", lastElement)
print("exampleList: ", exampleList)
どの出力が
Last element: 6
exampleList: [6, ['Four', 5], 'Three', 2, 1]
逆順()`メソッドは、定義上、要素の順序を逆にして元のリストを変更します。
リストを逆順にするには時間がかかるので、この方法は本当に非効率的なやりすぎであることを覚えておいてください。
itemgetter() を使用する
operator` モジュールは、数学演算や論理演算、その他のオブジェクト比較やシーケンス演算など、Python の基本的な操作をすべて実行する効率的なメソッドを多数提供しています。
itemgetter()メソッドは
operator` モジュールの多くのメソッドのうちの 1 つです。
このメソッドは引数として 1 つ以上の整数を受け取り、特殊な関数の一種として見ることができる呼び出し可能なオブジェクトを返します。
例えば、 operator.itemgetter(0)
を呼び出すと、コレクション内の最初の要素を取得する関数が返されます。
また、そのオブジェクトに名前を付けることもできます。
getFirstElement = operator.itemgetter(0)
ここで、 getFirstElement(l)
にリストを渡すと、リスト l
の最初の要素を返します。
itemgetter()` 演算子は負のインデックスをサポートしているので、最後の要素を取得することは以下のようになります。
import operator
getLastElement = operator.itemgetter(-1)
lastElement = getLastElement(exampleList)
print("Last element: ", lastElement)
print("exampleList: ", exampleList)
と出力されます。
Last element: 6
exampleList: [1, 2, 'Three', ['Four', 5], 6]
この方法は、元のリストを変更するのではなく、インデックスを使用してアクセスする呼び出し可能なオブジェクトを生成します。
ループの使用
さて、もっと手軽で初歩的な方法として、ループを使う方法があります。
リストの長さを最終段階として、リストを繰り返し処理することができます。
そして、len(l)-1
の段階で、単純にその項目を返せばいいのです。
for i in range(0, len(exampleList)):
if i == (len(exampleList)-1) : lastElement = exampleList[i]
print("Last element: ", lastElement)
print("exampleList: ", exampleList)
と出力されます。
Last element: 6
exampleList: [1, 2, 'Three', ['Four', 5], 6]
これもまた、リストを変更することなく、単に要素にアクセスするだけです。
結論
Pythonでリストの最後の要素を取得する方法はたくさんあります。
自分に合った方法を選ぶときの主な関心事は、最後の要素を削除したいかどうかです。
もし元のリストに何も変更を加えずに最後の要素を取得する必要があるなら、負のインデックスを使用する方法が明らかに勝者です。
これはこの問題を解決する最も単純で最もPythonicな方法です。
一方、最後の要素にアクセスするだけでなく、それを削除する必要がある場合は、まさにこの動作を実行するための組み込みメソッドである pop()
メソッドを使うべきでしょう。