リストの最後の要素を取得する


回答:


3108

some_list[-1] 最も短く、最もPythonicです。

実際、この構文を使用すると、さらに多くのことができます。some_list[-n]構文は、n番目から最後の要素を取得します。したがってsome_list[-1]、最後の要素をsome_list[-2]取得し、2番目から最後まで取得しsome_list[-len(some_list)]、以下同様に、最初の要素を取得します。

この方法でリスト要素を設定することもできます。例えば:

>>> some_list = [1, 2, 3]
>>> some_list[-1] = 5 # Set the last element
>>> some_list[-2] = 3 # Set the second to last element
>>> some_list
[1, 3, 5]

インデックスでリストアイテムを取得すると、IndexError必要なアイテムが存在しない場合にが発生することに注意してください。この手段some_list[-1]場合は例外が発生しますsome_list空である空のリストは最後の要素を持つことができないので、。


6
私は次のようなものを見逃していますsome_list.last-それは美しいコード行になるでしょう
Dmitry P.

257

str()またはlist()オブジェクトが空になる可能性がある場合:astr = ''またはalist = []、オブジェクトの「同一性」のalist[-1:]代わりに使用したい場合がありますalist[-1]

これの重要性は次のとおりです。

alist = []
alist[-1]   # will generate an IndexError exception whereas 
alist[-1:]  # will return an empty list
astr = ''
astr[-1]    # will generate an IndexError exception whereas
astr[-1:]   # will return an empty str

ここでの違いは、空のリストオブジェクトまたは空のstrオブジェクトを返すことは、例外オブジェクトよりも「最後の要素」に似ているということです。


