Списки и массивы в Python: всё, что нужно знать с примерами

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

Примеры массивов в Python - comments

En
массив python примеры (python)