Python — расширенное использование итераторов

Python

Эта статья возникла из личного публичного аккаунта:TechFlow, оригинальность это не просто, прошу внимания


СегодняЧасть 8 тем Pythonстатья.

Сегодня мы по-прежнему вводим итераторы, но представляем несколько более часто используемых.Расширенное использование, что очень удобно в практических сценариях и может помочь нам значительно упростить сложный код.

пропустить начало

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

Например, у нас есть фрагмент данных, помеченный # в начале:

# This is a data for student
# Rows 100

xiaoming, 17, 99;
xiaoli, 18, 98;
...

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

with open('xxxx.txt') as f:
for line in f:
print(line)

Если он используется только для вывода, это нормально, если нам нужно обработать данные в файле, информация о комментариях в заголовке будет мешать работе нашего кода. Конечно, мы можем добавить какие-то суждения вручную, но это будет хлопотнее и код будет недостаточно красивым. Лучшим решением этой проблемы являетсяdropwhile.

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

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

from itertools import dropwhile
with open('xxxx.txt') as f:
for line in dropwhile(lambda line: line.startswith('#'), f):
print(line)

В результате в заголовке нет контента, который нам не нужен.

Когда мы знаем формат данных, заголовок которых не соответствует ситуации, мы можем использовать dropwhile для указания формата фильтра. если мыЗнайте, сколько баров нужно отфильтровать, вы можете использовать другой инструмент под названием islice, который по сути является функцией среза, точно так же, как функция среза массивов в Python, которая может вырезать данные указанного сегмента в итераторе.

Например:

from itertools import dropwhile
with open('xxxx.txt') as f:
for line in islice(f, 3, None):
print(line)

Таким образом, мы начнем с третьей строки, а предыдущие данные будут отфильтрованы. На самом деле он представляет операцию среза [3:] в массиве.

итеративная перестановка

Все мы знаем, что в C++ есть функция next_permutation, которая может передавать массив и возвращать следующую лексикографическую перестановку. Та же функциональность доступна в Python, но в виде итератора.

Для простого примера предположим, что у нас есть три элемента a, b, c, и мы хотим найти все их перестановки:

items = ['a', 'b', 'c']
from itertools import permutations

for p in permutations(items):
print(p)

Перестановки также поддерживают передачу еще одного параметра. Например, в приведенном выше расположении мы хотим сохранить только первые два элемента. В дополнение к нарезке нам нужно передать еще один параметр, например:

for p in permutations(items, 2):
print(p)

В дополнение к расположению, itertools также поддерживает комбинации, использование остается тем же, просто замените имя функции комбинациями:

from itertools import combindations
for c in combinations(items):
print(c)

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

for c in combinations_with_replacement(items, 3):
print(c)

Повторить объединенную последовательность

В предыдущей статье мы рассказали, что zip может перебирать несколько итераторов одновременно.Строка нескольких итераторов для итерации. Например, системные журналы находятся в нескольких файлах, и мы надеемся найти журналы с ошибками для анализа. В настоящее время мы надеемся не читать несколько итераторов одновременно, а иметь возможность конкатенировать содержимое нескольких итераторов. Эта функция находится в itertoolschainметод, который принимает несколько итераторов.При обходе он автоматически объединяет содержимое нескольких итераторов, и мы можем выполнять итерацию без проблем.

Например:

from itertools import chain
nums = [1, 2, 3]
chars = ['a', 'b', 'c']

for i in chain(nums, chars):
print(i)

Таким образом, мы будем выводить содержимое чисел и символов вместе,как если бы от начала до конца выполнялся только один итератор.

Вы можете сказать, что мы можем сделать это без цепи, мы можем сделать это:

for i in nums + chars:
print(i)

Действительно, судя по результатам, это тоже работает. Но если мы проанализируем промежуточные переменные во время внутреннего выполнения, то обнаружим, что при выполнении nums+chars на самом делеСначала создайте новый временный список. Затем сохраните данные чисел и символов в этом списке, что означает, что то, что мы повторяем, на самом деле является этим новым списком. Результатом этого является то, что мыдополнительная память, и это заняло некоторое время. Если мы используем цепочку, то в ней нет таких промежуточных переменных, она полностью итерируется через итераторы, что очень экономит память, что также является преимуществом цепочки.

Содержимое итерации слияния

Мы не должны быть незнакомы с операцией слияния, мы видели ее много раз в предыдущей сортировке слиянием и в некоторых статьях по решению проблем. Точно так же, когда мы используем инструменты для объединения содержимого нескольких итераторов, если содержимое итераторов упорядочено, мы также можемОбъединить элементы из нескольких итераторов, вместо того, чтобы требовать от нас делать это вручную.

Это очень легко сделать с помощью библиотеки heapq, которую мы представили ранее, давайте рассмотрим пример:

a = [1, 3, 5]
b = [2, 4, 6]

import heapq

for c in heapq.merge(a, b):
print(c)

После выполнения мы получим результат [1, 2, 3, 4, 5, 6]. Другими словами, с помощью операции heapq.merge мы объединяем несколько упорядоченных итераторов вместе. Конечно, мы также можем выполнить слияние самостоятельно, но если нам просто нужно использовать содержащиеся в нем данные, использование операции слияния может сэкономить место в памяти.

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

На сегодняшней статье все. Если вы чувствуете, что что-то приобрели, пожалуйста, нажмитеПодпишитесь или сделайте ретвитЧто ж, твое маленькое усилие много значит для меня.