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']Спасибо за чтение!Статья была взята из этого источника:uproger.com7 расширенных операций со списками Python, которые могут эффективно оптимизировать ваш кодPython прост в обучении, но труден в оттачивании мастерства. Например, операции CRUD (создание, чтение, обновление и удаление) списков Python просты и фундаментальны, но простого знания их недостаточно для обработки некоторых сложных сценариев. В этой статье мы покажем вам семь расширенных опе