Перейти к основному содержимому
Модуль 6 · Урок 4 из 424/36 в курсе~12 min
Уроки модуля (4/4)

Основные инструменты itertools

Python предоставляет множество инструментов итерации: некоторые из них встроены (всегда доступны), остальные живут в модуле itertools стандартного библиотека. Вот самые важные из них.

enumerate: индекс + значение

Когда вам нужны и индекс, и элемент во время цикла:

Python
for i, parola in enumerate(["a", "b", "c"]):
    print(i, parola)
# 0 a
# 1 b
# 2 c

# parte da un altro numero:
for i, parola in enumerate(["a", "b", "c"], start=1):
    print(i, parola)

zip: параллельная итерация

Объединяет несколько итераций поэлементно:

Python
nomi = ["Ada", "Linus", "Grace"]
eta = [36, 54, 85]

for n, e in zip(nomi, eta):
    print(f"{n} ha {e} anni")

zip останавливается на самой короткой итерации. Для «длинного» использования молнии itertools.zip_longest.

Построение dict из двух параллельных списков:

Python
dict(zip(nomi, eta))
# {'Ada': 36, 'Linus': 54, 'Grace': 85}

itertools.chain: объединить итерации

Python
from itertools import chain
list(chain([1, 2], [3, 4], [5]))
# [1, 2, 3, 4, 5]

Без создания промежуточного списка: полезно для файлов, генераторов и т. д.

itertools.count и repeat: бесконечные итераторы

Python
from itertools import count, repeat

# count(start, step) — interi crescenti infiniti
for i in count(10, 2):
    if i > 20: break
    print(i)
# 10, 12, 14, 16, 18, 20

# repeat(x, n) — ripete lo stesso valore n volte (o all'infinito senza n)
list(repeat("ok", 3))   # ['ok', 'ok', 'ok']

itertools.combinations

Все комбинации (без повторений, не зависящие от порядка) заданных длина:

Python
from itertools import combinations
list(combinations([1, 2, 3, 4], 2))
# [(1,2), (1,3), (1,4), (2,3), (2,4), (3,4)]

Заказанный вариант: permutations. Варианты с повторением: combinations_with_replacement и product.

zip() для словарей и несбалансированных итераций

Функция zip() останавливается, как только исчерпана самая короткая входная итерация. Если вы хотите объединить элементы и сохранить лишние значения (заполнив их значением по умолчанию, например None), вы можете использовать zip_longest() из модуля itertools. Кроме того, вы можете передать результат zip непосредственно в dict(), чтобы мгновенно построить карту значений ключа.

Попробуйте это

Упражнение#python.m6.l4.e1
Попыток: 0Загрузка…

Учитывая параллельные списки `countries = ['Italia', 'Francia', 'Spagna']` и `capitals = ['Roma', 'Parigi', 'Madrid']`, постройте `mapping` как dict {country: Capital}. Оцените «отображение».

Загрузка редактора…
Показать подсказку

dict(zip(страны, столицы))

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#python.m6.l4.e2
Попыток: 0Загрузка…

Учитывая `words = ['ciao', 'mondo', 'python']`, постройте `enumerated_items` как список кортежей (i, word), начиная с i=1. Оцените `enumerated_items`.

Загрузка редактора…
Показать подсказку

enumerate(words, start=1) → (i, value) кортежи.

Решение доступно после 3 попыток

Дополнительная задача

Упражнение#python.m6.l4.e3
Попыток: 0Загрузка…

Given two lists `keys = ['a', 'b', 'c']` and `values = [10, 20, 30]`, use `zip` to pair them and convert the result into a dictionary. Store the resulting dictionary in `my_dict` and evaluate it.

Загрузка редактора…
Показать подсказку

Используйте dict(zip(keys,values)) и назначьте его my_dict.

Решение доступно после 3 попыток