Умскул Учебник
Информатика

Работа с массивами в Python

13,960

На этой странице вы узнаете

  • Как связаны массивы и ваш рюкзак?
  • Почему список в большинстве случаев — лучшее решение?
  • А не пора ли нам в «Матрицу»?

Пользуетесь ли вы списками? В наше время встречаются настоящие фанатики, которые используют списки буквально для всего. Действительно, они упрощают нашу жизнь и помогают не забывать про важные задачи. Главное, вовремя остановиться!

Однако списки используются не только в повседневной жизни, но и в программировании. В этой статье мы поговорим о супер-героях мира структурированной информации — о массивах. А еще как Нео научимся управлять матрицей… или создадим свою. 

Определение массива и его виды

К этому моменту мы с вами уже познакомились с тем, что такое переменные, какие у них бывают виды и для чего они нужны. Всю эту ценную информацию мы разобрали в статье «Основы программирования на языке 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


Парочка лайфхаков по заполнению списка:

  1. Если нужно создать список, который будет состоять из определенного количества одинаковых элементов, при его создании можно воспользоваться знаком умножения (*). 

Например: 


a = [0] * 7
print(a)


Вывод: [0, 0, 0, 0, 0, 0, 0]


  1. 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. Хорошая трилогия фильмов.
  2. Любой многомерный массив.
  3. Двумерный массив.
  4. Четырехмерный массив.

Ответы: 1. — 1В, 2А, 3Е; 2. — 1Г, 2Д, 3Б, 4Ж; 3. — 3.

Актуальное:
Зачем?