Найти тему
programmer's notes (python and more)

Программирование на языке Python. Библиотека itertools. Не комбинаторные возможности

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes, любители языка Python. Не забывайте подписываться и писать свои
комментарии к моим статьям и видео.

Алгоритмы на Python | programmer's notes (python and more) | Дзен
Стандартные библиотеки Python | programmer's notes (python and more) | Дзен

itertools, некоторые методы и их использование в программах на языке Python

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

Сегодня поговорим о других возможностях этой библиотеки.

Бесконечные итераторы. Методы count(), repeat(), cycle()

Создаёт бесконечный итератор равномерно распределённых значений начиная с заданного и с заданным шагом.

Например

#!/usr/bin/python3
import itertools as it
c = it.count(10, 0.5)
print(*[next(c) for i in range(0, 10)], sep='\n')

Результат выполнения программы

10
10.5
11.0
11.5
12.0
12.5
13.0
13.5
14.0
14.5

Мы ограничили работу итератора искусственно.

Метод cycle() предназначен для бесконечного повторения некоторой серии

#!/usr/bin/python3
import itertools as it
c = it.cycle(['Здравствуйте', 'До свидания', 'Прощайте'])
print(*[next(c) for i in range(0, 10)], sep='\n')

Результат выполнения программы

Здравствуйте
До свидания
Прощайте
Здравствуйте
До свидания
Прощайте
Здравствуйте
До свидания
Прощайте
Здравствуйте

Метод repeat() повторяет (возвращать) указанный объект бесконечно долго, если не указать значение параметра times.

#!/usr/bin/python3
import itertools as it
c = it.repeat(['Здравствуйте', 'До свидания', 'Прощайте'], times=4)
print(*[t for t in c], sep='\n')

Результат выполнения программы

['Здравствуйте', 'До свидания', 'Прощайте']
['Здравствуйте', 'До свидания', 'Прощайте']
['Здравствуйте', 'До свидания', 'Прощайте']
['Здравствуйте', 'До свидания', 'Прощайте']

Конечные итераторы

Конечных итераторов в библиотеке itertools довольно много. Поэтому я их просто перечислю, и приведу несколько примеров.

  • accumulate() — возвращает накопленные суммы или накопленные значения функции;

#!/usr/bin/python3
import itertools as it
ls = [1, 3, 5, 7]
print(*it.accumulate(ls), sep='\n')

Результат выполнения программы

1
4
9
16

  • chain() — превращает несколько несколько итерируемых объектов в один;

#!/usr/bin/python3
import itertools as it
ls = [1, 3, 5]
tu = ('q', 'w')
print(list(it.chain(ls, tu)))

Результат выполнения программы

[1, 3, 5, 'q', 'w']

  • chain.from_iterable() — на входе получает один итерируемый объект и "склеивает" его элементы;

#!/usr/bin/python3
import itertools as it
ls = ['1', '3', '5', ('q', 'w'), 'qwerty']
print(list(it.chain.from_iterable(ls)))

Результат выполнения программы

['1', '3', '5', 'q', 'w', 'q', 'w', 'e', 'r', 't', 'y']

  • compress() — фильтрует набор данных на основе набора селекторов;

#!/usr/bin/python3
import itertools as it
sel = [True, False, True, True, True, False]
ls = [1, 2, 3, 4, 5, 6]
print(list(it.compress(ls, sel)))

Результат выполнения программы

[1, 3, 4, 5]

  • dropwhile() — фильтрует, выбрасывая элементы объекта, на основе указанного критерия (на основе функции или lambda-функции);

#!/usr/bin/python3
import itertools as it
print(list(it.dropwhile(lambda x:x<3, [1, 2, 3, 4, 5])))

Результат выполнения программы

[3, 4, 5]

  • takewhile() — возвращает элементы итерируемого объекта, пока условие равно True;

#!/usr/bin/python3
import itertools as it
print(*it.takewhile(lambda x:x<4, [1, 2, 3, 4, 5]))

Результат выполнения программы

1 2 3

  • filterfalse() — возвращает элементы для которых условие даёт False;

#!/usr/bin/python3
import itertools as it
print(*it.filterfalse(lambda x:x%2==0, [1, 2, 3, 4, 5]))

Результат выполнения программы

1 3 5

  • zip_longest() — агрегирует объекты входных итераторов, процесс заканчивается, когда заканчивается самый длинный объект, при агрегировании используется также указанный заполнитель, когда заканчивается один из итерируемых объектов;

#!/usr/bin/python3
import itertools as it
ls1 = [1, 2, 3]
ls2 = [100, 200]
ls3 = [1000]
print(*it.zip_longest(ls1, ls2, ls3, fillvalue=-1))

Результат выполнения программы

(1, 100, 1000) (2, 200, -1) (3, -1, -1)

  • starmap() — аналог map(), но более удобный;

#!/usr/bin/python3
import itertools as it
ls = [(1, 2), (3, 3)]
print(*it.starmap(lambda x, y:x*y, ls))

Результат выполнения программы

2 9

  • islice() — ограничивает вывод итератора, например, бесконечного;

#!/usr/bin/python3
import itertools as it
# start=10, stop=30, step=3
print(*it.islice(range(1, 100), 10, 30, 3))

Результат выполнения программы

11 14 17 20 23 26 29

  • tee() — создает несколько независимых итераторов на основе одного;

#!/usr/bin/python3
import itertools as it
pt = it.tee([1, 2, 3, 4, 5], 3)
[print(*t) for t in pt]

Результат выполнения программы

1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

  • groupby() — возвращает ключи и группы из последовательности;

#!/usr/bin/python3
import itertools as it
ls = [1, 2, 3, 4]
[print(k, *t) for k, t in it.groupby(ls, key=None)]
ls = [('Фамилия', 'Петров'), ('Фамилия', 'Иванов'), ('Фамилия', 'Сидоров')]
[print(k, *t) for k, t in it.groupby(ls, key=lambda x:x[1])]

Результат выполнения программы

1 1
2 2
3 3
4 4
Петров ('Фамилия', 'Петров')
Иванов ('Фамилия', 'Иванов')
Сидоров ('Фамилия', 'Сидоров')

Ну вот, с библиотекой itertools всё. Пользуйтесь, программируйте.

Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Не подскажете, как пройти в библиотеку
Не подскажете, как пройти в библиотеку