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
'programing' 카테고리의 다른 글
무한 반복기에 대한 표현이 있습니까? (0) | 2023.07.18 |
---|---|
C++에서 어레이 또는 std:: 벡터를 사용하면 성능 차이가 어떻게 됩니까? (0) | 2023.07.18 |
XPath를 BeautifulSoup과 함께 사용할 수 있습니까? (0) | 2023.07.18 |
변수가 없음 또는 numpy.array인지 확인할 때 ValueError가 발생했습니다. (0) | 2023.07.18 |
루비로 표시된 개체 유형 결정 (0) | 2023.07.13 |