Необходимость перебрать последовательность — список, кортеж, строку или словарь — возникает довольно часто. Когда вы перебираете их в циклах, не возникает ли у вас впечатление, будто ваш код беспорядочен? Не хочется ли вам удалить из него некоторые переменные? К счастью, в Python есть несколько полезных встроенных функций, с помощью которых можно сделать свой код более лаконичным и читаемым.
В этом руководстве мы расскажем, какие встроенные функции для работы с последовательностями есть в Python. И, разумеется, разберем на простых примерах, как эти функции работают.
Как перебрать последовательность с помощью функции enumerate() в Python
Функция enumerate()
перебирает последовательность (список, кортеж, строку или словарь), одновременно отслеживая значения индексов элементов последовательности.
Давайте посмотрим на синтаксис:
enumerate(iterable, start)
Функция принимает два аргумента:
iterable
– итерируемый объект (т.е. объект, который можно перебрать в цикле).start
– значение индекса или начальное значение счетчика. По умолчанию данный аргумент равен нулю.
Результат работы такой функции будет следующим:
# Output # [(0, item_1), (1, item_1), (2, item_2), . . ., (n, item_n)]
Мы получили элементы итерируемого объекта вместе с их индексами.
Возьмем пример без указания значения start
:
colour = ["Black", "Purple", "Brown", "Yellow", "Blue"] list(enumerate(colour)) # Output: # [(0, 'Black'), (1, 'Purple'), (2, 'Brown'), (3, 'Yellow'), (4, 'Blue')]
Как видите, индексирование начинается с 0, хотя мы не указывали второй аргумент при вызове функции. Всё потому, что по умолчанию значение аргумента start
равно 0.
Возьмем еще один пример с указанием индекса:
colour = ["Black", "Purple", "Brown", "Yellow", "Blue"] list(enumerate(colour, 10)) # Output: # [(10, 'Black'), (11, 'Purple'), (12, 'Brown'), (13, 'Yellow'), (14, 'Blue')]
Итак, здесь наш индекс начинается с 10, поскольку мы устанавливаем аргумент start
равным 10. В результате функция начинает отсчет индексов с 10.
Обратите внимание, что нужно явно указывать, хотите вы получить результат в виде списка или в виде кортежа. В нашем коде мы указывали, что хотим получить список — list(enumerate(colour, 10))
. Если просто вызвать функцию enumerate(), результат будет следующим:
colour = ["Black", "Purple", "Brown", "Yellow", "Blue"] enumerate(colour) # Output: # <enumerate object at 0x7f6a97ad7c40>
Возьмем пример со словарем:
colour = {"Black": 0, "Purple": 2, "Brown": 4, "Yellow": 9, "Blue": 1} list(enumerate(colour)) # Output: # [(0, 'Black'), (1, 'Purple'), (2, 'Brown'), (3, 'Yellow'), (4, 'Blue')]
Перебирая словарь, мы получаем только ключи, а не значения словаря.
[python_ad_block]Функции для перебора элементов словаря в Python
Для перебора словаря и получения значений в Python есть две встроенные функции:
items()
– эта функция помогает нам получать пары ключ-значение из словаря.values()
– данная функция помогает нам получать только значения из словаря, без ключей.
Давайте рассмотрим примеры работы функции items()
:
colour = {"Black": 0, "Purple": 2, "Brown": 4, "Yellow": 9, "Blue": 1} list(enumerate(colour.items())) # Output: # [(0, ('Black', 0)), (1, ('Purple', 2)), (2, ('Brown', 4)), (3, ('Yellow', 9)), (4, ('Blue', 1))]
items()
также можно использовать с циклом for
:
colour = {"Black": 0, "Purple": 2, "Brown": 4, "Yellow": 9, "Blue": 1} for ind, (keys, value) in enumerate(colour.items()): print(ind, keys, value) # Output: # 0 Black 0 # 1 Purple 2 # 2 Brown 4 # 3 Yellow 9 # 4 Blue 1
В этом примере мы получаем пары ключ-значение.
Теперь давайте воспользуемся функцией values()
:
colour = {"Black": 0, "Purple": 2, "Brown": 4, "Yellow": 9, "Blue": 1} list(enumerate(colour.values())) # Output: # [(0, 0), (1, 2), (2, 4), (3, 9), (4, 1)]
С циклом for
наш код будет выглядеть так:
colour = {"Black": 0, "Purple": 2, "Brown": 4, "Yellow": 9, "Blue": 1} for ind, value in enumerate(colour.values()): print(ind, value) # Output: # 0 0 # 1 2 # 2 4 # 3 9 # 4 1
Здесь при итерации мы получаем только значения словаря, без ключей.
Как перебрать последовательность с помощью функции zip() в Python
Функция zip()
принимает несколько итерируемых объектов с одинаковыми значениями индексов, объединяет их и возвращает итератор. Итератором может быть кортеж, список или словарь.
Посмотрим на синтаксис:
zip(*iterables)
или
zip(iterator1, iterator2, ... и так далее)
Какие аргументы у функции zip()
? Данная функция принимает итерируемые объекты. Это могут быть списки, кортежи, строки, множества или словари.
К примеру, функцию zip()
можно использовать так:
color = ["Blue", "Orange", "Brown", "Red"] code = [20, 10, 56, 84] list(zip(color, code)) # Output: # [('Blue', 20), ('Orange', 10), ('Brown', 56), ('Red', 84)]
Здесь два списка объединяются, и в результате мы получаем итератор.
Если длины исходных итерируемых объектов различны, итератор перестает производить вывод, когда заканчивается самый короткий из объектов.
Возьмем пример:
color = ["Blue", "Orange", "Brown"] code = [20, 10, 56, 84] list(zip(color, code)) # Output: # [('Blue', 20), ('Orange', 10), ('Brown', 56)]
Здесь самая короткая длина у списка color
. Поэтому мы получаем на выходе 3 цвета и 3 кода. Четвертый же код игнорируется.
В Python 3.10 появился новый параметр strict
, который проверяет длину элементов. Его использование выдаст нам ошибку, если длины элементов не совпадают. Рассмотрим пример:
color = ("Blue", "Orange", "Brown", "Purple") code = (20, 10, 56) for col, cod in zip(color, code, strict=True): print(col, cod) # Output: # Blue 20 # Orange 10 # Brown 56 # Traceback (most recent call last): # File "<pyshell#14>", line 1, in <module> # for col, cod in zip(color, code, strict=True): # ValueError: zip() argument 2 is shorter than argument 1
Итерируемых объектов может быть не два, а больше. Разберем пример с тремя:
Abbreviation = ['Bl', 'Or', 'Br', 'Gn'] Color = ['Blue', 'Orange', 'Brown', 'Green'] Code = [20, 10, 56, 88] for ab, col, cod in zip(Abbreviation, Color, Code): print(ab, col, cod) # Output: # Bl Blue 20 # Or Orange 10 # Br Brown 56 # Gn Green 88
Используя функцию zip()
с функцией dict()
, можно создать словарь:
Color = ['Blue', 'Orange', 'Brown', 'Green'] Code = [20, 10, 56, 88] dict(zip(Color, Code)) # Output: # {'Blue': 20, 'Orange': 10, 'Brown': 56, 'Green': 88}
Как перебрать последовательность с помощью функции sorted() в Python
Функция sorted()
возвращает элементы итерируемого объекта в отсортированном порядке.
Синтаксис данной функции выглядит следующим образом:
sorted(iterable, key=key, reverse=reverse)
Функция принимает три аргумента:
iterable
– итерируемый объект (список, кортеж, строка и т.д.)key
– опциональный аргумент. В качестве key можно передать функцию для настройки порядка сортировки. Значение параметра по умолчанию –None
.reverse
– тоже не обязателен. Значением reverse может быть True или False. По умолчанию используетсяFalse
, т.е. сортировка происходит в порядке возрастания. Если вы укажетеreverse=True
, то сортировка будет в порядке убывания.
Рассмотрим пример:
Color = ['Blue', 'Orange', 'Brown', 'Green'] sorted(Color) # Output: # ['Blue', 'Brown', 'Green', 'Orange']
По умолчанию наш вывод будет списком элементов в возрастающем порядке. Строки сортируются в алфавитном порядке, числа — по возрастанию.
В примере выше мы получили список, отсортированный по алфавиту в восходящем порядке. Если вы хотите, чтобы он был в порядке убывания, вы можете использовать аргумент reverse
. Например:
Color = ('Blue', 'Orange', 'Brown', 'Green') sorted(Color, reverse=True) # Output: # ['Orange', 'Green', 'Brown', 'Blue']
Исходный объект остается неизменным, поскольку функция sorted()
не изменяет исходные значения. Она только выводит результат сортировки на экран. Результатом будет упорядоченный список.
Функция, переданная в качестве значения аргумента key
, может быть встроенной или определяемой пользователем. С ее помощью можно управлять порядком вывода.
Давайте рассмотрим случай со встроенной функцией.
Word = ('TO', 'is', 'apple', 'PEAR', 'LIKE') sorted(Word, key=str.upper) # Output: # ['apple', 'is', 'LIKE', 'PEAR', 'TO']
По умолчанию вывод будет в возрастающем порядке. Для изменения порядка следует добавить reverse=True
:
Word = ('TO', 'is', 'apple', 'PEAR', 'LIKE') sorted(Word, key=str.upper, reverse=True) # Output: # ['TO', 'PEAR', 'LIKE', 'is', 'apple']
В качестве параметра key можно использовать не только встроенные функции. Давайте рассмотрим случай с пользовательской:
numb = (22, 10, 5, 34, 29) sorted(numb, key=lambda x: x%5) # Output: # [10, 5, 22, 34, 29]
Мы использовали лямбда-функцию для простоты, но вы можете использовать и традиционный метод определения функции.
Как перебрать последовательность с помощью функции reversed() в Python
Функция reversed()
возвращает элементы итерируемого объекта в обратном порядке.
Синтаксис этой функции следующий:
reversed(iterable)
Аргумент iterable
– это итерируемый объект (список, кортеж, множество и т.д.).
Возьмем пример:
numb = (22, 10, 5, 34, 29) list(reversed(numb)) # Output: # [29, 34, 5, 10, 22]
Как и в случае с enumerate()
, при использовании reversed()
нужно явно указывать, хотите вы получить на выходе список или кортеж. Если просто вызвать эту функцию, она выдаст вам следующее:
numb = (22, 10, 5, 34, 29) reversed(numb) # Output: # <reversed object at 0x000001C1E7D9E110>
Заключение
Мы рассмотрели встроенные функции Python, позволяющие перебрать последовательность. С ними вы сможете писать более чистый и упорядоченный код.
Перевод статьи «How to Use Built-in Looping Functions in Python».