Pythonでリストの最後の項目を取得する方法は?


回答:


519

そのためにスライス演算子で負の整数を使用できます。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:]


11
-0です0。つまり、最後のゼロ要素ではなく、a[-0:]全体を返します。ゼロを保護するには、を使用できます。a[]a[-n:] if n > 0 else []
nekketsuuu

93

負のインデックスはリストの最後から数えるので、

num_list[-9:]

53

スライス

Pythonスライシングは信じられないほど高速な操作であり、データの一部にすばやくアクセスするための便利な方法です。

リスト(または文字列など、それをサポートするその他のシーケンス)から最後の9つの要素を取得するためのスライス表記は次のようになります。

num_list[-9:]

これを見ると、括弧内の部分を「終わりから9番目、終わりまで」と読みました。(実際には、精神的には「-9、on」と略しています)

説明:

完全な表記は

sequence[start:stop:step]

しかし、コロンは、Pythonに通常のインデックスではなくスライスを与えることを伝えるものです。そのため、Python 2でリストをコピーする慣用的な方法は

list_copy = sequence[:]

そしてそれらをクリアすることで:

del my_list[:]

(リストは取得list.copyおよびlist.clearPythonで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

isliceitertoolsモジュールからは、これを取得するためのもう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]

あなたの精神的な略語は非常に役に立ちます
Swanky Coder '21

40

最後の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]

6

イテラブルの「テール」アイテムを取得するためのいくつかのオプションを次に示します。

与えられた

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))

細部

  • A.従来のPythonのスライスは言語に固有のものです。このオプションは、文字列、リスト、タプルなどのシーケンスで機能します。ただし、この種のスライスはイテレータなどでは機能しませんiter(iterable)
  • B. itertoolsレシピ。イテラブルを処理するように一般化され、最後のソリューションのイテレーターの問題を解決します。このレシピは公式にはitertoolsモジュールに含まれていないため、手動で実装する必要があります。
  • C.後者のツール(B)を含む多くのレシピは、サードパーティのパッケージに便利に実装されています。これらのライブラリをインストールしてインポートすると、手動での実装が不要になります。これらのライブラリの1つが呼び出されますmore_itertools(を介してインストール> pip install more-itertools)。参照してくださいmore_itertools.tail
  • D. itertoolsライブラリのメンバー。は、itertools.islice 負のスライスをサポートしていません
  • E. ネガティブスライスをサポートするためにmore_itertools一般化された別のツールが実装されていitertools.isliceます。参照してくださいmore_itertools.islice_extended

どちらを使用しますか?

場合によります。ほとんどの場合、スライシング(他の回答で述べたオプションA)は、言語に組み込まれ、ほとんどの反復可能な型をサポートするため、最も単純なオプションです。より一般的なイテレータには、残りのオプションのいずれかを使用します。オプションCとEにはサードパーティのライブラリをインストールする必要があることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.