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