Модуль Python Itertools

Модуль itertools представляет собой набор инструментов, предназначенных для быстрой и эффективной по использованию памяти работы с итераторами (такими как списки или словари).

Из документации Python 3

Модуль стандартизирует основной набор быстрых, эффективных по памяти инструментов, которые полезны сами по себе или в комбинации. Вместе они образуют «алгебру итераторов», позволяющую лаконично и эффективно конструировать специализированные инструменты на чистом Python.

Модуль itertools входит в стандартную библиотеку и должен быть импортирован. В некоторых примерах также используется модуль operator.

import itertools
import operator

accumulate()

Создает итератор, который возвращает результаты функции.

itertools.accumulate(iterable[, func])

Пример:

data = [1, 2, 3, 4, 5]
# Накопление с функцией умножения
result = itertools.accumulate(data, operator.mul)
for each in result:
    print(each)
1
2
6
24
120

operator.mul принимает два числа и перемножает их:

operator.mul(1, 2)
# 2

operator.mul(2, 3)
# 6

operator.mul(6, 4)
# 24

operator.mul(24, 5)
# 120

Передача функции необязательна:

data = [5, 2, 6, 4, 5, 9, 1]
# Накопление без функции по умолчанию использует сложение
result = itertools.accumulate(data)
for each in result:
    print(each)
5
7
13
17
22
31
32

Если функция не указана, элементы суммируются:

5
5 + 2 = 7
7 + 6 = 13
13 + 4 = 17
17 + 5 = 22
22 + 9 = 31
31 + 1 = 32

combinations()

Принимает итерируемый объект и целое число. Создает все уникальные комбинации, состоящие из r элементов.

itertools.combinations(iterable, r)

Пример:

shapes = ['circle', 'triangle', 'square',]
# Генерация всех комбинаций из 2 элементов
result = itertools.combinations(shapes, 2)
for each in result:
    print(each)
('circle', 'triangle')
('circle', 'square')
('triangle', 'square')

combinations_with_replacement()

Похоже на combinations(), но позволяет отдельным элементам повторяться более одного раза.

itertools.combinations_with_replacement(iterable, r)

Пример:

shapes = ['circle', 'triangle', 'square']
# Генерация комбинаций с разрешением повторений элементов
result = itertools.combinations_with_replacement(shapes, 2)
for each in result:
    print(each)
('circle', 'circle')
('circle', 'triangle')
('circle', 'square')
('triangle', 'triangle')
('triangle', 'square')
('square', 'square')

count()

Создает итератор, который возвращает равномерно расположенные значения, начиная с числа start.

itertools.count(start=0, step=1)

Пример:

# Счет, начиная с 10, с шагом 3
for i in itertools.count(10,3):
    print(i)
    if i > 20:
        break
10
13
16
19
22

cycle()

Эта функция бесконечно циклически проходит по итерируемому объекту.

itertools.cycle(iterable)

Пример:

colors = ['red', 'orange', 'yellow', 'green', 'blue', 'violet']
# Бесконечный цикл по цветам
for color in itertools.cycle(colors):
    print(color)
red
orange
yellow
green
blue
violet
red
orange

При достижении конца итерируемого объекта он начинается снова с самого начала.

chain()

Принимает серию итерируемых объектов и возвращает их как один длинный итерируемый объект.

itertools.chain(*iterables)

Пример:

colors = ['red', 'orange', 'yellow', 'green', 'blue']
shapes = ['circle', 'triangle', 'square', 'pentagon']
# Объединение нескольких итерируемых объектов в один
result = itertools.chain(colors, shapes)
for each in result:
    print(each)
red
orange
yellow
green
blue
circle
triangle
square
pentagon

compress()

Фильтрует один итерируемый объект с помощью другого.

itertools.compress(data, selectors)

Пример:

shapes = ['circle', 'triangle', 'square', 'pentagon']
selections = [True, False, True, False]
# Фильтрация фигур на основе булевых выборок
result = itertools.compress(shapes, selections)
for each in result:
    print(each)
circle
square

dropwhile()

Создает итератор, который отбрасывает элементы из итерируемого объекта, пока предикат истинен; после этого возвращает каждый оставшийся элемент.

itertools.dropwhile(predicate, iterable)

Пример:

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1]
# Отбросить элементы, пока условие истинно, затем вернуть все оставшиеся
result = itertools.dropwhile(lambda x: x<5, data)
for each in result:
    print(each)
5
6
7
8
9
10
1

filterfalse()

Создает итератор, который отфильтровывает элементы из итерируемого объекта, возвращая только те, для которых предикат ложен.

itertools.filterfalse(predicate, iterable)

Пример:

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1]
# Вернуть элементы, для которых предикат ложен
result = itertools.filterfalse(lambda x: x<5, data)
for each in result:
    print(each)
