Модуль 3 · Списки и циклы

Справочник по Python · модуль 3 · списки и циклы

Глава 3.14

3.14

Функции для работы
с коллекциями

enumerate() добавляет номера, zip() объединяет последовательности, reversed() меняет направление перебора, а any() и all() сворачивают множество проверок в один ответ.

Категория
Встроенные функции
Уровень
Средний
Связанные темы
for, распаковка, логические значения
Зачем это знать
Писать короткий и выразительный перебор

§1enumerate(): индекс и значение

enumerate(iterable) выдаёт пары «номер — значение». Это удобнее range(len(items)), когда список не изменяется по позиции.

main.pyиндекс и элемент вместе
numbers = [10, 20, 30]
for index, value in enumerate(numbers):
    print(index, value)
Выводнумерация с нуля
0 10
1 20
2 30

§2Начальный номер

Параметр start меняет первый выдаваемый номер, но не меняет позиции элементов в самой коллекции.

main.pyнумерация для пользователя
words = ["apple", "banana", "cherry"]
for number, word in enumerate(words, start=1):
    print(number, word)
Выводномера с единицы
1 apple
2 banana
3 cherry

§3Что возвращает enumerate()

Функция возвращает специальный объект для перебора. Чтобы увидеть все пары сразу, его можно преобразовать в список.

main.pyсписок пар
numbers = [10, 20, 30]
print(list(enumerate(numbers)))
Выводкортежи внутри списка
[(0, 10), (1, 20), (2, 30)]

enumerate() работает не только со списками, но и со строками, кортежами и другими итерируемыми объектами.

§4zip(): параллельный перебор

zip() берёт по одному элементу из нескольких последовательностей и объединяет их в кортежи.

main.pyимя рядом с баллом
names = ["Alice", "Bob", "Charlie"]
scores = [90, 85, 95]
for name, score in zip(names, scores):
    print(name, score)
Выводтри пары
Alice 90
Bob 85
Charlie 95

Тот же результат можно преобразовать в словарь: dict(zip(names, scores)).

§5Самая короткая последовательность

Обычный zip() заканчивается вместе с самой короткой последовательностью. Лишние элементы остальных последовательностей не попадут в результат.

main.pyтретий элемент потерян
numbers = [1, 2, 3]
letters = ["a", "b"]
print(list(zip(numbers, letters)))
Выводдве пары
[(1, 'a'), (2, 'b')]

§6Распаковка через *

Если уже есть пары, запись zip(*pairs) группирует отдельно первые и вторые элементы.

main.pyразделение столбцов
pairs = [(1, "a"), (2, "b"), (3, "c")]
numbers, letters = zip(*pairs)
print(numbers)
print(letters)
Выводдва кортежа
(1, 2, 3)
('a', 'b', 'c')

§7reversed(): обратный перебор

reversed(sequence) выдаёт элементы в обратном порядке, не меняя исходный список.

main.pyобратный проход
numbers = [1, 2, 3, 4]
for number in reversed(numbers):
    print(number)
print(numbers)
ЗаписьМеняет списокВозвращает
reversed(items)нетобъект для обратного перебора
items.reverse()даNone

§8any() и all()

any() возвращает True, если истинен хотя бы один элемент. all() требует истинности всех элементов.

main.pyдве групповые проверки
numbers = [1, 2, 3]
print(any(number > 2 for number in numbers))
print(all(number > 0 for number in numbers))
Выводесть больше 2; все положительные
True
True

Без условия функции оценивают истинность самих элементов: ноль, False, None и пустые коллекции считаются ложными.

§9Пустые коллекции

main.pyграничный случай
print(any([]))
print(all([]))
Выводнет успеха и нет нарушения
False
True

any([]) ложно, потому что нет ни одного истинного элемента. all([]) истинно, потому что нет ни одного элемента, нарушающего требование.

§10Частые ошибки

Что написаноЧто произойдётКак правильно
for value in enumerate(items)value получит целую паруfor index, value in enumerate(items)
ожидать сохранения всех элементов от zip()результат закончится по самой короткой коллекциизаранее проверить длины или выбрать другой инструмент
дважды преобразовать один объект zip в списокво второй раз получится пустой списоксоздать zip() заново или сохранить первый список
items = reversed(items) и ожидание спискаполучится специальный объект перебораitems = list(reversed(items))
считать all([]) ложнымлогика проверки будет невернойпомнить, что all([]) равно True

§11Проверьте себя

Что меняет start=1 в enumerate()?

Только выдаваемые номера; сами индексы коллекции остаются прежними.

Когда остановится zip()?

Когда закончатся элементы самой короткой переданной последовательности.

Чем отличаются any() и all()?

any() достаточно одного истинного элемента, а all() требует истинности каждого.

§12Шпаргалка

Номер и значениеenumerate(items, start=1)
Параллельноzip(left, right)
Обратноreversed(items)
Проверкиany(values)all(values)

Итог главы

enumerate() нумерует элементы, zip() объединяет последовательности по позициям, reversed() даёт обратный перебор, any() ищет хотя бы одно истинное значение, а all() проверяет все значения.

Глава 3.14 · Функции для коллекций · Справочник по PythonАвтор: Макаров Максим Николаевич