Obecnie robię to:
try:
something = iterator.next()
# ...
except StopIteration:
# ...
Ale chciałbym wyrażenia, które mogę umieścić w prostym if
stwierdzeniu. Czy jest coś wbudowanego, co sprawiłoby, że ten kod wyglądałby mniej niezgrabnie?
any()
zwraca, False
jeśli element iterowalny jest pusty, ale potencjalnie będzie iterował po wszystkich elementach, jeśli tak nie jest. Potrzebuję go tylko do sprawdzenia pierwszej pozycji.
Ktoś pyta, co próbuję zrobić. Napisałem funkcję, która wykonuje zapytanie SQL i daje jej wyniki. Czasami, gdy wywołuję tę funkcję, chcę tylko wiedzieć, czy zapytanie zwróciło cokolwiek, i na tej podstawie podjąć decyzję.
Odpowiedzi:
any
nie wykroczy poza pierwszy element, jeśli to prawda. W przypadku, gdy iterator daje coś fałszywego, możesz napisaćany(True for _ in iterator)
.źródło
any((x > 100 for x in xrange(10000000)))
a potem biegnijany((x > 10000000 for x in xrange(100000000)))
- drugi powinien zająć znacznie dłużej.sum(1 for _ in itertools.islice(iterator, max_len)) >= max_len
all(False for _ in iterator)
sprawdzenia, czy iterator jest pusty. (all zwraca True, jeśli iterator jest pusty, w przeciwnym razie zatrzymuje się, gdy zobaczy pierwszy element False)W Pythonie 2.6+, jeśli nazwa
sentinel
jest powiązana z wartością, której iterator nie może uzyskać,Jeśli nie masz pojęcia, co może dać iterator, stwórz swój własny wartownik (np. Na górze modułu) z
W przeciwnym razie możesz użyć w roli wartownika dowolnej wartości, którą „znasz” (na podstawie rozważań aplikacji), a której iterator nie może uzyskać.
źródło
if not next(iterator, None):
było wystarczające, ponieważ byłem pewien, że Żaden nie będzie częścią elementów. Dzięki za wskazanie mi właściwego kierunku!not
zwróci True dla każdego fałszywego obiektu, takiego jak puste listy, False i zero.is not None
jest bezpieczniejszy i moim zdaniem jaśniejszy.Nie jest to naprawdę czystsze, ale pokazuje sposób na bezstratne spakowanie go w funkcję:
To nie jest do końca Pythonowe, aw niektórych przypadkach prawdopodobnie istnieją lepsze (ale mniej ogólne) rozwiązania, takie jak następne domyślne.
Nie jest to ogólne, ponieważ None może być prawidłowym elementem w wielu iterowalnych.
źródło
next()
.tee
itertools będą musiały zachować każdy pojedynczy element z oryginalnego iteratora na wypadek, gdybyany_check
kiedykolwiek trzeba było przejść dalej. Jest to gorsze niż zwykłe przekonwertowanie oryginalnego iteratora na listę.możesz użyć:
ale jest to trochę niewyjaśnione dla czytnika kodów
źródło
Najlepszym sposobem na to jest użycie
peekable
odmore_itertools
.Po prostu uważaj, jeśli zachowałeś odniesienia do starego iteratora, że iterator będzie zaawansowany. Od tego momentu musisz używać nowego iteratora podglądu. Naprawdę jednak, peekable spodziewa się, że będzie jedynym fragmentem kodu modyfikującym ten stary iterator, więc i tak nie powinieneś przechowywać referencji do starego iteratora.
źródło
Co powiesz na:
źródło
class NotSet: pass
, a następnie sprawdźif next(i, NotSet) is NotSet: print("Iterator is empty")
__length_hint__
szacuje długośćlist(it)
- to jednak metoda prywatna:źródło
Jest to overkill iterator wrapper, który generalnie pozwala sprawdzić, czy istnieje następny element (poprzez konwersję na boolean). Oczywiście dość nieefektywne.
Wynik:
źródło
Trochę późno, ale ... Możesz zmienić iterator w listę, a następnie pracować z tą listą:
źródło