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

2009年05月31日に質問されました。  ·  閲覧回数 2.3M回  ·  ソース

Janusz picture
2009年05月31日

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

回答

Sasha Chedygov picture
2009年05月31日
3323

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が空の場合、空のリストに最後の要素を含めることができないため、 some_list[-1]が例外を発生させることを意味します。

DevPlayer picture
2010年11月10日
268

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オブジェクトを返すことは、例外オブジェクトよりも「最後の要素」であるということです。

Taurus Olson picture
2009年05月31日
107

次のこともできます。

alist.pop()

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

Atul Arvind picture
2012年08月21日
76

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

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

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

Aaron Hall picture
2017年06月24日
57

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]

関数内

コメント投稿者は言った:

PythonにLispのように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から最後までスライスできます。

>>> 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
Valentin Podkamennyi picture
2019年04月13日
20

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'
pylang picture
2018年08月01日
12

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'
Sanjay Pradeep picture
2016年01月10日
10

別の方法:

some_list.reverse() 
some_list[0]
Sondering Narcissist picture
2016年10月07日
7

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

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

Yavuz Mester picture
2017年06月02日
7

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

next(reversed(some_list), None)