7 расширенных операций со списками Python, которые могут эффективно оптимизировать ваш код

Python прост в обучении, но труден в оттачивании мастерства.

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

В этой статье мы покажем вам семь расширенных операций со списками, которые сделают ваш код аккуратнее, чище и качественнее.

1. Архивация и распаковка нескольких списков

Каков самый быстрый способ объединить элементы из нескольких списков?

Встроенная функция zip() в Python может сделать это:

id = [1, 2, 3, 4]
leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Yang Zhou']
sex = ['male', 'male', 'male', 'male']
record = zip(id, leaders, sex)

print(list(record))
# [(1, 'Elon Mask', 'male'), (2, 'Tim Cook', 'male'), (3, 'Bill Gates', 'male'), (4, 'Yang Zhou', 'male')]

Как показано в приведённом выше коде, функция zip создает итератор кортежей, где i-й кортеж содержит i-й элемент из исходных списков.

Если у нас есть список, включающий кортежи, как распаковать его на несколько списков?

Нам нужно использовать asterisk:

record = [(1, 'Elon Mask'), (2, 'Tim Cook'), (3, 'Bill Gates'), (4, 'Yang Zhou')]
id, leaders = zip(*record)
print(id)
# (1, 2, 3, 4)
print(leaders)
# ('Elon Mask', 'Tim Cook', 'Bill Gates', 'Yang Zhou')

2. Используйте генерацию для создания новых списков

Независимо от того, какой язык программирования мы используем, новый список может быть создан с помощью обычных циклов for с некоторыми условиями if-else.

Однако мы используем Python. Питонический способ получения новых списков – это использование генерации.

Шаблон для написания генерации списка выглядит следующим образом:

new_list=[ expression for item in iterable (if condition) ]

Например, мы можем получить новый расширенный список из старого списка, как показано в приведённом ниже коде:

Genius = ["Jerry", "Jack", "tom", "yang"]
New_Genius = [name.capitalize() for name in Genius]
print(New_Genius)
# ['Jerry', 'Jack', 'Tom', 'Yang']

Что делает генерацию списка более удивительной, так это то, что мы можем использовать как циклы for, так и условия if-else внутри одного процесса:

Genius = ["Jerry", "Jack", "tom", "yang"]
New_Genius = [name if name.startswith('y') else 'Not Genius' for name in Genius]
print(New_Genius)
# ['Not Genius', 'Not Genius', 'Not Genius', 'yang']

3. Уменьшение затрат памяти

Когда наш список велик, выражение генератора может эффективно снизить затраты на память. Поскольку генератор применяет отложенную оценку, он будет создавать элементы только тогда, когда придёт время его использовать.

large_list = [x for x in range(1_000_000)]
large_list_g = (x for x in range(1_000_000))
print(large_list.__sizeof__())
# 8448712
print(large_list_g.__sizeof__())
# 96

Как показано выше, large_list_g является генератором. Он использует лишь немного памяти по сравнению с large_list.

4. Нарезка списков

Как мы знаем, Python предоставляет нам достаточную гибкость для нарезки списков. Шаблоном для этой операции является:

a_list[start:end:step]

Например, мы можем получить первые 3 элемента списка следующим образом:

my_list[:3]

Но как получить последние 3 элемента?

Отрицательный индекс может помочь (последний элемент равен -1, … и так далее):

my_list[-3:]

Как следует из его названия, “шаг” управляет ходом итерации. По умолчанию его значение равно 1.

Положительный “шаг” начнётся с начала списка, а отрицательный “шаг” начнётся с конца.

Обычно используемый трюк заключается в том, чтобы перевернуть список следующим образом:

>>> a = [1, 2, 3, 4, 5, 6]
>>> a[::-1]
[6, 5, 4, 3, 2, 1]

5. Используйте счетчик для вычисления элементов списка

Интуитивно, мы бы использовали цикл for, чтобы получить количество различных элементов в списке.

Но для этого есть более питонический и элегантный подход:

from collections import Counter

my_list = ['a', 'y', 'y', 'a', 'n', 'g', 'game', 'haha', 'a']
print(Counter(my_list))
# Counter({'a': 3, 'y': 2, 'n': 1, 'g': 1, 'game': 1, 'haha': 1})

Как показано выше, Counter в Python является специальным вариантом словаря. Он может помочь нам рассчитать количество элементов списка.

Часто используемая функция most_common(n) Counter-a может перечислять n наиболее распространённых элементов и их количество в порядке убывания. Если n равно None, в нём будут перечислены все подсчёты элементов по порядку.

from collections import Counter

my_list = ['a', 'y', 'y', 'a', 'n', 'g', 'game', 'haha', 'a']
print(Counter(my_list).most_common(2))
# [('a', 3), ('y', 2)]

6. Легкая сортировка списков

Сортировка списка – это обычное дело.

В Python есть два встроенных метода сортировки: sort() и sorted().

Разница между ними заключается в том, что функция sort вносит изменения в исходный список, в то время как функция sorted создаёт новый отсортированный список.

my_list = [1, 30, 99, 2, 3, 0, 3]
print(sorted(my_list))
# [0, 1, 2, 3, 3, 30, 99]
print(sorted(my_list, reverse=True))
# [99, 30, 3, 3, 2, 1, 0]
print(my_list)
# [1, 30, 99, 2, 3, 0, 3]

Как показано в приведённом выше примере, мы использовали функцию sorted() для получения новых отсортированных списков, одного в порядке возрастания, а другого в порядке убывания. Исходный список сохраняет свой порядок неизменным.

Если нам нужно выполнить сортировку списка, функция sort() является правильным выбором:

my_list = [1, 30, 99, 2, 3, 0, 3]
my_list.sort()
print(my_list)
# [0, 1, 2, 3, 3, 30, 99]

7. Объединение нескольких списков разными способами

Как объединить много списков в один?

Это просто, мы можем просто сложить их все вместе:

leaders_1 = ['Elon Mask', 'Tim Cook']
leaders_2 = ['Yang Zhou', 'Bill Gates']
leaders_3 = ['Jeff Bezos', 'Warren Buffet']
full_list = leaders_1+leaders_2+leaders_3

print(full_list)
# ['Elon Mask', 'Tim Cook', 'Yang Zhou', 'Bill Gates', 'Jeff Bezos', 'Warren Buffet']

Но Python великолепен из-за своей гибкости. Есть и другие интересные идеи для выполнения этой операции.

Например, мы также можем использовать asterisks:

leaders_1 = ['Elon Mask', 'Tim Cook']
leaders_2 = ['Yang Zhou', 'Bill Gates']
leaders_3 = ['Jeff Bezos', 'Warren Buffet']
full_list = [*leaders_1, *leaders_2, *leaders_3]

print(full_list)
# ['Elon Mask', 'Tim Cook', 'Yang Zhou', 'Bill Gates', 'Jeff Bezos', 'Warren Buffet']

Для справки, функция chain() из модуля itertools также может объединять списки:

from itertools import chain
leaders_1 = ['Elon Mask', 'Tim Cook']
leaders_2 = ['Yang Zhou', 'Bill Gates']
leaders_3 = ['Jeff Bezos', 'Warren Buffet']
full_list = list(chain(leaders_1,leaders_2,leaders_3))

print(full_list)
# ['Elon Mask', 'Tim Cook', 'Yang Zhou', 'Bill Gates', 'Jeff Bezos', 'Warren Buffet']

Спасибо за чтение!

+1
3
+1
3
+1
1
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *