Сообщить об ошибке.

Функция dropwhile() модуля itertools в Python

Последовательно удалять элементы списка пока условие истинно

Синтаксис:

import itertools

itertools.dropwhile(predicate, 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)

Этот фрагмент кода создаёт строки, пропуская начальные комментарии. Такой подход может быть полезен, если нужно отбросить элементы (в нашем случае строки) в начале итерируемого объекта.