리스트의 마지막 요소 얻기


답변:


3103

some_list[-1] 가장 짧고 가장 파이썬적인 것입니다.

실제로이 구문으로 더 많은 것을 할 수 있습니다. some_list[-n]구문은 n 번째 - 투 - 마지막 요소를 가져옵니다. 따라서 some_list[-1]마지막 요소를 some_list[-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- 그것은 코드의 아름다운 라인이 될 것입니다
드미트리 P.

256

귀하의 경우 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 :]"을 조건부로 사용하려는 경우 나중에 사용하는 것이 훨씬 더 읽기 쉽다고 생각합니다. (upvote에 행복 내가 뭔가 놓친 경우)
스탠 Kurdziel

9
귀하는 투표권이 이해되고 유효합니다. 그러나 예외 개체의 목적에 대한 두 가지 기본 캠프가 있습니다. 한 가지 확실한 점은 예외로 인해 앱이 중단된다는 것입니다. 다른 캠프는 대신 if len (alist)> 0 : 구조를 사용하므로 한 캠프는 try 절에서 예외를 사용합니다. 어쨌든 예외는 코드를 정지시키는 객체입니다. 그리고 나에게 그와 같은 시퀀스 객체는 코드를 멈추지 않는 "null"-시퀀스를 반환합니다. 필자는 try 절로 선점 한 코드를 중단시키는 객체 대신 IF 절을 사용하여 "null"객체를 테스트하는 것을 선호합니다.
DevPlayer

6
슬라이스 구문이 토론의 가치가 있기 때문에 찬성했지만 @StanKurdziel에 동의하여 형태가 잘못되었다는 것에 동의합니다. 목표를 옮기는 것입니다. '아직 추가하지 않음'(델타 선 그래프)이므로 결합 된 표현식 if len(my_vector) == 0 or my_vector[-1] != update_val은 실행 가능한 패턴입니다. 그러나 그것은 확실히 세계적인 해결책은 아닙니다. None이 결과 인 구문 형태를 갖는 것이 좋을 것입니다
Mark Mullin

17
xs[-1] if xs else None
가브리엘

2
왜 IndexError를 "피할 것"입니까? 빈 목록이나 문자열을 색인하려고하면 예외가 발생합니다. 해당 예외를 처리하려면 try / except를 사용하십시오. 이것이 바로 거기에 있습니다.
크리스 존슨 2

93

당신은 또한 할 수 있습니다 :

alist.pop()

pop()메소드가 마지막 요소를 삭제 하므로 목록으로 수행하려는 작업에 따라 다릅니다 .


70

파이썬에서 마지막 요소를 표시하는 가장 간단한 방법은

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

그러한 목표를 달성하기위한 다른 많은 방법들이 있지만, 사용하기에는 짧고 달콤합니다.


2
목록 길이가 0이면이 솔루션은 작동하지만 list[-1]오류가 발생합니다.
anon01

뭐? 왜 당신은 a[-1:][0] 전혀 하시겠습니까? 그는 a[-1]어쨌든 제공합니다 . 설명해주세요
kaboom

51

파이썬에서는리스트의 마지막 요소를 어떻게 얻습니까?

마지막 요소를 얻으려면

  • 목록을 수정하지 않고
  • 목록 에 마지막 요소 있다고 가정하면 (예 : 비어 있지 않음)

-1아래 첨자 표기법으로 전달 하십시오.

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

설명

인덱스와 슬라이스는 음수를 인수로 사용할 수 있습니다.

각 색인에서 참조하는 시퀀스의 항목 (이 경우 string ) 에서 마지막 요소 인 문자를 참조 하는 예제 수정했습니다 ."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'

반복 가능한 포장 풀기를 통한 할당

이 방법은 마지막 요소를 얻기위한 목적으로, 그러나 완전성을 위해 (그리고 목록뿐만 아니라 반복 가능하기 때문에) 두 번째 목록을 불필요하게 구체화 할 수 있습니다.

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

변수 이름 head는 불필요한 새로 작성된리스트에 바인드됩니다.

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

해당 목록을 사용하지 않으려는 경우이 방법이 더 좋습니다.

*_, last = a_list

또는 실제로 목록이라는 것을 알고 있다면 (또는 적어도 첨자 표기법을 받아들입니다) :

last = a_list[-1]

기능에서

한 논평자는 말했다 :

파이썬이 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 루프

파이썬의 특징으로서, 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

13

를 방지하려면 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()목록의 마지막 요소를 검색하지만 원래 목록을 변경 / 변경합니다. 일반적으로 원본 목록을 변경하지 않는 것이 좋습니다.

또는 어떤 이유로 든 파이썬이 아닌 것을 찾고 있다면 list[len(list)-1]목록이 비어 있지 않다고 가정 하여을 사용할 수 있습니다 .


2
원래 목록을 변경하는 것은 일반적으로 권장되지 않기 때문에 일반적으로 권장되지 않는다고 가정하는 것은 좋지 않습니다.
Aaron

6

목록이 비어있을 때 IndexError를 원하지 않으면 아래 코드를 사용할 수도 있습니다.

next(reversed(some_list), None)

4

좋아, 그러나 거의 모든 언어 방식에서 일반적인 것은 items[len(items) - 1]어떻습니까? 이것은 pythonic 지식이 필요하지 않기 때문에 마지막 요소를 얻는 가장 쉬운 방법 입니다.


3
items [len (items)-1]은 기본적으로 파이썬이 수행하는 작업이지만 시퀀스의 len이 이미 시퀀스에 저장되어 있으므로 계산할 필요가 없으므로 필요한 것보다 많은 작업을 생성하고 있습니다.
Dan Gayle

21
파이썬을 작성하고 있기 때문에 좀 더 파이썬적인 태도를 취해야합니다.
Michael Wu

5
@MichaelWu 그렇게 할 의미가 없습니다. 파이썬 방식은 종종 설명이 필요하지 않으며 프로젝트에 새로운 사람을 소개해야 할 경우 더 많은주의가 필요하며 물론 Java와 같은 다른 언어로 전환해야 할 때 작동하지 않습니다-파이썬 관련 지식을 사용할 수 없습니다. 가능한 한 피 토닉 방식을 생략하면 몇 개월 / 년 후에 프로젝트로 돌아 오는 것이 훨씬 쉽습니다.
Radek Anuszewski

7
@Pneumokok 당신은 요점을 지적하지만,리스트 인덱싱은 제너레이터에 비해 매우 기본적인 파이썬 기술 이라고 주장합니다 . 또한 개별 언어 도구와 구문을 활용하지 않으려는 경우 C 이외의 다른 언어 또는 Javascript를 사용하는 이유가 무엇입니까? 그러면 모든 프로젝트에서 일관되게 모든 작업을 수행 할 수 있습니다.
Matthew Purdon

그것은 매우 파이썬 적이지는 않지만 나는 이것이 some_list[-1]논리적 인 접근법이기 때문에 접근 방식보다 더 나은 것으로 some_list[-1]생각 하고 실제로 내 의견 보다 더 잘하는 것을 보여줍니다 .
바이런 파일러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.