Python 2.6의 반복기에서 마지막 항목을 가져 오는 가장 좋은 방법은 무엇입니까? 예를 들어
my_iter = iter(range(5))
지고의 짧은 코드 / 깨끗한 방법은 무엇입니까 4
에서는 my_iter
?
나는 이것을 할 수 있지만 그것은 매우 효율적이지 않은 것 같습니다.
[x for x in my_iter][-1]
iter(range(5))
Python 2.6의 반복기에서 마지막 항목을 가져 오는 가장 좋은 방법은 무엇입니까? 예를 들어
my_iter = iter(range(5))
지고의 짧은 코드 / 깨끗한 방법은 무엇입니까 4
에서는 my_iter
?
나는 이것을 할 수 있지만 그것은 매우 효율적이지 않은 것 같습니다.
[x for x in my_iter][-1]
iter(range(5))
답변:
item = defaultvalue
for item in my_iter:
pass
None
? 이것이 바로 그 이유 None
입니다. 일부 기능별 기본값이 정확할 수도 있다고 제안하고 있습니까? 반복기가 실제로 반복되지 않으면 대역 외 값이 잘못된 함수 별 기본값보다 더 의미가 있습니다.
None
기본값 으로 사용하려는 경우 선택합니다. None은 항상 가장 합리적인 기본값은 아니며 대역 외일 수도 있습니다. 개인적으로 나는 그것이 진정으로 유일한 값인지 확인하기 위해 'defaultvalue = object ()'를 사용하는 경향이 있습니다. 기본 선택이이 예제의 범위를 벗어난다는 것을 나타냅니다.
None
이 최종 값의로
deque
크기 1을 사용하십시오 .
from collections import deque
#aa is an interator
aa = iter('apple')
dd = deque(aa, maxlen=1)
last_element = dd.pop()
Python 3.x를 사용하는 경우 :
*_, last = iterator # for a better understanding check PEP 448
print(last)
Python 2.7을 사용하는 경우 :
last = next(iterator)
for last in iterator:
continue
print last
참고 :
일반적으로 위에 제시된 솔루션은 일반적인 경우에 필요한 것이지만 대용량 데이터를 처리하는 경우 deque
크기 1 을 사용하는 것이 더 효율적 입니다. ( source )
from collections import deque
#aa is an interator
aa = iter('apple')
dd = deque(aa, maxlen=1)
last_element = dd.pop()
*lst, last = some_iterable
.
_
는 파이썬의 특수 변수이며 마지막 값을 저장하거나 값에 대해 신경 쓰지 않는다고 말할 때 사용됩니다.
다음과 같이 간단합니다.
max(enumerate(the_iter))[1]
enumerate
반환 되기 때문에 작동 합니다 (index, value)
: (0, val0), (1, val1), (2, val2)
... 그리고 max
튜플 목록이 주어지면 기본적 으로 튜플의 첫 번째 값과 비교합니다. 인덱스를 나타 내기 때문입니다. 그러면 후행 첨자는 max가 전체 (idx, value) 튜플을 반환하는 반면 우리는 value
. 흥미로운 아이디어.
이것은 람다로 인해 빈 for 루프보다 빠를 것 같지 않지만 다른 사람에게 아이디어를 줄 수 있습니다.
reduce(lambda x,y:y,my_iter)
iter가 비어 있으면 TypeError가 발생합니다.
TypeError
빈 이터 러블 을 올리는 대신 초기 값을 통해 기본값을 제공 할 수도 있습니다 ( reduce()
예 :) last = lambda iterable, default=None: reduce(lambda _, x: x, iterable, default)
.
이거 있어요
list( the_iter )[-1]
반복의 길이가 정말 대단하다면 (너무 길어서 목록을 구체화하면 메모리가 고갈 될 것입니다) 디자인을 다시 생각해야합니다.
reversed
다소 임의적으로 보이는 반복자 대신 시퀀스 만 사용 한다는 점을 제외하면을 사용 합니다.
어떤 식 으로든 전체 반복기를 실행해야합니다. 최대 효율에서 반복자가 다시 필요하지 않으면 모든 값을 폐기 할 수 있습니다.
for last in my_iter:
pass
# last is now the last item
그래도 이것이 차선책이라고 생각합니다.
비슷한 코드를 보려면 다음 코드를 참조하십시오.
http://excamera.com/sphinx/article-islast.html
다음과 같이 마지막 항목을 선택하는 데 사용할 수 있습니다.
[(last, e) for (last, e) in islast(the_iter) if last]
islast
답변 에 에 대한 코드를 포함 하십시오 ( meta.stackexchange.com/questions/8231/… 참조 ).
질문은 잘못되었으며 복잡하고 비효율적 인 답변으로 이어질 수 있습니다. 반복자를 얻으려면 물론 반복 가능한 것부터 시작해야합니다. 대부분의 경우 마지막 요소에 액세스하는보다 직접적인 방법을 제공합니다.
iterable에서 iterator를 생성하면 iterable이 제공하는 유일한 기능이기 때문에 요소를 통과하는 데 갇혀 있습니다.
따라서 가장 효율적이고 명확한 방법은 처음에 반복자를 만드는 것이 아니라 iterable의 기본 액세스 방법을 사용하는 것입니다.