[python] 반복자가 적어도 하나의 요소를 생성하는지 확인하는 한 줄?

현재 나는 이것을하고있다 :

try:
    something = iterator.next()
    # ...
except StopIteration:
    # ...

하지만 간단한 if문장 안에 넣을 수있는 표현을 원합니다 . 이 코드를 덜 어색하게 보이게하는 내장 기능이 있습니까?

any()Falseiterable이 비어 있으면 반환 하지만 그렇지 않은 경우 모든 항목을 잠재적으로 반복합니다. 첫 번째 항목 만 확인하면됩니다.


누군가 내가 뭘 하려는지 묻습니다. SQL 쿼리를 실행하고 그 결과를 산출하는 함수를 작성했습니다. 때때로이 함수를 호출 할 때 쿼리가 어떤 것을 반환했는지 알고이를 기반으로 결정을 내리고 싶습니다.



답변

anyTrue이면 첫 번째 요소를 넘어 가지 않습니다. 반복자가 잘못된 것을 산출하는 경우 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:
    # ...

하지만 코드 리더에게는 약간 설명이 필요하지 않습니다.


답변

이를 수행하는 가장 좋은 방법은 peekablefrom 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)).