Списки и массивы в Python: всё, что нужно знать с примерами
Основные операции с массивами в Python
Как создать массив с несколькими элементами?
Наиболее распространённый способ работы с массивами в Python - использование списка (list). Список может содержать элементы разных типов и поддерживает динамическое изменение размера.
numbers = [10, 20, 30, 40, 50]
print(numbers) # [10, 20, 30, 40, 50]
минимальный элемент массива python (поиск минимального элемента в массиве)
[10, 20, 30, 40, 50]
Python массив последнего элемента (получение последнего элемента массива)
Для создания пустого массива используется пустой список:
empty = []
print(empty)
массив python примеры (примеры массивов в python)
[]
списки в python примеры (примеры работы со списками в python)
Как обратиться к элементу по индексу?
Индексация начинается с нуля. Можно использовать отрицательные индексы для доступа с конца.
fruits = ['apple', 'banana', 'cherry']
print(fruits[1]) # banana
print(fruits[-1]) # cherry
двумерные списки в python (двумерные списки в python)
banana cherry
Python большие массивы (работа с большими массивами в python)
Как создать массив с элементами одного типа (модуль array)?
Модуль array позволяет создавать массивы, содержащие только элементы одного числового или символьного типа. Это может быть полезно для экономии памяти и при работе с большими объёмами однотипных данных.
import array as arr
int_array = arr.array('i', [1, 2, 3, 4, 5])
print(int_array)
array('i', [1, 2, 3, 4, 5])
Типичная ошибка:
Если попытаться добавить элемент другого типа, возникнет TypeError:
int_array.append(6.5) # TypeError: integer required
Решение: использовать массив типа 'd' для чисел с плавающей точкой или привести значение к нужному типу.
Как изменить элемент массива?
Списки поддерживают присваивание по индексу.
colors = ['red', 'green', 'blue']
colors[1] = 'yellow'
print(colors)
['red', 'yellow', 'blue']
Как добавить новый элемент в конец?
Метод append добавляет один элемент.
numbers = [1, 2, 3]
numbers.append(4)
print(numbers)
[1, 2, 3, 4]
Метод extend добавляет все элементы из другого списка.
numbers.extend([5, 6])
print(numbers)
[1, 2, 3, 4, 5, 6]
Как удалить элемент по значению?
Метод remove удаляет первое вхождение указанного значения.
chars = ['a', 'b', 'c', 'b', 'd']
chars.remove('b')
print(chars)
['a', 'c', 'b', 'd']
Ошибка:
Если значение отсутствует, возникает ValueError. Рекомендуется сначала проверять наличие с помощью in.
if 'z' in chars:
chars.remove('z')
Как получить длину массива?
arr = [10, 20, 30]
print(len(arr))
3
Как отсортировать массив?
Метод sort изменяет исходный список, функция sorted возвращает новый отсортированный список.
scores = [45, 12, 89, 33]
scores.sort()
print(scores)
new_scores = sorted(scores, reverse=True)
print(new_scores)
[12, 33, 45, 89] [89, 45, 33, 12]
Как перебрать элементы массива в цикле?
for item in ['кошка', 'собака', 'лиса']:
print(item)
кошка собака лиса
Для получения индекса используется enumerate:
for i, val in enumerate([10, 20, 30]):
print(i, val)
0 10 1 20 2 30
Как создать массив из чисел по формуле (list comprehension)?
squares = [x**2 for x in range(1, 6)]
print(squares)
[1, 4, 9, 16, 25]
Можно добавлять условие:
evens = [x for x in range(10) if x % 2 == 0]
print(evens)
[0, 2, 4, 6, 8]
Как скопировать массив, чтобы изменения не затрагивали оригинал?
Простая операция b = a не копирует - обе переменные ссылаются на один объект. Для поверхностного копирования подходит срез [:] или метод copy.
a = [1, 2, 3]
b = a[:]
b.append(4)
print(a, b)
[1, 2, 3] [1, 2, 3, 4]
Типичная ошибка:
При наличии вложенных списков поверхностное копирование не достаточно – изменения во вложенных списках отразятся в обеих копиях. Используйте copy.deepcopy из модуля copy.
import copy
original = [[1, 2], [3, 4]]
duplicate = copy.deepcopy(original)
duplicate[0][0] = 99
print(original, duplicate)
[[1, 2], [3, 4]] [[99, 2], [3, 4]]
Как создать многомерный массив (матрицу)?
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[1][2]) # элемент из второй строки, третьего столбца
6
Для генерации матриц удобны list comprehensions:
rows, cols = 3, 4
matrix = [[0 for _ in range(cols)] for _ in range(rows)]
print(matrix)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
Расширенные примеры работы с массивами в Python
Рассмотрим менее распространённые, но полезные приёмы.
Использование модуля array для экономии памяти
Модуль array поддерживает типы: 'i' (int), 'f' (float), 'b' (signed char), 'u' (unicode char) и другие. Пример с типом 'd' (double):
import array
ar = array.array('d', [1.5, 2.7, 3.14])
ar.append(4.0)
print(ar)
print(ar.buffer_info()) # (адрес, длина)
array('d', [1.5, 2.7, 3.14, 4.0])
(140703456789012, 4)
Бинарные операции над массивами
Можно применять арифметические операции поэлементно только для array, если типы совместимы. Для списков это не работает напрямую без NumPy.
a = array.array('i', [10, 20, 30])
b = array.array('i', [1, 2, 3])
с = array.array('i', [x + y for x, y in zip(a, b)])
print(с)
array('i', [11, 22, 33])
Срезы с шагом и обратный порядок
arr = [0, 1, 2, 3, 4, 5]
print(arr[::2]) # чётные индексы
print(arr[::-1]) # разворот
[0, 2, 4] [5, 4, 3, 2, 1, 0]
Фильтрация с помощью filter и map
numbers = [10, 15, 20, 25, 30]
функция = lambda x: x > 20
отфильтрованные = list(filter(функция, numbers))
print(отфильтрованные)
удвоенные = list(map(lambda x: x*2, numbers))
print(удвоенные)
[25, 30] [20, 30, 40, 50, 60]
Поиск индекса элемента с помощью index и бинарный поиск
Метод index возвращает первое вхождение. Если элементов много, для отсортированных данных эффективен bisect.
import bisect
sorted_arr = [1, 3, 5, 7, 9]
pos = bisect.bisect_left(sorted_arr, 6) # позиция для вставки
print(pos)
bisect.insort(sorted_arr, 6)
print(sorted_arr)
3 [1, 3, 5, 6, 7, 9]
Генераторы вместо списков для экономии памяти
Если массив нужен только для однократного прохода, используйте генераторное выражение.
gen = (x**2 for x in range(1000000))
print(next(gen))
print(next(gen))
0 1
Преобразование строки в массив символов
text = "Привет"
char_list = list(text)
print(char_list)
['П', 'р', 'и', 'в', 'е', 'т']
Объединение двух массивов с помощью zip
Создание списка кортежей из двух массивов:
keys = ['a', 'b', 'c']
values = [1, 2, 3]
pairs = list(zip(keys, values))
print(pairs)
[('a', 1), ('b', 2), ('c', 3)]
Использование deque для двусторонней очереди
Модуль collections предоставляет deque - эффективная структура для добавления/удаления с обоих концов.
from collections import deque
dq = deque([1, 2, 3])
dq.appendleft(0)
dq.append(4)
print(dq)
dq.popleft()
print(dq)
deque([0, 1, 2, 3, 4]) deque([1, 2, 3, 4])
Удаление дубликатов с сохранением порядка
items = [1, 2, 1, 3, 2, 4]
unique = list(dict.fromkeys(items)) # или OrderedDict
print(unique)
[1, 2, 3, 4]
Сортировка списка строк по длине или другому ключу
words = ['python', 'java', 'c', 'javascript']
words.sort(key=len)
print(words)
words.sort(key=lambda s: s[-1]) # по последней букве
print(words)
['c', 'java', 'python', 'javascript'] ['java', 'python', 'c', 'javascript']
Разделение массива по условию (partition)
def partition(arr, condition):
true_list = []
false_list = []
for item in arr:
(true_list if condition(item) else false_list).append(item)
return true_list, false_list
even, odd = partition([1,2,3,4,5], lambda x: x%2==0)
print(even, odd)
[2, 4] [1, 3, 5]