Программы с массивами на Python: от основ до продвинутых приёмов
Программы с массивами на Python: основные способы и примеры
В Python под термином «массив» чаще всего понимают список (list) - изменяемую упорядоченную коллекцию элементов. Списки широко используются для хранения данных, их обработки и преобразования. В этом разделе рассматриваются различные подходы к работе со списками, включая создание, модификацию, поиск, сортировку и копирование. Для каждой задачи предлагается основное эффективное решение и альтернативные варианты.
Как создать список чисел от 0 до 9?
numbers = list(range(10))вложенные структуры данных в python (вложенные структуры данных в python)
Пояснение:
Функцияrange(10) генерирует последовательность от 0 до 9, а list() преобразует её в список. Это лаконичный и быстрый способ, особенно для арифметических прогрессий.numbers = [i for i in range(10)]кортеж чисел python (кортеж чисел в python)
Вариант с list comprehension:
Аналогично, но используется генератор списков. Удобно, когда нужно применить выражение:[i*2 for i in range(10)].from array import array
numbers = array('i', range(10))
язык программирования python массивы (массивы (списки) в python)
Модуль array:
Создаёт массив с элементами одного типа (здесь - целые числа). Занимает меньше памяти, но методы изменяемости ограничены. Подходит для числовых данных, когда важна экономия памяти.Типичные ошибки:
- Путаница с кортежем:
numbers = (1,2,3)создаёт неизменяемую коллекцию. - Использование
rangeбезlist()даёт объект-генератор, а не список.
Как добавить элемент в конец списка?
numbers = [1, 2, 3]
numbers.append(4)массивы данных python 3 (массивы данных в python)
Пояснение:
Методappend добавляет один элемент в конец. Время операции - O(1) в среднем. Это стандартный способ.numbers.extend([5, 6])одномерные массивы на языке программирования python (одномерные массивы в python)
Добавление нескольких элементов:
extend принимает итерируемый объект и добавляет каждый его элемент.numbers += [7, 8]последовательности в python и способы их реализации (последовательности в python и способы их реализации)
Оператор +=:
Аналогиченextend, но создаёт новый список при присваивании, что может быть менее эффективно для больших данных.Проблема:
Изменение списка во время итерации по нему приводит к ошибкеRuntimeError: list changed during iteration. Для безопасного удаления элементов во время обхода создавайте копию или используйте while.Как проверить наличие элемента в списке?
items = [10, 20, 30]
if 20 in items:
print('Элемент найден')программы с массивами на python (программы с массивами на python)
Пояснение:
Операторin выполняет линейный поиск. Для больших списков лучше предварительно отсортировать и использовать bisect, или преобразовать в множество.index = items.index(20) # возвращает индекс первого вхожденияPython пар (пары (ключ-значение) в python)
Поиск индекса:
Методindex находит позицию элемента. Если элемента нет - выбрасывается исключение ValueError.count = items.count(20) # количество вхожденийPython разница списков (разница между списками и кортежами в python)
Типичная ошибка:
Попытка удалить элемент без проверки его наличия:items.remove(40) вызовет ValueError. Всегда проверяйте наличие перед удалением или используйте условие.Как отсортировать список по возрастанию?
items = [3, 1, 2]
items.sort() # изменяет исходный списоккак сделать массив python (создание массива (списка) в python)
Пояснение:
Методsort() сортирует список на месте. Для получения новой отсортированной копии используют функцию sorted(items).sorted_items = sorted(items, reverse=True)списки в языке python (списки в python)
Сортировка по убыванию:
Параметрreverse=True меняет порядок.sorted_items = sorted(items, key=lambda x: x['name'])упорядоченные структуры данных в python (упорядоченные структуры данных в python)
Сортировка по ключу:
Для списка словарей сортировка по полю с помощьюkey.Проблема:
Сортировка списка, содержащего элементы разных типов (например, числа и строки), вызоветTypeError. Убедитесь, что все элементы сравнимы.Как создать независимую копию списка?
original = [1, 2, [3, 4]]
shallow_copy = original.copy() # или original[:]значения списка числа python (итерация по значениям списка чисел в python)
Пояснение:
Методcopy() создаёт поверхностную копию: внутренние объекты (вложенные списки) остаются теми же. Для полной независимости используйте deepcopy.import copy
deep_copy = copy.deepcopy(original)словарь set python (словарь и set в python)
Глубокое копирование:
Рекурсивно копирует все вложенные объекты. Подходит для сложных структур.Типичная ошибка:
Присваиваниеnew = original не создаёт копию, а только новую ссылку на тот же объект. Изменение new отразится на original.Как создать двумерный список (матрицу) заданного размера?
rows, cols = 3, 4
matrix = [[0]*cols for _ in range(rows)]Python dict set (словарь и множество в python)
Пояснение:
Генератор списков создаёт каждую строку как новый список. Это надёжный способ, гарантирующий независимость строк.matrix = [[0]*cols]*rows # НЕПРАВИЛЬНО!типы структур python (типы структур данных в python)
Ошибка:
Такая конструкция создаётrows ссылок на один и тот же список. Изменение одного элемента повлияет на все строки.import numpy as np
matrix = np.zeros((rows, cols), dtype=int)
Библиотека NumPy:
Для числовых расчётов NumPy предоставляет эффективные многомерные массивы. Однако это выходит за рамки стандартного Python.Частая проблема:
Забывают про ссылочную природу списков. При инициализации матрицы всегда используйте генераторfor _ in range(rows).Дополнительные примеры и приёмы работы с массивами
1. Использование array.array для экономии памяти
from array import array
arr = array('d', [1.5, 2.3, 3.7]) # массив чисел с плавающей точкой (double)
arr.append(4.1)
print(arr)
# array('d', [1.5, 2.3, 3.7, 4.1])
array('d', [1.5, 2.3, 3.7, 4.1])
Массив array хранит элементы одного типа (здесь 'd' - double). Занимает меньше памяти, чем список, но поддерживает не все методы (например, нет sort). Подходит для больших числовых данных.
2. Транспонирование матрицы (списка списков)
matrix = [[1, 2, 3],
[4, 5, 6]]
transposed = [list(row) for row in zip(*matrix)]
print(transposed)
# [[1, 4], [2, 5], [3, 6]]
[[1, 4], [2, 5], [3, 6]]
Используется оператор распаковки * для передачи строк матрицы в zip, который собирает элементы по столбцам. Затем каждая группа преобразуется в список.
3. Сортировка строк по длине
words = ['apple', 'pear', 'banana', 'kiwi']
sorted_words = sorted(words, key=len, reverse=True)
print(sorted_words)
# ['banana', 'apple', 'pear', 'kiwi']
['banana', 'apple', 'pear', 'kiwi']
Параметр key=len задаёт функцию вычисления ключа сортировки. Аналогично можно сортировать по последней букве: key=lambda x: x[-1].
4. Группировка элементов по условию
numbers = [1, 2, 3, 4, 5, 6]
even = [x for x in numbers if x % 2 == 0]
odd = [x for x in numbers if x % 2 != 0]
print('Чётные:', even, 'Нечётные:', odd)
# Чётные: [2, 4, 6] Нечётные: [1, 3, 5]
Чётные: [2, 4, 6] Нечётные: [1, 3, 5]
Два прохода - простое решение. Для одного прохода можно использовать filter и lambda или словарь списков.
5. Применение нескольких функций к элементам с map
def square(x):
return x**2
def cube(x):
return x**3
numbers = [1, 2, 3, 4]
result = list(map(lambda x: (square(x), cube(x)), numbers))
print(result)
# [(1, 1), (4, 8), (9, 27), (16, 64)]
[(1, 1), (4, 8), (9, 27), (16, 64)]
Функция map возвращает итератор. Преобразование в список даёт кортеж из результатов двух функций для каждого числа.
6. Слияние двух списков поочерёдно
a = [1, 2, 3]
b = ['a', 'b', 'c']
merged = [val for pair in zip(a, b) for val in pair]
print(merged)
# [1, 'a', 2, 'b', 3, 'c']
[1, 'a', 2, 'b', 3, 'c']
Двойное for в comprehension: сначала берётся пара из zip, затем каждый элемент пары добавляется в итоговый список.
7. Поиск дубликатов в списке
items = [1, 2, 3, 2, 4, 1]
seen = set()
duplicates = []
for item in items:
if item in seen:
duplicates.append(item)
else:
seen.add(item)
print('Дубликаты:', duplicates)
# Дубликаты: [2, 1]
Дубликаты: [2, 1]
Используется множество seen для отслеживания уже встреченных элементов. Если элемент уже есть в множестве, он считается дубликатом.
8. Генерация списка случайных чисел с условием
import random
random.seed(42) # для воспроизводимости
numbers = [random.randint(1, 100) for _ in range(10) if random.randint(1, 100) % 2 == 0]
# Внимание: такой подход может дать меньше 10 чисел, так как условие проверяется на новом random
Лучше генерировать полный список и потом фильтровать:
numbers = [x for x in (random.randint(1,100) for _ in range(10)) if x % 2 == 0]
[18, 66, 42, 6]
9. Преобразование списка строк в числа с обработкой ошибок
strings = ['10', '20', 'abc', '30']
numbers = []
for s in strings:
try:
numbers.append(int(s))
except ValueError:
numbers.append(None) # или игнорировать
print(numbers)
# [10, 20, None, 30]
[10, 20, None, 30]
При преобразовании типов возможны исключения. Обработка внутри цикла позволяет продолжить выполнение, заменяя некорректные значения на None.
10. Использование излишнего копирования - проблема производительности
big_list = list(range(1000000))
# Плохо: каждый раз создаётся новый список
total = 0
for i in range(len(big_list)):
total += big_list[i]
# Хорошо: sum(big_list) или цикл по элементам
Цикл с индексами медленнее и менее читаем. Лучше использовать встроенные функции или итерацию напрямую: for x in big_list:.