Тип данных list в скриптовом языке Python

Раздел: Основы Python -> типы данных 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]

список (list) в Python - comments

En
Python list (python)