5
6
7
8
9
10

groupby()

Проще говоря, эта функция группирует элементы.

itertools.groupby(iterable, key=None)

Пример:

robots = [
    {"name": "blaster", "faction": "autobot"},
    {"name": "galvatron", "faction": "decepticon"},
    {"name": "jazz", "faction": "autobot"},
    {"name": "metroplex", "faction": "autobot"},
    {"name": "megatron", "faction": "decepticon"},
    {"name": "starcream", "faction": "decepticon"},
]
# Группировка роботов по фракции (итерируемый объект должен быть отсортирован для правильной группировки)
for key, group in itertools.groupby(robots, key=lambda x: x['faction']):
    print(key)
    print(list(group))
autobot
[{'name': 'blaster', 'faction': 'autobot'}]
decepticon
[{'name': 'galvatron', 'faction': 'decepticon'}]
autobot
[{'name': 'jazz', 'faction': 'autobot'}, {'name': 'metroplex', 'faction': 'autobot'}]
decepticon
[{'name': 'megatron', 'faction': 'decepticon'}, {'name': 'starcream', 'faction': 'decepticon'}]

islice()

Эта функция очень похожа на срезы. Она позволяет вырезать часть итерируемого объекта.

itertools.islice(iterable, start, stop[, step])

Пример:

colors = ['red', 'orange', 'yellow', 'green', 'blue',]
# Срез итерируемого объекта для получения первых 2 элементов
few_colors = itertools.islice(colors, 2)
for each in few_colors:
    print(each)
red
orange

permutations()

itertools.permutations(iterable, r=None)

Пример:

alpha_data = ['a', 'b', 'c']
# Генерация всех перестановок элементов
result = itertools.permutations(alpha_data)
for each in result:
    print(each)
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

product()

Создает декартовы произведения из серии итерируемых объектов.

num_data = [1, 2, 3]
alpha_data = ['a', 'b', 'c']
# Генерация декартова произведения итерируемых объектов
result = itertools.product(num_data, alpha_data)
for each in result:
    print(each)
(1, 'a')
(1, 'b')
(1, 'c')
(2, 'a')
(2, 'b')
(2, 'c')
(3, 'a')
(3, 'b')
(3, 'c')

repeat()

Эта функция будет повторять объект снова и снова. Если не указан аргумент times.

itertools.repeat(object[, times])

Пример:

# Повторить объект 3 раза
for i in itertools.repeat("spam", 3):
    print(i)
spam
spam
spam

starmap()

Создает итератор, который вычисляет функцию, используя аргументы, полученные из итерируемого объекта.

itertools.starmap(function, iterable)

Пример:

data = [(2, 6), (8, 4), (7, 3)]
# Применить функцию к распакованным аргументам из каждой кортежной пары
result = itertools.starmap(operator.mul, data)
for each in result:
    print(each)
12
32
21

takewhile()

Противоположность dropwhile(). Создает итератор и возвращает элементы из итерируемого объекта, пока предикат истинен.

itertools.takewhile(predicate, iterable)

Пример:

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1]
# Брать элементы, пока условие истинно, затем остановиться
result = itertools.takewhile(lambda x: x<5, data)
for each in result:
    print(each)
1
2
3
4

tee()

Возвращает n независимых итераторов из одного итерируемого объекта.

itertools.tee(iterable, n=2)

Пример:

colors = ['red', 'orange', 'yellow', 'green', 'blue']
# Разделить итерируемый объект на два независимых итератора
alpha_colors, beta_colors = itertools.tee(colors)
for each in alpha_colors:
    print(each)
red
orange
yellow
green
blue
colors = ['red', 'orange', 'yellow', 'green', 'blue']
alpha_colors, beta_colors = itertools.tee(colors)
for each in beta_colors:
    print(each)
red
orange
yellow
green
blue

zip_longest()

Создает итератор, который агрегирует элементы из каждого из итерируемых объектов. Если итерируемые объекты имеют разную длину, отсутствующие значения заполняются значением fillvalue. Итерация продолжается до тех пор, пока не будет исчерпан самый длинный итерируемый объект.

itertools.zip_longest(*iterables, fillvalue=None)

Пример:

colors = ['red', 'orange', 'yellow', 'green', 'blue',]
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,]
# Объединить итерируемые объекты, заполняя отсутствующие значения None
for each in itertools.zip_longest(colors, data, fillvalue=None):
    print(each)
('red', 1)
('orange', 2)
('yellow', 3)
('green', 4)
('blue', 5)
(None, 6)
(None, 7)
(None, 8)
(None, 9)
(None, 10)

Соответствующие ссылки

Morty Proxy This is a proxified and sanitized view of the page, visit original site.