Справочник по Python · модуль 3 · списки и циклы
Глава 3.14
Функции для работы
с коллекциями
enumerate() добавляет номера, zip() объединяет последовательности, reversed() меняет направление перебора, а any() и all() сворачивают множество проверок в один ответ.
- Категория
- Встроенные функции
- Уровень
- Средний
- Связанные темы
- for, распаковка, логические значения
- Зачем это знать
- Писать короткий и выразительный перебор
§1enumerate(): индекс и значение
enumerate(iterable) выдаёт пары «номер — значение». Это удобнее range(len(items)), когда список не изменяется по позиции.
numbers = [10, 20, 30] for index, value in enumerate(numbers): print(index, value)
0 10 1 20 2 30
§2Начальный номер
Параметр start меняет первый выдаваемый номер, но не меняет позиции элементов в самой коллекции.
words = ["apple", "banana", "cherry"] for number, word in enumerate(words, start=1): print(number, word)
1 apple 2 banana 3 cherry
§3Что возвращает enumerate()
Функция возвращает специальный объект для перебора. Чтобы увидеть все пары сразу, его можно преобразовать в список.
numbers = [10, 20, 30] print(list(enumerate(numbers)))
[(0, 10), (1, 20), (2, 30)]
enumerate() работает не только со списками, но и со строками, кортежами и другими итерируемыми объектами.
§4zip(): параллельный перебор
zip() берёт по одному элементу из нескольких последовательностей и объединяет их в кортежи.
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() заканчивается вместе с самой короткой последовательностью. Лишние элементы остальных последовательностей не попадут в результат.
numbers = [1, 2, 3] letters = ["a", "b"] print(list(zip(numbers, letters)))
[(1, 'a'), (2, 'b')]
§6Распаковка через *
Если уже есть пары, запись zip(*pairs) группирует отдельно первые и вторые элементы.
pairs = [(1, "a"), (2, "b"), (3, "c")] numbers, letters = zip(*pairs) print(numbers) print(letters)
(1, 2, 3)
('a', 'b', 'c')§7reversed(): обратный перебор
reversed(sequence) выдаёт элементы в обратном порядке, не меняя исходный список.
numbers = [1, 2, 3, 4] for number in reversed(numbers): print(number) print(numbers)
| Запись | Меняет список | Возвращает |
|---|---|---|
reversed(items) | нет | объект для обратного перебора |
items.reverse() | да | None |
§8any() и all()
any() возвращает True, если истинен хотя бы один элемент. all() требует истинности всех элементов.
numbers = [1, 2, 3] print(any(number > 2 for number in numbers)) print(all(number > 0 for number in numbers))
True True
Без условия функции оценивают истинность самих элементов: ноль, False, None и пустые коллекции считаются ложными.
§9Пустые коллекции
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() проверяет все значения.