programing

Python 반복기에서 마지막 항목을 가져오는 가장 깨끗한 방법

lovejava 2023. 7. 18. 21:22

Python 반복기에서 마지막 항목을 가져오는 가장 깨끗한 방법

파이썬 2.6의 반복기에서 마지막 항목을 가져오는 가장 좋은 방법은 무엇입니까?예를 들어,

my_iter = iter(range(5))

가장 짧은 코드/가장 깨끗한 방법은 무엇입니까?4부터my_iter?

이렇게 할 수는 있지만 효율적이지는 않은 것 같습니다.

[x for x in my_iter][-1]

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. (출처)

from collections import deque

#aa is an interator
aa = iter('apple')

dd = deque(aa, maxlen=1)
last_element = dd.pop()
item = defaultvalue
for item in my_iter:
    pass

사이즈 1의 a를 사용합니다.

from collections import deque

# aa is an iterator
aa = iter('apple')

dd = deque(aa, maxlen=1)
last_element = dd.pop()

짧은 버전:

last_element, = deque(aa, 1)

사용할 가치가 있음__reversed__만약 가능하다면

if hasattr(my_iter,'__reversed__'):
    last = next(reversed(my_iter))
else:
    for last in my_iter:
        pass

다음과 같이 간단합니다.

max(enumerate(the_iter))[1]

람다로 인해 빈 루프보다 빠를 것 같지는 않지만 다른 사람에게 아이디어를 제공할 수 있습니다.

reduce(lambda x,y:y,my_iter)

반복기가 비어 있으면 유형 오류가 발생합니다.

이것이 있습니다.

list( the_iter )[-1]

만약 반복의 길이가 정말로 장대한 것이라면, 목록을 구체화하는 것이 기억을 고갈시킬 정도로 길다면, 디자인을 다시 생각해 볼 필요가 있습니다.

나는 사용할 것입니다.reversed오히려 임의적으로 보이는 반복기 대신 시퀀스만 사용한다는 점을 제외하고는 말입니다.

어떤 식으로든 반복기 전체를 살펴봐야 합니다.효율성이 극대화되면 다시는 반복기가 필요하지 않은 경우 다음 값을 모두 폐기할 수 있습니다.

for last in my_iter:
    pass
# last is now the last item

하지만 저는 이것이 차선의 해결책이라고 생각합니다.

toolz 라이브러리는 다음과 같은 훌륭한 솔루션을 제공합니다.

from toolz.itertoolz import last
last(values)

그러나 비핵심 종속성을 추가하는 것은 이 경우에만 사용할 가치가 없습니다.

유사한 내용은 이 코드를 참조하십시오.

http://excamera.com/sphinx/article-islast.html

마지막 항목을 선택하는 데 사용할 수 있습니다.

[(last, e) for (last, e) in islast(the_iter) if last]

문제는 반복기의 마지막 요소를 얻는 것이지만, 만약 반복기가 시퀀스에 조건을 적용하여 만들어진다면, 순서 자체에 역으로 적용하여 필요한 요소만 보면서 역순서의 "첫 번째"를 찾는 데 사용될 수 있습니다.

인위적인 예를 들자면,

>>> seq = list(range(10))
>>> last_even = next(_ for _ in reversed(seq) if _ % 2 == 0)
>>> last_even
8

훌륭한 라이브러리와 다음 기능을 사용할 수 있습니다.

more_itertools.last(iterable[, default])[소스]

편집 가능한 마지막 항목을 반환하거나, 편집 가능한 항목이 비어 있으면 기본값을 반환합니다.

>>> last([0, 1, 2, 3])
3
>>> last([], 'some default')
'some default'

기본값이 제공되지 않고 반복 가능한 항목에 항목이 없으면 상승ValueError.

이는 다음을 결합합니다.deque일부 답변에 의해 제안된 접근 방식 및 일부 추가 개선 사항(자세한 내용은 출처 참조).

저는그로 하겠습니다.next(reversed(myiter))

그 질문은 잘못되었고 복잡하고 비효율적인 대답만 이끌어 낼 수 있습니다.반복기를 얻기 위해서는 물론 반복할 수 있는 것부터 시작해야 합니다. 대부분의 경우 마지막 요소에 더 직접적으로 액세스할 수 있는 방법을 제공합니다.

반복기를 반복기에서 만들면 반복기가 제공하는 유일한 것이기 때문에 요소를 통과하는 데 갇히게 됩니다.

따라서 가장 효율적이고 명확한 방법은 애초에 반복기를 만드는 것이 아니라 반복 가능한 기본 액세스 방법을 사용하는 것입니다.

언급URL : https://stackoverflow.com/questions/2138873/cleanest-way-to-get-last-item-from-python-iterator