Объяснение к уроку
После этого урока ты сможешь:
zip() без ручной индексации.zip() останавливается на самых коротких входных данных и что это значит для пропущенных данных.enumerate() и zip() для нумерации парных записей.Иногда программа получает связанные данные в параллельных последовательностях: одна содержит имена, а другая — значения в том же порядке. Функция zip() объединяет их по позиции. Каждую пару можно распаковать прямо в цикле for.
for item, value in zip(items, values):
...Важно: обычный zip() останавливается, когда заканчивается самый короткий входной набор. Он не придумывает значения-заполнители для отсутствующих записей. Когда длины должны точно совпадать, проверяй их отдельно перед объединением; в противном случае лишние значения игнорируются.
Ты уже знаешь enumerate() для нумерации значений. Оберни им zip(), когда тебе нужны номер для отображения (начиная с 1) и оба значения. Распаковка кортежей в Python позволяет циклу аккуратно получить все три значения.
Для сопоставленных уникальных ключей вызов dict(zip(keys, values)) также создает словарь. Внимание: повторяющиеся ключи перезаписываются последним парным значением.
zones = ["west", "east"]
replicas = [2, 4]
for zone, count in zip(zones, replicas):
print(f"{zone}: {count} replicas")Вывод:
west: 2 replicas
east: 4 replicasКаждый шаг цикла дает одну сопоставленную пару.
teams = ["alpha", "beta", "gamma"]
regions = ["eu", "us"]
print(list(zip(teams, regions)))Вывод:
[('alpha', 'eu'), ('beta', 'us')]Элемент gamma не вошел в пару: третьего региона нет.
services = ["cache", "api"]
ports = [6379, 8080]
for number, (service, port) in enumerate(zip(services, ports), start=1):
print(f"{number}. {service} uses {port}")Вывод:
1. cache uses 6379
2. api uses 8080Скобки вокруг (service, port) распаковывают пару внутри пронумерованного элемента.
features = ["search", "export"]
limits = [20, 5]
lookup = dict(zip(features, limits))
print(lookup)Вывод:
{'search': 20, 'export': 5}В случае дублирования имен функций более поздний парный лимит заменит более ранний.
| Цель | Шаблон |
|---|---|
| Объединить сопоставленные значения | zip(first, second) |
| Перебор пар | for left, right in zip(...): |
| Пронумеровать парные значения | enumerate(zip(...), start=1) |
| Построить словарь | dict(zip(keys, values)) |
| Избежать незаметной потери данных | Проверяй длины перед использованием zip(), если это необходимо |
zip() — это не полное внешнее объединение: он останавливается на самых коротких входных данных.enumerate(zip(...)) возвращает номер и пару; правильно распаковывай оба уровня.