Здесь первая строка списка a[0] является списком из чисел [1, 2, 3] . То есть a[0][0] == 1 , значение a[0][1] == 2 , a[0][2] == 3 , a[1][0] == 4 , a[1][1] == 5 , a[1][2] == 6 .

Для обработки и вывода списка, как правило, используют два вложенных цикла. Первый цикл перебирает номер строки, второй цикл бежит по элементам внутри строки. Например, вывести двумерный числовой список на экран построчно, разделяя числа пробелами внутри одной строки, можно так:

Однажды мы уже пытались объяснить, что переменная цикла for в Питоне может перебирать не только диапазон, создаваемый с помощью функции range() , но и вообще перебирать любые элементы любой последовательности. Последовательностями в Питоне являются списки, строки, а также некоторые другие объекты, с которыми мы пока не встречались. Продемонстрируем, как выводить двумерный массив, используя это удобное свойство цикла for :

Естественно, для вывода одной строки можно воспользоваться методом join() :

Используем два вложенных цикла для подсчета суммы всех чисел в списке:

Или то же самое с циклом не по индексу, а по значениям строк:

2. Создание вложенных списков

Пусть даны два числа: количество строк n и количество столбцов m . Необходимо создать список размером n × m , заполненный нулями.

Очевидное решение оказывается неверным:

В этом легко убедиться, если присвоить элементу a[0][0] значение 5 , а потом вывести значение другого элемента a[1][0] — оно тоже будет равно 5. Дело в том, что [0] * m возвращает ccылку на список из m нулей. Но последующее повторение этого элемента создает список из n элементов, которые являются ссылкой на один и тот же список (точно так же, как выполнение операции b = a для списков не создает новый список), поэтому все строки результирующего списка на самом деле являются одной и той же строкой.

В визуализаторе обратите внимание на номер >

Таким образом, двумерный список нельзя создавать при помощи операции повторения одной строки. Что же делать?

Первый способ: сначала создадим список из n элементов (для начала просто из n нулей). Затем сделаем каждый элемент списка ссылкой на другой одномерный список из m элементов:

Другой (но похожий) способ: создать пустой список, потом n раз добавить в него новый элемент, являющийся списком-строкой:

Но еще проще воспользоваться генератором: создать список из n элементов, каждый из которых будет списком, состоящих из m нулей:

В этом случае каждый элемент создается независимо от остальных (заново конструируется список [0] * m для заполнения очередного элемента списка), а не копируются ссылки на один и тот же список.

3. Ввод двумерного массива

Пусть программа получает на вход двумерный массив в виде n строк, каждая из которых содержит m чисел, разделенных пробелами. Как их считать? Например, так:

Или, без использования сложных вложенных вызовов функций:

Можно сделать то же самое и при помощи генератора:

4. Пример обработки двумерного массива

Пусть дан квадратный массив из n строк и n столбцов. Необходимо элементам, находящимся на главной диагонали, проходящей из левого верхнего угла в правый нижний (то есть тем элементам a[i][j] , для которых i==j ) присвоить значение 1 , элементам, находящимся выше главной диагонали – значение 0, элементам, находящимся ниже главной диагонали – значение 2. То есть необходимо получить такой массив (пример для n==4 ):

Рассмотрим несколько способов решения этой задачи. Элементы, которые лежат выше главной диагонали – это элементы a[i][j] , для которых i , а для элементов ниже главной диагонали i>j . Таким образом, мы можем сравнивать значения i и j и по ним определять значение A[i][j] . Получаем следующий алгоритм:

Данный алгоритм плох, поскольку выполняет одну или две инструкции if для обработки каждого элемента. Если мы усложним алгоритм, то мы сможем обойтись вообще без условных инструкций.

Сначала заполним главную диагональ, для чего нам понадобится один цикл:

Затем заполним значением 0 все элементы выше главной диагонали, для чего нам понадобится в каждой из строк с номером i присвоить значение элементам a[i][j] для j = i+1 , . n-1 . Здесь нам понадобятся вложенные циклы:

Аналогично присваиваем значение 2 элементам a[i][j] для j = 0 , . i-1 :

Можно также внешние циклы объединить в один и получить еще одно, более компактное решение:

А вот такое решение использует операцию повторения списков для построения очередной строки списка. i -я строка списка состоит из i чисел 2 , затем идет одно число 1 , затем идет n-i-1 число 0 :

А можно заменить цикл на генератор:

5. Вложенные генераторы двумерных массивов

Для создания двумерных массивов можно использовать вложенные генераторы, разместив генератор списка, являющегося строкой, внутри генератора всех строк. Напомним, что сделать список из n строк и m столбцов можно при помощи генератора, создающего список из n элементов, каждый элемент которого является списком из m нулей:

Но при этом внутренний список также можно создать при помощи, например, такого генератора: [0 for j in range(m)] . Вложив один генератор в другой, получим вложенные генераторы:

Но если число 0 заменить на некоторое выражение, зависящее от i (номер строки) и j (номер столбца), то можно получить список, заполненный по некоторой формуле.

Например, пусть нужно задать следующий массив (для удобства добавлены дополнительные пробелы между элементами):

В этом массиве n = 5 строк, m = 6 столбцов, и элемент в строке i и столбце j вычисляется по формуле: a[i][j] = i * j .

Для создания такого массива можно использовать генератор:

Массивом в языке Python называется упорядоченная структура данных, которая используется для хранения однотипных объектов. По своему функциональному назначению они схожи со списками, однако обладают некоторыми ограничениями на тип входных данных, а также их размер. Несмотря на такую особенность, массивы являются достаточно функциональным инструментом по работе с наборами данных в языке программирования Python.