26
この回答の核心が正しくないと感じたため、反対票を投じました。要素が必要なときにリストを取得すると、必然的に「範囲外のリストインデックス」が延期されます。これが、空のリストから要素を取得しようとしたときに起こることです。文字列の場合、astr [-1:]はastr [-1]と同じ型を返すため、有効なアプローチである可能性がありますが、「:」が空のリストを処理するのに役立つとは思いません(そして、質問はリストについてです) 。条件が "len(alist)> 0"の代わりに "alist [-1:]"を使用することである場合、後者を使用する方がはるかに読みやすいと思います。(私が何かを見逃した場合は、
賛成投票してください

9
反対票は理解でき、有効です。ただし、例外オブジェクトの対象となるものには2つの基本的なキャンプがあることがわかりました。1つの確実性は、例外がアプリを停止させることです。1つのキャンプでは、try句で例外を使用します。他のキャンプでは、代わりにif len(alist)> 0:構造体を使用します。いずれにせよ、例外はコードを停止させるオブジェクトです。そのため、私にとっては、コードを停止させない「null」シーケンスを返すようなシーケンスオブジェクトは少なくなっています。私の好みは、try句でプリエンプトしたコードを停止するオブジェクトではなく、IF句を使用して "null"オブジェクトをテストすることです。
DevPlayer 2015年

6
スライス構文は議論に値するので賛成ですが、形態が間違っているという@StanKurdzielに同意します、あなたはゴールポストを動かしているだけです-私の独自の解決策は、「これをリストに追加する」の主な用途に関連していることがわかりました「まだ追加していない」(デルタ線グラフ)ので、組み合わせた式if len(my_vector) == 0 or my_vector[-1] != update_valは実行可能なパターンです。しかし、それは確かにグローバルな解決策ではありません
。None

17
xs[-1] if xs else None
ガブリエル

2
IndexErrorを「回避」するのはなぜですか?空のリストまたは文字列のインデックスを作成しようとすると、例外が発生します。その例外を処理したい場合は、try / exceptを使用してください。それが目的です。
クリスジョンソン

94

あなたも行うことができます:

alist.pop()

pop()メソッドは最後の要素を削除するため、リストをどのように処理するかによって異なります。


71

Pythonで最後の要素を表示する最も簡単な方法は、

>>> list[-1:] # returns indexed value
    [3]
>>> list[-1]  # returns value
    3

このような目標を達成する方法は他にもたくさんありますが、これらは短くて使いやすいものです。


2
リストの長さがゼロの場合、この解決策list[-1]はエラーになりますが、
anon01 2018

何?なんでそんなことa[-1:][0] するのa[-1]とにかく彼も提供します。説明してください?
kaboom

52

Pythonでは、リストの最後の要素をどのように取得しますか?

最後の要素を取得するには、

  • リストを変更せずに
  • リスト最後の要素あることがわかっいる(つまり、空ではない)

-1下付き表記に渡します。

>>> a_list = ['zero', 'one', 'two', 'three']
>>> a_list[-1]
'three'

説明

インデックスとスライスは、引数として負の整数を取ることができます。

ドキュメントの例を変更して、各インデックスがシーケンスのどのアイテムを参照するかを示します。この場合、文字列"Python"-1、最後の要素である文字を参照します'n'

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
   0   1   2   3   4   5 
  -6  -5  -4  -3  -2  -1

>>> p = 'Python'
>>> p[-1]
'n'

反復可能なアンパックによる割り当て

このメソッドは、最後の要素を取得する目的だけでなく、完全を期すために(そして、リストだけでなくすべての反復可能オブジェクトをサポートするため)、2番目のリストを不必要に具体化する場合があります。

>>> *head, last = a_list
>>> last
'three'

変数名headは、新しく作成された不要なリストにバインドされています。

>>> head
['zero', 'one', 'two']

あなたがそのリストで何もしないつもりなら、これはより適切です:

*_, last = a_list

または、本当に、それがリストであることがわかっている場合(または少なくとも添え字表記を受け入れる場合)は、

last = a_list[-1]

関数内

コメント者は言った:

Lispと同じように、Pythonにfirst()とlast()の関数があればいいのですが...不要なラムダ関数がたくさん削除されます。

これらの定義は非常に簡単です。

def last(a_list):
    return a_list[-1]

def first(a_list):
    return a_list[0]

または使用operator.itemgetter

>>> import operator
>>> last = operator.itemgetter(-1)
>>> first = operator.itemgetter(0)

どちらの場合にも:

>>> last(a_list)
'three'
>>> first(a_list)
'zero'

特殊なケース

もっと複雑なことをしている場合は、少し異なる方法で最後の要素を取得する方がパフォーマンスが高い場合があります。

プログラミングに不慣れな場合は、このセクションを避けてください。これは、アルゴリズムの意味的に異なる部分を一緒に結合するためです。アルゴリズムを1か所で変更すると、別のコード行に意図しない影響を与える可能性があります。

私はできる限り注意と条件を提供しようと努めていますが、何かを見逃しているかもしれません。警告を残していると思われる場合はコメントしてください。

スライス

リストのスライスは新しいリストを返します。そのため、新しいリストの要素が必要な場合は、-1から最後までスライスできます。

>>> a_slice = a_list[-1:]
>>> a_slice
['three']

これには、リストが空の場合でも失敗しないという利点があります。

>>> empty_list = []
>>> tail = empty_list[-1:]
>>> if tail:
...     do_something(tail)

インデックスでアクセスしようIndexErrorとすると、処理する必要のあるが発生します。

>>> empty_list[-1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

ただし、この目的のためのスライスは、必要な場合にのみ行う必要があります。

  • 作成された新しいリスト
  • 以前のリストが空の場合、新しいリストは空になります。

for ループ

Pythonの機能として、forループ内にスコープはありません。

リストに対して既に完全な反復を実行している場合、最後の要素はループで割り当てられた変数名によって参照されます。

>>> def do_something(arg): pass
>>> for item in a_list:
...     do_something(item)
...     
>>> item
'three'

これは意味的にリストの最後のものではありません。これは意味的に、名前が最後itemに結び付けられたものです。

>>> def do_something(arg): raise Exception
>>> for item in a_list:
...     do_something(item)
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 1, in do_something
Exception
>>> item
'zero'

したがって、これは、次の場合にのみ最後の要素を取得するために使用する必要があります

  • すでにループしています
  • ループが終了する(エラーが原因で中断または終了しない)ことがわかっている場合は、ループが参照する最後の要素を指します。

それを取得して削除する

最後の要素を削除して返すことにより、元のリストを変更することもできます。

>>> a_list.pop(-1)
'three'
>>> a_list
['zero', 'one', 'two']

ただし、元のリストは変更されています。

-1実際にはデフォルトの引数なのでlist.pop、インデックス引数なしで使用できます):

>>> a_list.pop()
'two'

これを行うのは、

  • リストに要素が含まれていること、またはリストが空の場合に例外を処理する準備ができていること、
  • リストから最後の要素を削除し、スタックのように扱うつもりです。

これらは有効なユースケースですが、あまり一般的ではありません。

残りのリバースを後で使用するために保存します。

なぜそうするのかはわかりませんが、完全を期すためreversedに、反復子(反復子プロトコルをサポートしています)を返すため、結果をnext次のように渡すことができます。

>>> next(reversed([1,2,3]))
3

つまり、これを逆に行うようなものです。

>>> next(iter([1,2,3]))
1

しかし、後でリバースイテレータの残りの部分が必要になる場合を除いて、これを行う正当な理由は考えられません。おそらく次のようになります。

reverse_iterator = reversed([1,2,3])
last_element = next(reverse_iterator)

use_later = list(reverse_iterator)

そしていま:

>>> use_later
[2, 1]
>>> last_element
3

14

を防ぐIndexError: list index out of rangeには、次の構文を使用します。

mylist = [1, 2, 3, 4]

# With None as default value:
value = mylist and mylist[-1]

# With specified default value (option 1):
value = mylist and mylist[-1] or 'default'

# With specified default value (option 2):
value = mylist[-1] if mylist else 'default'


10

lst[-1]最良のアプローチですが、一般的なイテラブルでは、以下を検討してmore_itertools.lastください。

コード

import more_itertools as mit


mit.last([0, 1, 2, 3])
# 3

mit.last(iter([1, 2, 3]))
# 3

mit.last([], "some default")
# 'some default'

6

list[-1]リストを変更せずにリストの最後の要素を取得します。 list.pop()リストの最後の要素を取得しますが、元のリストを変更または変更します。通常、元のリストを変更することはお勧めしません。

あるいは、なんらかの理由でPython的でないものを探している場合はlist[len(list)-1]、リストが空ではないと想定して、を使用できます。


2
結局のところ、非常に一般的に行われているため、元のリストを変更することは通常は推奨されないと仮定するのはおそらく悪いことです
Aaron

6

リストが空のときにIndexErrorを取得したくない場合は、以下のコードを使用することもできます。

next(reversed(some_list), None)

4

わかりましたが、ほとんどすべての言語に共通することは何items[len(items) - 1]ですか?これは、Pythonの知識を必要としないため、最後の要素を取得する最も簡単な方法です。


3
items [len(items)-1]は基本的にPythonが内部で実行していることですが、シーケンスのlenはすでにシーケンスに格納されているため、カウントする必要がないため、必要以上の作業を作成しています。
Dan Gayle

21
あなたがPythonを書いているので、あなたは本当にもっとPythonicになるように努めるべきです
Michael Wu

5
@MichaelWuそれをする意味はありません。多くの場合、Pythonicの方法は一目瞭然ではありません。プロジェクトに新しい人を紹介する必要がある場合は注意が必要です。もちろん、Javaなどの他の言語に切り替える必要がある場合は機能しません。Python固有の知識を使用することはできません。可能な限りpythonicの方法を省略すると、数か月/数年後にプロジェクトに戻るのもはるかに簡単になります。
Radek Anuszewski、2015年

7
@Pneumokok要点はわかりますが、リストのインデックス付けは、ジェネレーターと比較すると非常に基本的なPythonのテクニックだと私は主張します。また、個々の言語ツールと構文を利用しないのであれば、なぜCやJavaScript以外のものを使用する必要があるのでしょうか。そうすれば、すべてのプロジェクトで一貫して困難な方法ですべてを行うことができます。
Matthew Purdon

それは非常にpythonicではありませんが、これはsome_list[-1]より論理的でありsome_list[-1]、私の意見よりも実際にうまく機能していることを示しているため、いくつかの点でアプローチより優れていると思います。
Byron Filer 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.