Тип данных list в скриптовом языке Python
Основы работы со списками (list) в Python
Список (list) - это изменяемая упорядоченная коллекция элементов произвольных типов. Для создания списка используются квадратные скобки: my_list = [1, 'a', 3.14]. Доступ к элементам осуществляется по индексу (начиная с 0), например my_list[0] вернет 1. Отрицательные индексы отсчитывают с конца: my_list[-1] возвращает последний элемент. Изменение элемента: my_list[1] = 'b'. Добавление в конец - метод append(): my_list.append('new'). Удаление по индексу - pop(i), по значению - remove(value). Срезы позволяют получать подсписки: my_list[1:3].
# Пример создания и базовых операций
my_list = [10, 20, 30, 40]
print(my_list[0]) # 10
my_list[1] = 25
my_list.append(50)
print(my_list) # [10, 25, 30, 40, 50]
popped = my_list.pop(2)
print(popped) # 30
print(my_list) # [10, 25, 40, 50]Python list (список (list) в python)
Типичные проблемы:
- Индекс вне диапазона (IndexError) при обращении по несуществующему индексу.
- Изменение списка во время итерации по нему приводит к непредсказуемому поведению; рекомендуется создавать копию для итерации.
- Метод remove удаляет только первое вхождение значения.
Как создать список из строки?
text = 'hello'
chars = list(text)
print(chars) # ['h', 'e', 'l', 'l', 'o']Элементами становятся отдельные символы. Нельзя преобразовать число напрямую: list(123) вызовет TypeError.
Ошибка:
Попытка преобразовать целое число в список через list() приводит к ошибке. Для чисел используйте list(str(123)) или range.
Как создать список из диапазона чисел?
numbers = list(range(10))
print(numbers) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
even = list(range(0, 10, 2))
print(even) # [0, 2, 4, 6, 8]Проблема:
range сам по себе не список, а итератор; преобразование через list() создает полный список в памяти. Для больших диапазонов это может быть неэффективно.
Как создать список с помощью генератора списка (list comprehension)?
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]Удобная и лаконичная замена циклу for. Можно добавить условие: [x for x in numbers if x % 2 == 0].
Читаемость:
Слишком сложные генераторы снижают читаемость кода; лучше выносить логику в отдельные функции.
Как объединить два списка?
a = [1, 2]
b = [3, 4]
# Через оператор +
c = a + b # [1, 2, 3, 4]
# Через extend
a.extend(b) # a теперь [1, 2, 3, 4]Оператор + создает новый список, extend изменяет исходный. Не смешивайте с append: a.append(b) добавит список как элемент.
Ошибка:
При использовании append вместо extend получается вложенный список.
Как проверить наличие элемента в списке?
fruits = ['apple', 'banana', 'cherry']
if 'banana' in fruits:
print('Есть!')Оператор in возвращает True/False. Для больших списков поиск линейный (O(n)).
Производительность:
Если требуется частый поиск, лучше использовать set, где проверка O(1).
Как отсортировать список?
nums = [3, 1, 4, 1, 5]
sorted_nums = sorted(nums) # новый список [1, 1, 3, 4, 5]
nums.sort() # сортирует на месте, nums измененsorted() возвращает новый список, sort() изменяет исходный. Можно задать обратный порядок через параметр reverse=True.
Путаница:
Сортировка списка с элементами разных типов (например, числа и строки) вызывает TypeError. Убедитесь, что все элементы сравнимы.
Как скопировать список?
original = [1, [2, 3], 4]
# Поверхностная копия
shallow = original.copy()
# Глубокая копия (для вложенных структур)
import copy
deep = copy.deepcopy(original)Поверхностная копия копирует только внешний список; внутренние объекты остаются ссылками. Изменение вложенного списка в копии отразится на оригинале.
Неожиданное изменение:
При работе с многомерными списками без глубокого копирования изменение одного элемента может повлиять на другие.
Как удалить дубликаты из списка, сохранив порядок?
items = ['a', 'b', 'a', 'c', 'b']
seen = set()
result = []
for item in items:
if item not in seen:
seen.add(item)
result.append(item)
print(result) # ['a', 'b', 'c']Использование set для отслеживания уникальности. Простое преобразование в set (list(set(items))) не гарантирует порядок в старых версиях Python (до 3.7 порядок случайный).
Потеря порядка:
Метод list(set(...)) теряет исходную последовательность; для ее сохранения применяется приведенный выше подход.
Как преобразовать список в строку?
words = ['Hello', 'world']
sentence = ' '.join(words)
print(sentence) # 'Hello world'Метод join() вызывается от строки-разделителя и принимает список строк. Если элементы не строки, потребуется преобразование: ' '.join(map(str, numbers)).
TypeError:
При попытке join с элементами, не являющимися строками, возникает ошибка. Предварительно преобразуйте все элементы в строки.
Как применить функцию ко всем элементам списка?
numbers = [1, 2, 3, 4]
# List comprehension
doubled = [x * 2 for x in numbers]
# map
mapped = list(map(lambda x: x * 2, numbers))
print(doubled) # [2, 4, 6, 8]Оба подхода создают новый список. map возвращает итератор, поэтому его нужно явно преобразовать в list для получения списка.
Ленивость map:
Если не обернуть map в list, результат не будет вычислен до итерации; это может сбивать с толку при отладке.
Расширенные примеры работы со списками
Многомерные списки (матрицы)
# Создание матрицы 3x3
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# Доступ к элементу
print(matrix[1][2]) # 6
# Изменение строки
matrix[2] = [10, 11, 12]
# Глубокая копия для независимости строк
import copy
matrix_copy = copy.deepcopy(matrix)6
Использование enumerate для получения индексов
colors = ['red', 'green', 'blue']
for idx, color in enumerate(colors):
print(f'{idx}: {color}')0: red 1: green 2: blue
Параллельная итерация с zip
names = ['Alice', 'Bob']
scores = [85, 92]
pairs = list(zip(names, scores))
print(pairs) # [('Alice', 85), ('Bob', 92)]
for name, score in zip(names, scores):
print(f'{name}: {score}')[('Alice', 85), ('Bob', 92)]
Alice: 85
Bob: 92Сортировка с пользовательским ключом
people = [('Alex', 30), ('Bob', 25), ('Charlie', 35)]
sorted_by_age = sorted(people, key=lambda person: person[1])
print(sorted_by_age) # [('Bob', 25), ('Alex', 30), ('Charlie', 35)][('Bob', 25), ('Alex', 30), ('Charlie', 35)]Глубокое копирование вложенных структур
import copy
original = [[1, 2], [3, 4]]
shallow = original.copy()
deep = copy.deepcopy(original)
original[0][0] = 99
print(shallow) # [[99, 2], [3, 4]] (изменилось!)
print(deep) # [[1, 2], [3, 4]] (не изменилось)[[99, 2], [3, 4]] [[1, 2], [3, 4]]
Эффективная работа с началом и концом списка (deque)
from collections import deque
dq = deque([1, 2, 3])
dq.appendleft(0) # [0, 1, 2, 3]
dq.append(4) # [0, 1, 2, 3, 4]
dq.popleft() # удаляет 0, возвращает 0
print(dq) # [1, 2, 3, 4]deque([1, 2, 3, 4])
List comprehension с вложенными циклами
# Создание пар (i, j) из двух диапазонов
pairs = [(x, y) for x in range(3) for y in range(2)]
print(pairs) # [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)][(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
Преобразование двух списков в словарь
keys = ['name', 'age', 'city']
values = ['Alice', 25, 'Moscow']
dictionary = dict(zip(keys, values))
print(dictionary) # {'name': 'Alice', 'age': 25, 'city': 'Moscow'}{'name': 'Alice', 'age': 25, 'city': 'Moscow'}Использование срезов для реверса и замены
nums = [1, 2, 3, 4, 5]
# Реверс списка через срез
reversed_nums = nums[::-1]
print(reversed_nums) # [5, 4, 3, 2, 1]
# Замена части списка
nums[1:4] = [20, 30, 40]
print(nums) # [1, 20, 30, 40, 5][5, 4, 3, 2, 1] [1, 20, 30, 40, 5]
Фильтрация с filter и lambda
numbers = [10, 15, 20, 25, 30]
even = list(filter(lambda x: x % 2 == 0, numbers))
print(even) # [10, 20, 30][10, 20, 30]