Создание и заполнение

Перед тем как добавить (создать) новый массив в Python 3, необходимо произвести импорт библиотеки, отвечающей за работу с таким объектом. Для этого потребуется добавить строку from array import * в файл программы. Как уже было сказано ранее, массивы ориентированы на взаимодействие с одним постоянным типом данных, вследствие чего все их ячейки имеют одинаковый размер. Воспользовавшись функцией array, можно создать новый набор данных. В следующем примере демонстрируется заполнение массива Python — запись целых чисел при помощи метода, предложенного выше.

Как можно заметить, функция array принимает два аргумента, первым из которых становится тип создаваемого массива, а на месте второго стоит начальный список его значений. В данном случае i представляет собой целое знаковое число, занимающее 2 байта памяти. Вместо него можно использовать и другие примитивы, такие как 1-байтовый символ (c) или 4-байтовое число с плавающей точкой (f).

Обратиться к элементу можно при помощи квадратных скобок, к примеру, data[2].

Добавление элемента

Чтобы добавить новый элемент в массив Python необходимо воспользоваться методом insert. Для этого потребуется вызвать его через созданный ранее объект и ввести в качестве аргументов два значения. Первое (4) отвечает за индекс нового элемента в массиве, то есть место, куда его следует поместить, а второе (3) представляет собой само значение.

Стоит помнить, что добавить в массив можно только данные того типа, к которому относится ранее созданный объект. При выполнении подобной операции количество доступных ячеек увеличивается согласно текущим потребностям программы.

Удаление элемента

В Python удалить ненужные элементы из массива можно при помощи метода pop, аргументом которого является индекс ячейки (3). Как и в случае с добавлением нового элемента, метод необходимо вызвать через ранее созданный объект, как это показано в примере.

После выполнения данной операции содержимое массива сдвигается так, чтобы количество доступных ячеек памяти совпадало с текущим количеством элементов.

Вывод

При работе с любыми данными в программе время от времени возникает необходимость в их проверке, что можно легко осуществить с помощью вывода на экран. Выполнить подобное действие поможет функция под названием print. Она принимает в качестве аргумента один из элементов созданного и заполненного ранее массива. В следующем примере его обработка производится при помощи цикла for, где каждый элемент массива data получает временный идентификатор i для передачи в упомянутый ранее метод print.

Результатом работы приведенного выше кода является вывод массива Python — перебор всех присвоенных ранее целочисленных значений и поочередный вывод в один столбец.

Получение размера

Поскольку размерность массива может меняться во время выполнения программы, иногда бывает полезным узнать текущее количество элементов, входящих в его состав. Функция len служит для получения длины (размера) массива в Python в виде целочисленного значения. Чтобы отобразить в Python количество элементов массива на экране стоит воспользоваться методом print.

Как видно из представленного выше кода, функция print получает в качестве аргумента результат выполнения len, что позволяет ей вывести числовое значение в консоль.

Двумерный массив

В некоторых случаях для правильного представления определенного набора информации обычного одномерного массива оказывается недостаточно. В языке программирования Python 3 двумерных и многомерных массивов не существует, однако базовые возможности этой платформы легко позволяют построить двумерный список. Элементы подобной конструкции располагаются в столбцах и строках, заполняемых как это показано на следующем примере.

Здесь можно увидеть, что основная идея реализации двумерного набора данных заключается в создании нескольких списков d2 внутри одного большого списка d1. При помощи двух циклов for происходит автоматическое заполнение нулями матрицы с размерностью 5×5. С этой задачей помогают справляться методы append и range, первый из которых добавляет новый элемент в список (0), а второй позволяет устанавливать его величину (5). Нельзя не отметить, что для каждого нового цикла for используется собственная временная переменная, выполняющая представление текущего элемента внешнего (j) или внутренних (i) списков. Обратиться к нужной ячейке многомерного списка можно при помощи указания ее координат в квадратных скобках, ориентируясь на строки и столбцы: d1[1][2].

Многомерный массив

Как и в случае с двумерным массивом, представленным в виде сложного списка, многомерный массив реализуется по принципу «списков внутри списка». Следующий пример наглядно демонстрирует создание трехмерного списка, который заполняется нулевыми элементами при помощи трех циклов for. Таким образом, программа создает матрицу с размерностью 5×5×5.

Аналогично двумерному массиву, обратиться к ячейке построенного выше объекта можно с помощью индексов в квадратных скобках, например, d1[4][2][3].

Заключение

Для взаимодействия с наборами данных одного типа в языке программирования Python, как правило, используются массивы. Стандартная библиотека платформы позволяет достаточно эффективно работать с подобной структурой, предоставляя возможность манипулировать ее содержимым при помощи соответствующих функций. Кроме того, в Python поддерживается многомерное представление списков без ограничений на количество уровней.

Как реализовать ввод (с клавиатуры) и вывод двумерного массива в виде таблицы в Python?

Я начал изучать питон, но столкнулся с проблемой: не могу освоить ввод и вывод двумерного массива. Помогите, пожалуйста. Спасибо.

3 ответа 3

Есть еще вариант использовать коллекцию с кортежем в качестве индекса:

Вывести в виде таблицы можно так:

Чтобы прочитать числа, разделёнными пробелами, из стандартного ввода в numpy массив:

Если в строке больше одного числа, то двумерный массив автоматически создаётся (каждая строка это ряд), иначе можно вызвать a.reshape(5, -1) , чтобы 2D массив получить.

Чтобы создать 2D Питон список для того же ввода:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками python массивы или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.11.15.35459