Списки в Python представляют собой упорядоченные изменяемые коллекции объектов произвольных типов. Они являются одним из самых гибких и часто используемых типов данных в Python программировании. Рассмотрим подробно создание, использование и взаимодействие списков с различными типами данных.
Создание списков в Python
Пустой список
empty_list = []
Список с элементами
numbers = [1, 2, 3, 4, 5]
strings = ["apple", "banana", "cherry"]
mixed = [1, "apple", 3.14, True]
Создание списков с помощью конструктора list()
# Создание списка из строки
letters = list("hello")
print(letters) # ['h', 'e', 'l', 'l', 'o']
# Создание списка из диапазона
numbers = list(range(5))
print(numbers) # [0, 1, 2, 3, 4]
Обращение к элементам списка
Индексация элементов
fruits = ["apple", "banana", "cherry"]
# Обращение к элементам с начала
print(fruits[0]) # apple
print(fruits[1]) # banana
print(fruits[2]) # cherry
# Обращение к элементам с конца
print(fruits[-1]) # cherry
print(fruits[-2]) # banana
print(fruits[-3]) # apple
Срезы (slicing)
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[2:5]) # [2, 3, 4]
print(numbers[:3]) # [0, 1, 2]
print(numbers[7:]) # [7, 8, 9]
print(numbers[::2]) # [0, 2, 4, 6, 8]
print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Изменение элементов списка
fruits = ["apple", "banana", "cherry"]
fruits[1] = "blueberry"
print(fruits) # ['apple', 'blueberry', 'cherry']
# Изменение нескольких элементов через срез
fruits[1:3] = ["orange", "grape"]
print(fruits) # ['apple', 'orange', 'grape']
Добавление элементов в список
Метод append()
Добавляет элемент в конец списка.
fruits = ["apple", "banana"]
fruits.append("cherry")
print(fruits) # ['apple', 'banana', 'cherry']
Метод insert()
Вставляет элемент на указанную позицию.
fruits = ["apple", "banana"]
fruits.insert(1, "blueberry")
print(fruits) # ['apple', 'blueberry', 'banana']
Метод extend()
Расширяет список, добавляя в конец все элементы из переданного итерируемого объекта.
fruits = ["apple", "banana"]
more_fruits = ["cherry", "date"]
fruits.extend(more_fruits)
print(fruits) # ['apple', 'banana', 'cherry', 'date']
Оператор += для добавления элементов
fruits = ["apple", "banana"]
fruits += ["cherry", "date"]
print(fruits) # ['apple', 'banana', 'cherry', 'date']
Удаление элементов из списка
Метод remove()
Удаляет первое вхождение указанного значения.
fruits = ["apple", "banana", "cherry"]
fruits.remove("banana")
print(fruits) # ['apple', 'cherry']
Метод pop()
Удаляет и возвращает элемент по указанному индексу.
fruits = ["apple", "banana", "cherry"]
popped_fruit = fruits.pop(1)
print(popped_fruit) # banana
print(fruits) # ['apple', 'cherry']
# Удаление последнего элемента
last_fruit = fruits.pop()
print(last_fruit) # cherry
Оператор del
fruits = ["apple", "banana", "cherry", "date"]
del fruits[1] # Удаляет элемент по индексу
del fruits[1:3] # Удаляет срез
print(fruits)
Метод clear()
Удаляет все элементы из списка.
fruits = ["apple", "banana", "cherry"]
fruits.clear()
print(fruits) # []
Поиск элементов в списке
Метод index()
Возвращает индекс первого вхождения указанного значения.
fruits = ["apple", "banana", "cherry"]
index = fruits.index("banana")
print(index) # 1
# Поиск с указанием диапазона
numbers = [1, 2, 3, 2, 4, 2, 5]
index = numbers.index(2, 2, 6) # Ищет 2 в диапазоне [2:6]
print(index) # 3
Метод count()
Возвращает количество вхождений указанного значения.
numbers = [1, 2, 2, 3, 2]
count = numbers.count(2)
print(count) # 3
Оператор in для проверки наличия элемента
fruits = ["apple", "banana", "cherry"]
print("banana" in fruits) # True
print("orange" not in fruits) # True
Сортировка списка
Метод sort()
Сортирует список на месте.
numbers = [3, 1, 4, 1, 5, 9, 2]
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 9]
# Сортировка в обратном порядке
numbers.sort(reverse=True)
print(numbers) # [9, 5, 4, 3, 2, 1, 1]
# Сортировка строк по длине
words = ["python", "java", "c", "javascript"]
words.sort(key=len)
print(words) # ['c', 'java', 'python', 'javascript']
Функция sorted()
Возвращает новый отсортированный список.
numbers = [3, 1, 4, 1, 5, 9, 2]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # [1, 1, 2, 3, 4, 5, 9]
print(numbers) # [3, 1, 4, 1, 5, 9, 2] (исходный не изменился)
Обращение списка
Метод reverse()
Изменяет порядок элементов в списке на обратный.
numbers = [3, 1, 4, 1, 5, 9, 2]
numbers.reverse()
print(numbers) # [2, 9, 5, 1, 4, 1, 3]
Функция reversed()
Возвращает итератор с элементами в обратном порядке.
numbers = [3, 1, 4, 1, 5, 9, 2]
reversed_numbers = list(reversed(numbers))
print(reversed_numbers) # [2, 9, 5, 1, 4, 1, 3]
Копирование списков
Поверхностное копирование
# Метод copy()
original = [1, 2, 3]
copy = original.copy()
print(copy) # [1, 2, 3]
# Срез
copy = original[:]
print(copy) # [1, 2, 3]
# Конструктор list()
copy = list(original)
print(copy) # [1, 2, 3]
Глубокое копирование
Для глубокого копирования вложенных списков используйте модуль copy.
import copy
original = [[1, 2, 3], [4, 5, 6]]
deep_copy = copy.deepcopy(original)
shallow_copy = copy.copy(original)
original[0][0] = 999
print(original) # [[999, 2, 3], [4, 5, 6]]
print(shallow_copy) # [[999, 2, 3], [4, 5, 6]]
print(deep_copy) # [[1, 2, 3], [4, 5, 6]]
Таблица основных методов списков
| Метод | Описание | Пример использования |
|---|---|---|
append(x) |
Добавляет элемент x в конец списка | lst.append(3) |
extend(iterable) |
Расширяет список, добавляя все элементы из итерируемого объекта | lst.extend([4, 5]) |
insert(i, x) |
Вставляет элемент x на позицию i | lst.insert(1, 2) |
remove(x) |
Удаляет первый элемент со значением x | lst.remove(3) |
pop([i]) |
Удаляет и возвращает элемент на позиции i | lst.pop(), lst.pop(1) |
clear() |
Удаляет все элементы из списка | lst.clear() |
index(x) |
Возвращает индекс первого элемента со значением x | lst.index(3) |
count(x) |
Возвращает количество элементов со значением x | lst.count(3) |
sort() |
Сортирует список на месте | lst.sort() |
reverse() |
Разворачивает список на месте | lst.reverse() |
copy() |
Возвращает поверхностную копию списка | lst.copy() |
Списки и различные типы данных
Списки со строками
words = ["hello", "world", "python"]
joined = " ".join(words)
print(joined) # "hello world python"
split_words = joined.split()
print(split_words) # ['hello', 'world', 'python']
# Сортировка строк
words.sort()
print(words) # ['hello', 'python', 'world']
Списки с числами
numbers = [1, 2, 3, 4, 5]
squares = [x ** 2 for x in numbers]
print(squares) # [1, 4, 9, 16, 25]
# Математические операции
print(sum(numbers)) # 15
print(max(numbers)) # 5
print(min(numbers)) # 1
Списки с логическими значениями
booleans = [True, False, True]
all_true = all(booleans)
any_true = any(booleans)
print(all_true) # False
print(any_true) # True
Многомерные списки
# Двумерный список (матрица)
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# Доступ к элементам
print(matrix[0][1]) # 2
print(matrix[2][0]) # 7
# Итерация по матрице
for row in matrix:
for elem in row:
print(elem, end=' ')
print()
Итерирование по спискам
Простое итерирование
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
Итерирование с индексами
fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits):
print(f"Index {index}: {fruit}")
# Итерирование с range()
for i in range(len(fruits)):
print(f"Index {i}: {fruits[i]}")
Итерирование по нескольким спискам
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
for name, age in zip(names, ages):
print(f"{name} is {age} years old")
Генераторы списков (List Comprehensions)
Основные генераторы списков
# Простой генератор
squares = [x ** 2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# Генератор с условием
even_squares = [x ** 2 for x in range(10) if x % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]
# Сложный генератор
words = ["hello", "world", "python"]
uppercase_words = [word.upper() for word in words if len(word) > 4]
print(uppercase_words) # ['HELLO', 'WORLD', 'PYTHON']
Вложенные генераторы списков
# Создание матрицы
matrix = [[i * j for j in range(1, 4)] for i in range(1, 4)]
print(matrix) # [[1, 2, 3], [2, 4, 6], [3, 6, 9]]
# Преобразование матрицы в плоский список
flat_list = [item for row in matrix for item in row]
print(flat_list) # [1, 2, 3, 2, 4, 6, 3, 6, 9]
Встроенные функции для работы со списками
Функция len()
numbers = [1, 2, 3, 4, 5]
print(len(numbers)) # 5
Функции sum(), max(), min()
numbers = [1, 2, 3, 4, 5]
print(sum(numbers)) # 15
print(max(numbers)) # 5
print(min(numbers)) # 1
Функция zip()
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
cities = ["New York", "Los Angeles", "Chicago"]
for name, age, city in zip(names, ages, cities):
print(f"{name} is {age} years old and lives in {city}")
Функция map()
numbers = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x ** 2, numbers))
print(squares) # [1, 4, 9, 16, 25]
# Применение функции к строкам
words = ["hello", "world"]
upper_words = list(map(str.upper, words))
print(upper_words) # ['HELLO', 'WORLD']
Функция filter()
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # [2, 4, 6, 8, 10]
# Фильтрация строк
words = ["python", "java", "c", "javascript", "go"]
long_words = list(filter(lambda word: len(word) > 3, words))
print(long_words) # ['python', 'java', 'javascript']
Функция reduce()
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product) # 120
# Поиск максимума
maximum = reduce(lambda x, y: x if x > y else y, numbers)
print(maximum) # 5
Полезные операции со списками
Поворот списка
def rotate_list(lst, k):
"""Поворачивает список на k позиций вправо"""
n = len(lst)
k = k % n # Обработка случаев, когда k больше длины списка
return lst[-k:] + lst[:-k]
numbers = [1, 2, 3, 4, 5]
rotated = rotate_list(numbers, 2)
print(rotated) # [4, 5, 1, 2, 3]
Удаление дубликатов
# Простой способ (не сохраняет порядок)
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = list(set(numbers))
print(unique_numbers) # [1, 2, 3, 4, 5]
# Сохранение порядка
def remove_duplicates(lst):
seen = set()
result = []
for item in lst:
if item not in seen:
seen.add(item)
result.append(item)
return result
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_ordered = remove_duplicates(numbers)
print(unique_ordered) # [1, 2, 3, 4, 5]
Разделение списка на части
def chunk_list(lst, n):
"""Разделяет список на части размером n"""
return [lst[i:i + n] for i in range(0, len(lst), n)]
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
chunks = chunk_list(numbers, 3)
print(chunks) # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Сравнение списков
list1 = [1, 2, 3]
list2 = [1, 2, 3]
list3 = [3, 2, 1]
print(list1 == list2) # True
print(list1 == list3) # False
print(list1 is list2) # False
# Сравнение содержимого без учета порядка
print(set(list1) == set(list3)) # True
Объединение списков
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = [7, 8, 9]
# Различные способы объединения
combined1 = list1 + list2 + list3
combined2 = [*list1, *list2, *list3]
combined3 = []
combined3.extend(list1)
combined3.extend(list2)
combined3.extend(list3)
print(combined1) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
Производительность и оптимизация
Выбор между append() и extend()
# Медленнее для добавления нескольких элементов
lst = []
for item in [1, 2, 3, 4, 5]:
lst.append(item)
# Быстрее для добавления нескольких элементов
lst = []
lst.extend([1, 2, 3, 4, 5])
Использование генераторов списков вместо циклов
# Медленнее
squares = []
for x in range(1000):
squares.append(x ** 2)
# Быстрее
squares = [x ** 2 for x in range(1000)]
Списки Python являются мощным и универсальным инструментом для работы с данными. Они предоставляют богатый набор методов и возможностей, делая их незаменимыми в программировании на Python. Понимание различных способов создания, изменения и обработки списков поможет вам писать более эффективный и читаемый код.