Python списки: создание, методы, примеры
Основная структура данных: список (list)
Список в Python - это встроенный изменяемый тип данных, представляющий упорядоченную последовательность элементов. Элементы могут быть любого типа, включая другие списки. Основные преимущества: быстрый доступ по индексу (O(1)) и эффективное добавление/удаление в конце (амортизированное O(1)).
# Создание пустого списка
empty = []
# Создание списка с элементами
numbers = [1, 2, 3, 4, 5]
mixed = [1, 'строка', 3.14, True]
структура данных список python (структура данных список в python)
Список поддерживает индексацию, срезы, итерацию, методы для модификации.
Как создать список разными способами?
Список можно создать не только с помощью квадратных скобок, но и через функцию list(), которая преобразует любой итерируемый объект в список.
# Из строки
list('hello') # ['h', 'e', 'l', 'l', 'o']
# Из диапазона
list(range(5)) # [0, 1, 2, 3, 4]
# Из кортежа
list((10, 20, 30)) # [10, 20, 30]
Проблема: Если передать не итерируемый объект (например, число), возникнет TypeError. Всегда проверяйте тип аргумента.
Как добавить элемент в список?
Метод append() добавляет один элемент в конец. Для добавления нескольких элементов используется extend() или оператор +=. Метод insert() вставляет элемент по указанному индексу.
nums = [1, 2, 3]
nums.append(4) # [1, 2, 3, 4]
nums.extend([5, 6]) # [1, 2, 3, 4, 5, 6]
nums.insert(0, 0) # [0, 1, 2, 3, 4, 5, 6]
Типичная ошибка: Использование append() для добавления нескольких элементов: nums.append([5,6]) добавит список как один элемент, а не отдельные числа. Используйте extend() или цикл.
Как удалить элемент из списка?
Метод pop() удаляет элемент по индексу и возвращает его. Метод remove() удаляет первый найденный элемент по значению. Оператор del удаляет элемент или срез. Метод clear() очищает весь список.
nums = [10, 20, 30, 20]
val = nums.pop(1) # val = 20, nums = [10, 30, 20]
nums.remove(20) # удаляет первое вхождение 20, nums = [10, 30]
del nums[0] # nums = [30]
nums.clear() # nums = []
Ошибка: remove() вызывает ValueError, если элемент не найден. Сначала проверяйте наличие с помощью in.
Как отсортировать список?
Метод sort() сортирует список на месте (изменяет исходный). Функция sorted() возвращает новый отсортированный список. Обе поддерживают параметр reverse=True и key для пользовательской сортировки.
nums = [3, 1, 2]
nums.sort() # nums = [1, 2, 3]
sorted_nums = sorted([3,1,2]) # [1, 2, 3], исходный не изменился
# Сортировка по длине строк
words = ['aa', 'b', 'ccc']
words.sort(key=len) # ['b', 'aa', 'ccc']
Проблема: Если список содержит элементы разных несравнимых типов (например, числа и строки), сортировка вызовет TypeError. Убедитесь, что все элементы имеют одинаковый тип или предоставьте функцию key.
Как скопировать список без ссылки на оригинал?
Простое присваивание (new = old) не создаёт копию, а только новый ссылку. Для поверхностной копии используйте срез [:], метод copy() или функцию list(). Для глубокого копирования вложенных списков применяйте copy.deepcopy().
original = [1, [2, 3]]
shallow = original.copy()
shallow[1][0] = 99 # изменяет и original, так как внутренний список общий
import copy
deep = copy.deepcopy(original)
deep[1][0] = 0 # original не изменился
Ошибка: Использование [:] или copy() для вложенных списков не создаёт независимые внутренние объекты. Только глубокое копирование решает эту проблему.
# 1. Создание списка списков (матрицы) с помощью спискового включения
matrix = [[i + j for j in range(3)] for i in range(3)]
print(matrix)
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
# 2. Фильтрация с условием и преобразованием
numbers = [1, 2, 3, 4, 5, 6]
even_squares = [x**2 for x in numbers if x % 2 == 0]
print(even_squares)
[4, 16, 36]
# 3. Сортировка по нескольким ключам (сначала длина, затем алфавит)
words = ['apple', 'banana', 'cherry', 'date', 'elderberry']
words.sort(key=lambda w: (len(w), w))
print(words)
['date', 'apple', 'banana', 'cherry', 'elderberry']
# 4. Использование map и list для преобразования типов
str_nums = ['1', '2', '3']
int_nums = list(map(int, str_nums))
print(int_nums)
[1, 2, 3]
# 5. Разворот списка с помощью среза
nums = [10, 20, 30, 40]
reversed_nums = nums[::-1]
print(reversed_nums)
[40, 30, 20, 10]
# 6. Поиск индексов всех вхождений элемента
items = ['a', 'b', 'a', 'c', 'a']
indices = [idx for idx, val in enumerate(items) if val == 'a']
print(indices)
[0, 2, 4]
# 7. Изменение элементов по условию с использованием enumerate
numbers = [1, 2, 3, 4, 5]
for i, val in enumerate(numbers):
if val % 2 == 0:
numbers[i] = val * 10
print(numbers)
[1, 20, 3, 40, 5]
# 8. Слияние двух списков с чередованием (zip и flatten)
a = [1, 2, 3]
b = ['x', 'y', 'z']
merged = [val for pair in zip(a, b) for val in pair]
print(merged)
[1, 'x', 2, 'y', 3, 'z']
# 9. Список с уникальными элементами (сохраняя порядок)
items = [1, 2, 2, 3, 1, 4]
seen = set()
unique = []
for item in items:
if item not in seen:
seen.add(item)
unique.append(item)
print(unique)
[1, 2, 3, 4]
Эти примеры демонстрируют гибкость списков Python при решении повседневных задач. Комбинируя списковые включения, встроенные функции и методы, можно писать компактный и эффективный код.