Умскул учебник стремится стать лучше! Если вы наткнулись на ошибку или неточность в нашем материале - просто сообщите нам, мы будем благодарны!
Информатика

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

15.12.2022
1582

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

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

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

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

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

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

Понравилась статья? Оцени:
Читайте также:

Читать статьи — хорошо, а готовиться к экзаменам
в самой крупной онлайн-школе — еще эффективнее.

50 000
Количество
учеников
1510
Количество
стобальников
>15000
Сдали на 90+
баллов