私はリストの最後の9つの番号が必要で、スライスでそれをする方法があると確信しています、しかし私はそれを得ることができないようです。私はこのように最初の9を手に入れることができます:
num_list[0:9]
どんな助けでも素晴らしいでしょう。
そのためには、スライス演算子で負の整数を使用できます。これが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:]
です
負のインデックスはリストの最後から数えるので、
num_list[-9:]
Pythonのスライシングは非常に高速な操作であり、データの一部に素早くアクセスするのに便利な方法です。
リスト(または文字列のようにそれをサポートする他のシーケンス)から最後の9つの要素を取得するためのスライス表記は次のようになります。
num_list[-9:]
これを見ると、括弧の中の部分を「最後から9番目まで」と読みます。 (実際には、精神的には "-9、on"と略記しています)
完全な表記は
sequence[start:stop:step]
しかしコロンは、通常のインデックスではなくスライスを提供していることをPythonに伝えているものです。 Python 2でリストをコピーする慣用的な方法が
list_copy = sequence[:]
そしてそれらをクリアすることがあります:
del my_list[:]
(リストはPython 3ではget list.copy
とlist.clear
になります。)
スライスをlist.__getitem__
メソッドに渡すことからスライスを形成することを分離するのが便利であると思うかもしれません( が角括弧がすることです )。あなたがそれに慣れていなくても、それはあなたのコードをより読みやすくして、あなたのコードを読まなければならないかもしれない他の人があなたがしていることをもっと容易に理解できるようにします。
しかし、コロンで区切られたいくつかの整数を単に変数に代入することはできません。スライスオブジェクトを使う必要があります。
last_nine_slice = slice(-9, None)
2番目の引数None
name__は必須です。そのため、最初の引数はstart
name__引数 として解釈され、それ以外の場合はstop
name__引数 になります。
スライスオブジェクトをシーケンスに渡すことができます。
>>> list(range(100))[last_nine_slice]
[91, 92, 93, 94, 95, 96, 97, 98, 99]
islice
name__itertoolsモジュールのislice
name__は、これを実現するためのもう1つの方法です。 islice
name__は負の引数を取らないので、理想的にはイテラブルは__reversed__
特別なメソッドを持っています - どのlistは持っています - 最初にリストを渡す必要があります。 __reversed__
)からreversed
name__まで反復可能です。
>>> from itertools import islice
>>> islice(reversed(range(100)), 0, 9)
<itertools.islice object at 0xffeb87fc>
isliceはデータパイプラインの遅延評価を可能にするので、データを具体化するために(list
name__のように)コンストラクタに渡します:
>>> list(islice(reversed(range(100)), 0, 9))
[99, 98, 97, 96, 95, 94, 93, 92, 91]
最後の9つの要素は、numlist [-9:]を使用して左から右へ、またはnumlist [: - 10:-1]を使用して右から左へ読み取ることができます。
>>> a=range(17)
>>> print a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> print a[-9:]
[8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> print a[:-10:-1]
[16, 15, 14, 13, 12, 11, 10, 9, 8]
反復可能オブジェクトの「末尾」の項目を取得するためのいくつかのオプションがあります。
与えられた
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はサードパーティのライブラリをインストールすることを必要とします。