リストの末尾 n 個を取り出したい
Python のリスト a
の末尾 n 個の要素を取り出したいです。ただし、n は任意の整数になりえ、n ≦ 0 のときは []
、n > len(a) のときは a
を返すようにしたいです。
たとえば a = [1, 2, 3, 4, 5, 6]
, n = 2
だと、末尾 2 つの [5, 6]
が返ってくるようにしたいです。
試したこと1
>>> a[-2:]
[5, 6]
スライスを作る方法 a[m:]
で m < 0
にすると末尾がとれます。ただしこれだと -len(a) < n ≦ 0 のときに動かしたいようには動きません。特に n = 0 のとき、末尾 0 個ではなく a
全体が返ってきてしまいます。
>>> # n > len(a) のときはきちんと a が返ってくる
... a[-10:]
[1, 2, 3, 4, 5, 6]
>>> a[-15:]
[1, 2, 3, 4, 5, 6]
>>> # -len(a) < n <= 0 のとき、[] が返ってこない
... a[0:]
[1, 2, 3, 4, 5, 6]
>>> a[2:]
[3, 4, 5, 6]
>>> # n ≦ -len(a) のときは、きちんと [] が返ってくる
... a[10:]
[]
試したこと2
>>> a[len(a)-2:]
[5, 6]
明示的に何個目以降が必要なのかを計算してスライスを作ると末尾がとれます。ただしこれだと len(a) < n < 2*len(a) のときに動かしたいようには動きません。
>>> # len(a) < n < 2*len(a) のとき、a が返ってこない
... a[len(a)-10:]
[3, 4, 5, 6]
>>> # n >= 2*len(a) のとき、きちんと a が返ってくる
... a[len(a)-15:]
[1, 2, 3, 4, 5, 6]
>>> # n <= 0 のとき、きちんと [] が返ってくる
... a[len(a)-0:]
[]
>>> a[len(a)+2:]
[]
>>> a[len(a)+10:]
[]
質問
上 2 つの方法はどちらも 0 < n ≦ len(a) のとき思ったように動作しますが、それ以外のときに思ったようには動いてくれません。
適当な関数を作って if 文で n を場合分けすれば上手く動かせますが、それだと毎回自分で定義しないといけません。もちろんそれを自前のライブラリ化して import
しても良いのですが、それよりラクな方法があるなら知りたいです。
- 組み込みの関数を使って 簡単に 末尾を取れないのでしょうか? たとえば
a.last(n)
のように末尾を取れないでしょうか。 - あるいは、適当な有名ライブラリに末尾を取るための関数があったりしないでしょうか?
環境: Python 3.6.5