Сейчас делаю вот что:
try:
something = iterator.next()
# ...
except StopIteration:
# ...
Но мне нужно выражение, которое я могу поместить в простое if
утверждение. Есть ли что-нибудь встроенное, что сделало бы этот код менее неуклюжим?
any()
возвращается, False
если итерация пуста, но потенциально может перебирать все элементы, если это не так. Мне это нужно только для проверки первого пункта.
Кто-то спрашивает, что я пытаюсь сделать. Я написал функцию, которая выполняет SQL-запрос и возвращает его результаты. Иногда, когда я вызываю эту функцию, я просто хочу узнать, вернул ли запрос что-нибудь, и принять решение на основе этого.
Ответы:
any
не выйдет за пределы первого элемента, если он True. Если итератор выдает что-то ложное, вы можете написатьany(True for _ in iterator)
.источник
any((x > 100 for x in xrange(10000000)))
а затем бегитеany((x > 10000000 for x in xrange(100000000)))
- второй должен занять гораздо больше времени.sum(1 for _ in itertools.islice(iterator, max_len)) >= max_len
all(False for _ in iterator)
будет проверять, пуст ли итератор. (all возвращает True, если итератор пуст, в противном случае он останавливается, когда видит первый элемент False)В Python 2.6+, если имя
sentinel
привязано к значению, которое итератор не может выдать,Если вы не знаете, что может дать итератор, сделайте свой собственный дозорный (например, в верхней части модуля) с помощью
В противном случае вы можете использовать в роли дозорного любое значение, которое вам «известно» (исходя из соображений приложения), которое итератор не может выдать.
источник
if not next(iterator, None):
было достаточно, поскольку я был уверен, что None не будет частью элементов. Спасибо, что указали мне правильное направление!not
вернет True для любого ложного объекта, такого как пустые списки, False и ноль.is not None
безопаснее и на мой взгляд понятнее.Это не совсем чище, но показывает способ упаковать его в функцию без потерь:
На самом деле это не питонизм, и для конкретных случаев, вероятно, есть лучшие (но менее общие) решения, такие как следующее по умолчанию.
Это не является общим, потому что None может быть допустимым элементом во многих итерациях.
источник
next()
.tee
В itertools будет держать каждый элемент из исходного итератора в случае , еслиany_check
когда - либо потребность в заранее. Это хуже, чем просто преобразование исходного итератора в список.ты можешь использовать:
но это немного необъяснимо для читателя кода
источник
Лучший способ сделать это - использовать
peekable
frommore_itertools
.Просто будьте осторожны, если вы сохранили ссылки на старый итератор, этот итератор будет расширяться. С этого момента вы должны использовать новый просматриваемый итератор. На самом деле, peekable ожидает быть единственным фрагментом кода, изменяющим этот старый итератор, так что вам все равно не следует хранить ссылки на старый итератор.
источник
Что о:
источник
class NotSet: pass
, а затем проверьтеif next(i, NotSet) is NotSet: print("Iterator is empty")
__length_hint__
оценивает длинуlist(it)
- это частный метод, однако:источник
Это избыточная оболочка итератора, которая обычно позволяет проверять, есть ли следующий элемент (путем преобразования в логическое значение). Конечно довольно неэффективно.
Вывод:
источник
Немного поздно, но ... Вы можете превратить итератор в список, а затем работать с этим списком:
источник