Есть ли в python какой-либо встроенный или стандартный механизм просмотра вперед для итераторов?

В принципе, достаточно легко написать оболочку для итераторов, которая позволяет выполнять произвольное опережение, и некоторые вопросы были посвящены этому (например, Использование упреждающего просмотра с генераторами).

Однако, учитывая, что почти каждый нетривиальный анализ файлов будет полезен от такой возможности, это кажется слишком очевидным упущением для стандартной библиотеки; Неужели нет механизма встроенной или стандартной библиотеки, который позволял бы подглядывать?

В частности, мне обычно нужен просмотр, который работает между вызовами функций: подфункция должна иметь возможность проверять произвольное количество предстоящих элементов, не удаляя их из итератора — по сути, это тип данных очереди, где элементы лениво берутся из итератора.

В некоторых случаях collections.deque или itertools.tee можно использовать для создания обходных путей. Однако для удобочитаемости кода они неблагоприятны.


person kdb    schedule 05.03.2019    source источник
comment
Как насчет нет...   -  person Tobias S    schedule 05.03.2019


Ответы (1)


No.


Я часто использую pairwise Recipe для просмотра вперед. .

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

for item, peek in pairwise(iterable):
    ...

Или просто превратите свою итерацию в последовательность (если это еще не сделано) и используйте индексированный поиск.

for index, item in enumerate(sequence):
    try:
        peek = sequence[index+1]
    except IndexError:
        peek = None
person Sebastian Loehner    schedule 05.03.2019