Работа с массивами в Python
На этой странице вы узнаете
- Как связаны массивы и ваш рюкзак?
- Почему список в большинстве случаев — лучшее решение?
- А не пора ли нам в «Матрицу»?
Пользуетесь ли вы списками? В наше время встречаются настоящие фанатики, которые используют списки буквально для всего. Действительно, они упрощают нашу жизнь и помогают не забывать про важные задачи. Главное, вовремя остановиться!
Однако списки используются не только в повседневной жизни, но и в программировании. В этой статье мы поговорим о супер-героях мира структурированной информации — о массивах. А еще как Нео научимся управлять матрицей… или создадим свою.
Определение массива и его виды
К этому моменту мы с вами уже познакомились с тем, что такое переменные, какие у них бывают виды и для чего они нужны. Всю эту ценную информацию мы разобрали в статье «Основы программирования на языке Python. Часть 1».
Одна переменная — это хорошо. Но что, если нам нужно хранить целый набор связанных друг с другом данных? Хотелось бы, чтобы они лежали рядом друг с другом, не потерялись, а у нас был доступ как ко всем сразу, так и к некоторым по отдельности. Выход есть: массивы.
Массив — это структура, которая содержит в себе целый набор других значений.
Как связаны массивы и ваш рюкзак? Загляните в свой рюкзак. Там вы, возможно, найдете учебники, книги, канцелярию и еще какие-то вещи, о которых сложно догадаться. В данном случае ваш рюкзак выступает в роли массива — хранилища для чего-нибудь еще. |
При этом массив в Python — это скорее собирательный термин. Есть несколько его видов, которые отличаются возможностями и функционалам. Общие черты у всех, конечно, есть:
- Все они в том или ином виде хранят в себе различные значения — например, числа или текст.
- Значения внутри массива могут быть различных типов данных. Их мы разбирали в статье «Основы программирования на языке Python. Часть 1».
- Как и символы строкового типа данных, который мы обсуждали в статье «Работа со строками в Python», большая часть массивов тем или иным образом индексируются. То есть мы можем получить элементы массива, ссылаясь на их индекс (порядковый номер).
Какие есть основные виды массивов в Python?
- Список (list) — самый простой и удобный пример массива, которым, скорее всего, вы будете пользоваться часто. Его элементы индексируются числами, начиная с 0. Свой размер он может менять прямо по ходу программы: мы можем как добавлять в него новые элементы, так и удалять или изменять старые.
Например, a = [1, 2, 3, ‘rs’].
- Кортеж (tuple) — отличается от списка только тем, что имеет фиксированный размер. После его создания мы не сможем ни добавить в него что-нибудь, ни удалить.
Например, a = (1, 2, 3, ‘rs’).
- Множество (set) — этот тип данных не индексируется, но изменяется. В него можно добавлять элементы и удалять их из него. Его главная фишка — он автоматически поддерживает уникальность элементов внутри себя. Если попробовать добавить в него элемент, который в нем уже есть, ничего не произойдет. Также все его элементы заранее отсортированы по возрастанию.
Например, a = (1, 2, 3, ‘rs’).
- Словарь (dict) — это массив, в котором все данные хранятся в виде пары <ключ> : <значение>. Благодаря этому доступ к значениям производится не по числовым индексам от 0, а по указанным нами ключам. Проще говоря, вместо индексов от 0 до скольки угодно мы ставим свои, которые могут принимать любой вид — допустим, произвольное значение.
Например, a = {1 :1, 1: 2, 2: 3, 3: 4, «rs»: 5}.
Кроме этих видов массивов существует еще несколько. Но этих нам уже хватит для решения абсолютного большинства поставленных перед нами задач.
По отдельности мы начнем их рассматривать по мере необходимости, а пока давайте обсудим тот, к которому мы будем прибегать чаще всего — список.
Работа со списками
Почему список в большинстве случаев — лучшее решение? Это удобно. Он является очень гибким, легко изменяемым, сортируемым и индексируемым. Универсальная отвертка для любого шурупа. |
Как создать список?
- Чтобы создать пустой список, к его имени приравнивается команда list() или пустые квадратные скобки []:
Примеры пустого списка:
a = list()
b = []
- Чтобы создать список с какими-то начальными значениями, прописываем их в квадратных скобках через запятую. Такой записью можно как получить значение, так и изменить его.
Пример списка с пятью числами:
c = [1, 2, 3, 4, 5]
Получать элементы списка можно по их индексам, которые прописываются в квадратных скобках после имени списка.
Например:
c = [1, 2, 3, 4, 5]
elem = c[0]
print(elem)
Вывод: 1
Как и строки, списки поддерживают срезы — последовательность символов, индексы границ которой указываются так: с первого значения включительно по второе не включительно. Подробнее об этом и некоторых других используемых нами сейчас понятиях и терминах можно прочитать в статье «Работа со строками в Python».
Например:
c = [1, 2, 3, 4, 5]
print(c[1:3])
Вывод: [2, 3]
В этом примере мы попросили программу вывести элементы с индексами от 1 до 3. Первый элемент у нас получился 2, так как отсчет элементов в массиве начинается с нуля.
Также мы указали 3 как конец среза, но у нас не вывелось число 4, имеющее в массиве индекс 3. Конечный элемент берется на 1 меньше по индексу (аналогично с циклом for), поэтому несмотря на то, что наш срез показывает диапазон от 1 до 3, мы выводим только первый и второй элементы по индексу из массива.
Какие есть инструменты для работы со списком?
- len(<список>) — считает количество элементов в списке. Давайте посчитаем количество элементов в списке а:
a = [8, 45, 16, 34, -2, 0, 8, 8]
l = len(a)
print(l)
Вывод: 8
- min(<список>) — находит минимальный элемент списка.
a = [8, 45, 16, 34, -2, 0, 8, 8]
l = min(a)
print(l)
Вывод: -2
- max(<список>) — возвращает максимальный элемент списка.
a = [8, 45, 16, 34, -2, 0, 8, 8]
l = max(a)
print(l)
Вывод: 45
- <список>.append(<значение>) — заносит значение в конец списка.
a = [8, 45, 16, 34, -2, 0, 8, 8]
a.append(123)
print(a)
Вывод: [8, 45, 16, 34, -2, 0, 8, 8, 123]
- del <список>[<индекс>] — удаляет элемент из списка по его индексу. Напомним: нумерация элементов списка начинается с нуля.
a = [8, 45, 16, 34, -2, 0, 8, 8]
del a[5]
print(a)
Вывод: [8, 45, 16, 34, -2, 8, 8]
- <список>.remove(<значение>) — удаляет элемент из списка по его значению. Если в списке несколько элементов с этим значением, удаляет первый из них, остальные не трогает.
a = [8, 45, 16, 34, -2, 0, 8, 8]
a.remove(8)
print(a)
Вывод: [45, 16, 34, -2, 0, 8, 8]
- <список>.sort() — сортирует список по возрастанию. Работает только в том случае, если в списке все элементы имеют одинаковый тип данных.
a = [8, 45, 16, 34, -2, 0, 8, 8]
a.sort()
print(a)
Вывод: [-2, 0, 8, 8, 8, 16, 34, 45]
- <список>.sort(reverse = True) — такая запись отсортирует список по убыванию.
a = [8, 45, 16, 34, -2, 0, 8, 8]
a.sort(reverse = True)
print(a)
Вывод: [45, 34, 16, 8, 8, 8, 0, -2]
- <список>.count(<значение>) — подсчитывает количество заданных элементов в списке.
a = [8, 45, 16, 34, -2, 0, 8, 8]
c = a.count(8)
print(c)
Вывод: 3
- <список>.copy() — такая запись скопирует список.
a = [4, 7, 8]
b = a.copy()
print(b)
Вывод: [4, 7, 8]
- <список>.copy() [<индекс начала>:<индекс конца + 1>] — можно скопировать только часть элементов с помощью среза.
a = [2, 7, 8]
b = a.copy()[2:]
print(b)
Вывод: 8
Парочка лайфхаков по заполнению списка:
- Если нужно создать список, который будет состоять из определенного количества одинаковых элементов, при его создании можно воспользоваться знаком умножения (*).
Например:
a = [0] * 7
print(a)
Вывод: [0, 0, 0, 0, 0, 0, 0]
- Python — достаточно гибкий язык, в нем возможно внести цикл заполнения массива прямо в него.
Заполнение массива числами из диапазона от 1 до 9 в цикле: | Та же логика, но другая запись: |
a = [] for i in range(10): a.append(i) | a = [i for i in range(10)] |
Здесь i в диапазоне от 0 до 9 с помощью метода append() добавляется в массив. | Здесь массив будет заполнен числами i, где i перебирается по диапазону от 0 до 9. Результат будет точно такой же. |
В обоих случаях результат будет один и тот же:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Более того, с заполняемыми элементами сразу можно производить действия.
Давайте заполним массив квадратами чисел из того же диапазона. Для этого мы будем использовать операцию возведения в степень (**). На всякий случай напомним: квадрат числа — это число в степени 2.
a = [] for i in range(10): a.append(i ** 2) | a = [i ** 2 for i in range(10)] |
В обоих случаях результат будет один и тот же:
a = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Последовательность чисел
Массивы используются для того, чтобы упорядочить большие объемы информации, поэтому обычно мы сталкиваемся с массивами при работе с последовательностями чисел.
Последовательность чисел – это упорядоченный набор чисел, в котором у каждого числа есть свой порядковый номер.
Для работы с последовательностями чисел в Python нужно знать, как их правильно считывать. Здесь нам понадобится цикл for и пустой массив, который мы уже научились создавать.
1.Сначала нужно открыть файл с помощью функции open():
f = open(“имя файла”)
2. Создаем пустой массив:
numbers = []
3. С помощью цикла for считываем каждую строку, переводим ее в целочисленный вид и добавляем в массив numbers:
for s in f:
numbers.append(int(s))
Теперь все числа из файла находятся в массиве, в котором у каждого числа есть свой порядковый номер. Это поможет нам решить любую задачу, связанную с последовательностями. В этом можно убедиться на практике.
Разберем экзаменационный вариант задачи с анализом массива, который может встретиться вам в номере 17 ЕГЭ по информатике.
В файле с названием 1.txt находится ряд целых чисел. Элементы данного ряда могут принимать целые значения в диапазоне [-10000; 10000]. Определите количество пар элементов, произведение которых четно, затем максимальную из сумм элементов таких пар.
Нужно учитывать, что для данной задачи пара элементов — это два элемента последовательности, идущие подряд. Ответ запишите без пробела, сначала количество, затем максимальную сумму.
В случае, если в ответе одно или несколько чисел оказались отрицательными, знак минус оставляем, например, 127-18256.
Файл: 1.txt
Решение на языке программирования Python:
1) Откроем файл с помощью функции open():
f = open(«1.txt»)
2) Введем два массива: в одном массиве будут находиться все числа из файла, а второй будет предназначен для сумм подходящих пар:
a = []
pair = []
3) С помощью конструкции for s in f считаем каждую строчку файла. Считанное число необходимо привести к целочисленному типу (int) и добавить в массив:
for s in f:
a.append(int(s))
4) После того, как все числа были добавлены в массив, проходимся по ним и ищем подходящие под условия пары.
Важный момент: чтобы не выйти за пределы массива (обратиться к элементу, которого в списке нет), нужно указать перебор i до len(название_массива)-1.
for i in range(len(a)-1):
if (a[i] * a[i+1]) % 2 == 0:
5) Если пара подходит под условие, во второй массив добавляем сумму чисел:
pair.append(a[i] + a[i+1])
6) После завершения цикла выводим количество пар через len() и максимальную сумму через max():
print(len(pair), max(pair))
Полный код программы:
f = open(«1.txt»)
a = []
pair = []
for s in f:
a.append(int(s))
for i in range(len(a)-1):
if (a[i] * a[i+1]) % 2 == 0:
pair.append(a[i] + a[i+1])
print(len(pair), max(pair))
Ответ: 381319496
Внимание, вопрос: если мы говорили, что список может хранить в себе любые типы данных, а сам список — это тоже тип данных, может ли список хранить другие списки?
Многомерные массивы (матрицы)
Так что будет, если добавить в список другие списки?
Эту ситуацию снова можно сравнить с рюкзаком. Допустим, в свой рюкзак вы положите не просто канцелярию, а канцелярию, разложенную по разным пеналам. Теперь у вас есть один большой массив — это рюкзак, хранящий много массивов поменьше — пеналов, а в пеналах уже и лежат наши ручки и карандаши.
Неужели что-то может помешать нам засунуть в рюкзак несколько пеналов? Нет, конечно.
Конструкция списка из списков называется многомерным списком.
А не пора ли нам в «Матрицу»? Как в примере с пеналами, если внешний список состоит из списков, в которых уже находятся обычные значения, то этот внешний список называется двумерным списком или матрицей. Существуют также трехмерные, четырехмерные и другие списки. Но на практике они используются редко. Очень-очень редко. |
Матрица — это структура данных в двумерном массиве, в которой числа расположены в виде строк и столбцов, как в таблице.
Для создания матрицы внутри одних квадратных скобок через запятую прописываются другие, в которых уже располагаются значения.
Например:
m = [[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15]]
По одному индексу матрицы мы сможем получить внутренний список, допустим:
m[1] = [6, 7, 8, 9, 10]. Заметим, что нам выдается вторая строка, так как отсчет начинается с нуля.
Чтобы получить само значение элемента, к которому мы обращаемся по индексу, нам надо прописать сначала индекс внешнего списка, а потом индекс внутреннего списка.
Например:
- m[0][0] — 1;
- m[0][2] — 3;
- m[2][0] — 11.
Двумерные массивы также сортируются по возрастанию, только уже по значению вложенных списков. Сначала сравниваются все первые элементы вложенных списков, затем, если первые равны, то вторые и т.д.:
a = [[2, 7, 8], [3, 8, 9], [11, 1, 1], [2, 1, 1]]
a.sort()
print(a)
Вывод: [[2, 1, 1], [2, 7, 8], [3, 8, 9], [11, 1, 1]]
В экзаменационных заданиях многомерные массивы встречаются и в составе более сложных задач, для решения которых нужны знания других тем: например, навык работы с кортежами и множествами. Но мы не будем унывать и научимся применять на практике то, что мы изучили в этой статье. Для этого разберем еще одну задачу с анализом массива.
Дана программа:
A = [[8, 4, 3, 4, 7],[2, 1, 5, 9, 3]]
s = 0
for i in range(2):
for j in range(5):
if A[i][j] >= 4:
s = jprint(s)
Какое число данная программа выведет на экран?
Решение.
Заметим, что цикл i содержит всего 2 массива, а цикл j перебирает числа в диапазоне [0; 4] внутри каждого вложенного массива. Затем программа перебирает каждый элемент списка в цикле, и если элемент больше или равен 4, то его индекс сохраняется в переменной s.
Теперь найдем последний элемент, который больше или равен 4. В данном списке этим элементом является число 9. Индекс данного элемента равен 3 (напомним, что индексация элементов списка начинается с 0, а также не стоит забывать, что у нас два вложенных списка).
Ответ: 3.
В этой статье мы познакомились в основными видами массивов, научились создавать списки и матрицы. Но если вы захотите узнать больше про другие виды массивов — кортежи, множества и словари, а также добавить в свою жизнь немного волшебства, приглашаем вас в статью «Практика работы с массивами».
Термины
Переменная — это ячейка в памяти компьютера, которая хранит имя и определенное значение: например, число или какой-то текст.
Строковый тип данных — тип данных, хранящий в себе набор символов произвольной длины, иными словами, любой текст.
Типы данных — виды значений, которые может принимать переменная.
Цикл (циклическая операция) — это многократное повторение определенной команды или набора команд. Для выделения тела цикла используется табуляция.
Цикл for — это цикл, который используется для выполнения команды или набора команд определенное количество раз или для перебора набора данных.
Фактчек
- Массив — это структура, которая содержит в себе набор других значений.
- В языке Python есть несколько видов массивов со своими особенностями. Среди них: списки, кортежи, множества и словари.
- Чаще всего в работе встречаются именно списки за счет их гибкости и простоты работы.
- Многомерные массивы — это массивы, которые хранят в себе другие массивы. В абсолютном большинстве ситуаций необходимость возникает только в двумерных массивах, которые также называются матрицами.
Проверь себя
Задание 1.
При исходном списке a = [2, 3, 4, 0, 0, 1] выберите соответствующий результат для соответствующей команды:
Задание 2.
При исходном списке a = [2, 3, 4, 0, 0, 1] выберите соответствующий результат для соответствующей команды:
Задание 3.
Что такое матрица?
- Хорошая трилогия фильмов.
- Любой многомерный массив.
- Двумерный массив.
- Четырехмерный массив.
Ответы: 1. — 1В, 2А, 3Е; 2. — 1Г, 2Д, 3Б, 4Ж; 3. — 3.