import itertools itertools.dropwhile(predicate, iterable)
predicate
- функция возвращающая bool
значение,iterable
- итерируемая последовательность.Функция dropwhile()
модуля itertools
создает итератор, который удаляет элементы из последовательности iterable
до тех пор, пока функция predicate
равна True
или 1. Возвращается итератор с отобранными элементами.
Аргумент predicate
это функция, принимающая один элемент последовательности и возвращающая bool
значение.
Обратите внимание, что функция itertools.dropwhile()
не выдает никаких выходных данных до тех пор, пока предикат predicate
не станет ложным, поэтому он может иметь длительное время запуска.
Функция itertools.dropwhile()
примерно эквивалентна следующему коду:
def dropwhile(predicate, iterable): # dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1 iterable = iter(iterable) for x in iterable: if not predicate(x): yield x break for x in iterable: yield x
Смотрите обратную функцию itertools.takewhile()
.
>>> from itertools import dropwhile >>> x = list(range(6)) >>> y = sorted(x, reverse = True) >>> z = x + y >>> z # [0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0] # например не нужны данные списка до определенного значения. >>> rez = dropwhile(lambda x: x<5, z) >>> list(rez) # [5, 5, 4, 3, 2, 1, 0] >>> rez = dropwhile(lambda x: x<3, z) >>> list(rez) # [3, 4, 5, 5, 4, 3, 2, 1, 0]
Более практичный пример. Иногда приходится работать с файлами, которые начинаются с неизвестного нам количества бесполезных строк, например, с комментариев. Простое решение отбросить комментарии:
string_from_file = """ // Автор: ... // Лицензия: ... // // Дата: ... Содержание... """ import itertools for line in itertools.dropwhile(lambda line: line.strip().startswith('//'), string_from_file.splitlines()): print(line)
Этот фрагмент кода создаёт строки, пропуская начальные комментарии. Такой подход может быть полезен, если нужно отбросить элементы (в нашем случае строки) в начале итерируемого объекта.