현재 나는 이것을하고있다 :
try:
something = iterator.next()
# ...
except StopIteration:
# ...
하지만 간단한 if
문장 안에 넣을 수있는 표현을 원합니다 . 이 코드를 덜 어색하게 보이게하는 내장 기능이 있습니까?
any()
False
iterable이 비어 있으면 반환 하지만 그렇지 않은 경우 모든 항목을 잠재적으로 반복합니다. 첫 번째 항목 만 확인하면됩니다.
누군가 내가 뭘 하려는지 묻습니다. SQL 쿼리를 실행하고 그 결과를 산출하는 함수를 작성했습니다. 때때로이 함수를 호출 할 때 쿼리가 어떤 것을 반환했는지 알고이를 기반으로 결정을 내리고 싶습니다.
답변
any
True이면 첫 번째 요소를 넘어 가지 않습니다. 반복자가 잘못된 것을 산출하는 경우 any(True for _ in iterator)
.
답변
Python 2.6 이상에서 이름 sentinel
이 반복자가 산출 할 수없는 값에 바인딩 된 경우
if next(iterator, sentinel) is sentinel:
print('iterator was empty')
이터레이터가 무엇을 산출 할 수 있을지 모르는 경우 다음을 사용하여 자신의 센티넬 (예 : 모듈 상단)을 만드십시오.
sentinel = object()
그렇지 않으면 센티넬 역할에서 반복자가 산출 할 수없는 (응용 프로그램 고려 사항에 따라) “알고있는”값을 사용할 수 있습니다.
답변
이것은 정말로 깨끗하지는 않지만 무손실 함수로 패키징하는 방법을 보여줍니다.
def has_elements(iter):
from itertools import tee
iter, any_check = tee(iter)
try:
any_check.next()
return True, iter
except StopIteration:
return False, iter
has_el, iter = has_elements(iter)
if has_el:
# not empty
이것은 실제로 비단뱀 적이 지 않으며 특정 경우에는 아마도 다음 기본값 과 같은 더 나은 (그러나 덜 일반적인) 솔루션이있을 것입니다 .
first = next(iter, None)
if first:
# Do something
None은 많은 이터 러블에서 유효한 요소가 될 수 있기 때문에 일반적이지 않습니다.
답변
당신이 사용할 수있는:
if zip([None], iterator):
# ...
else:
# ...
하지만 코드 리더에게는 약간 설명이 필요하지 않습니다.
답변
이를 수행하는 가장 좋은 방법은 peekable
from more_itertools
.
from more_itertools import peekable
iterator = peekable(iterator)
if iterator:
# Iterator is non-empty.
else:
# Iterator is empty.
이전 이터레이터에 대한 참조를 유지했다면 이터레이터가 발전 할 것이라는 점에 유의하세요. 그때부터 새로운 peekable iterator를 사용해야합니다. 그러나 실제로 peekable은 이전 반복자를 수정하는 유일한 코드 일 것으로 예상하므로 어쨌든 이전 반복기에 대한 참조를 유지해서는 안됩니다.
답변
이건 어떤가요:
In [1]: i=iter([])
In [2]: bool(next(i,False))
Out[2]: False
In [3]: i=iter([1])
In [4]: bool(next(i,False))
Out[4]: True
답변
__length_hint__
길이를 추정 합니다 list(it)
. 그러나 개인 방법입니다.
x = iter( (1, 2, 3) )
help(x.__length_hint__)
1 Help on built-in function __length_hint__:
2
3 __length_hint__(...)
4 Private method returning an estimate of len(list(it)).