回答:
そのためにスライス演算子で負の整数を使用できます。Python CLIインタープリターを使用した例を次に示します。
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> a[-9:]
[4, 5, 6, 7, 8, 9, 10, 11, 12]
重要なラインは a[-9:]
-0
です0
。つまり、最後のゼロ要素ではなく、a[-0:]
全体を返します。ゼロを保護するには、を使用できます。a
[]
a[-n:] if n > 0 else []
Pythonスライシングは信じられないほど高速な操作であり、データの一部にすばやくアクセスするための便利な方法です。
リスト(または文字列など、それをサポートするその他のシーケンス)から最後の9つの要素を取得するためのスライス表記は次のようになります。
num_list[-9:]
これを見ると、括弧内の部分を「終わりから9番目、終わりまで」と読みました。(実際には、精神的には「-9、on」と略しています)
完全な表記は
sequence[start:stop:step]
しかし、コロンは、Pythonに通常のインデックスではなくスライスを与えることを伝えるものです。そのため、Python 2でリストをコピーする慣用的な方法は
list_copy = sequence[:]
そしてそれらをクリアすることで:
del my_list[:]
(リストは取得list.copy
およびlist.clear
Pythonで3)
list.__getitem__
メソッドに渡すことからスライスを形成することを分離するのが便利かもしれません(それが角括弧がすることです)。あなたがそれに慣れていない場合でも、コードを読みやすくし、コードを読む必要のある他の人があなたが何をしているかをより簡単に理解できるようにします。
ただし、コロンで区切られた整数を変数に割り当てることはできません。スライスオブジェクトを使用する必要があります。
last_nine_slice = slice(-9, None)
第二引数は、None
最初の引数として解釈されるように、必要とされるstart
引数そうでない場合は次のようになりstop
引数。
次に、スライスオブジェクトをシーケンスに渡すことができます。
>>> list(range(100))[last_nine_slice]
[91, 92, 93, 94, 95, 96, 97, 98, 99]
islice
islice
itertoolsモジュールからは、これを取得するためのもう1つの実行可能な方法です。islice
そう理想的には、負の引数を取ることはありませんあなたのiterableている__reversed__
特別な方法-リストない持っている-あなたが最初にあなたのリスト(または反復可能で合格しなければならないよう__reversed__
に)reversed
。
>>> from itertools import islice
>>> islice(reversed(range(100)), 0, 9)
<itertools.islice object at 0xffeb87fc>
isliceはデータパイプラインの遅延評価を可能にするため、データを具体化するには、それをコンストラクター(などlist
)に渡します。
>>> list(islice(reversed(range(100)), 0, 9))
[99, 98, 97, 96, 95, 94, 93, 92, 91]
イテラブルの「テール」アイテムを取得するためのいくつかのオプションを次に示します。
与えられた
n = 9
iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
望ましい出力
[2, 3, 4, 5, 6, 7, 8, 9, 10]
コード
次のオプションのいずれかを使用して、後者の出力を取得します。
from collections import deque
import itertools
import more_itertools
# A: Slicing
iterable[-n:]
# B: Implement an itertools recipe
def tail(n, iterable):
"""Return an iterator over the last *n* items of *iterable*.
>>> t = tail(3, 'ABCDEFG')
>>> list(t)
['E', 'F', 'G']
"""
return iter(deque(iterable, maxlen=n))
list(tail(n, iterable))
# C: Use an implemented recipe, via more_itertools
list(more_itertools.tail(n, iterable))
# D: islice, via itertools
list(itertools.islice(iterable, len(iterable)-n, None))
# E: Negative islice, via more_itertools
list(more_itertools.islice_extended(iterable, -n, None))
細部
iter(iterable)
。itertools
レシピ。イテラブルを処理するように一般化され、最後のソリューションのイテレーターの問題を解決します。このレシピは公式にはitertools
モジュールに含まれていないため、手動で実装する必要があります。more_itertools
(を介してインストール> pip install more-itertools
)。参照してくださいmore_itertools.tail
。itertools
ライブラリのメンバー。は、itertools.islice
負のスライスをサポートしていません。 more_itertools
一般化された別のツールが実装されていitertools.islice
ます。参照してくださいmore_itertools.islice_extended
。どちらを使用しますか?
場合によります。ほとんどの場合、スライシング(他の回答で述べたオプションA)は、言語に組み込まれ、ほとんどの反復可能な型をサポートするため、最も単純なオプションです。より一般的なイテレータには、残りのオプションのいずれかを使用します。オプションCとEにはサードパーティのライブラリをインストールする必要があることに注意してください。