web-dev-qa-db-ja.com

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

私はリストの最後の9つの番号が必要で、スライスでそれをする方法があると確信しています、しかし私はそれを得ることができないようです。私はこのように最初の9を手に入れることができます:

num_list[0:9]

どんな助けでも素晴らしいでしょう。

217
Nope

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

397
winsmith

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

num_list[-9:]
82
cobbal

スライス

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.copylist.clearになります。)

スライスにわかりやすい名前を付けます。

スライスをlist.__getitem__メソッドに渡すことからスライスを形成することを分離するのが便利であると思うかもしれません( が角括弧がすることです )。あなたがそれに慣れていなくても、それはあなたのコードをより読みやすくして、あなたのコードを読まなければならないかもしれない他の人があなたがしていることをもっと容易に理解できるようにします。

しかし、コロンで区切られたいくつかの整数を単に変数に代入することはできません。スライスオブジェクトを使う必要があります。

last_nine_slice = slice(-9, None)

2番目の引数Nonename__は必須です。そのため、最初の引数はstartname__引数 として解釈され、それ以外の場合はstopname__引数 になります。

スライスオブジェクトをシーケンスに渡すことができます。

>>> list(range(100))[last_nine_slice]
[91, 92, 93, 94, 95, 96, 97, 98, 99]

islicename__

itertoolsモジュールのislicename__は、これを実現するためのもう1つの方法です。 islicename__は負の引数を取らないので、理想的にはイテラブルは__reversed__特別なメソッドを持っています - どのlistは持っています - 最初にリストを渡す必要があります。 __reversed__)からreversedname__まで反復可能です。

>>> from itertools import islice
>>> islice(reversed(range(100)), 0, 9)
<itertools.islice object at 0xffeb87fc>

isliceはデータパイプラインの遅延評価を可能にするので、データを具体化するために(listname__のように)コンストラクタに渡します:

>>> list(islice(reversed(range(100)), 0, 9))
[99, 98, 97, 96, 95, 94, 93, 92, 91]
41
Aaron Hall

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

反復可能オブジェクトの「末尾」の項目を取得するためのいくつかのオプションがあります。

与えられた

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 スライス は言語固有のものです。このオプションは、文字列、リスト、タプルなどの sequence で機能します。ただし、この種のスライスは イテレータ では機能しません。 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はサードパーティのライブラリをインストールすることを必要とします。

3
pylang