Как ввести двумерный массив в Python с клавиатуры

Обновлено: 23.11.2024

Массив массивов называется двумерным массивом. Двумерный (2D) массив в программировании на C также известен как матрица. Матрица может быть представлена ​​в виде таблицы строк и столбцов. Прежде чем мы подробнее обсудим двумерный массив, давайте взглянем на следующую программу на C.

Пример простого двумерного (2D) массива

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

Инициализация 2D-массива

Есть два способа инициализировать двумерные массивы во время объявления.

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

Что необходимо учитывать при инициализации двумерного массива

Мы уже знаем, что когда мы инициализируем обычный массив (или, можно сказать, одномерный массив) во время объявления, нам не нужно указывать его размер. Однако это не относится к 2D-массиву, вы всегда должны указывать второе измерение, даже если вы указываете элементы во время объявления. Давайте разберемся с этим на нескольких примерах –

Как сохранить введенные пользователем данные в 2D-массив

Мы можем рассчитать, сколько элементов может содержать двумерный массив, используя следующую формулу:
Массив arr[n1][n2] может содержать n1*n2 элементов. Массив, который у нас есть в приведенном ниже примере, имеет размеры 5 и 4. Эти измерения известны как индексы. Таким образом, этот массив имеет значение первого нижнего индекса, равное 5, и значение второго нижнего индекса, равное 4.
Таким образом, массив abc[5][4] может иметь 5*4 = 20 элементов.

Для хранения элементов, введенных пользователем, мы используем два цикла for, один из которых является вложенным циклом. Внешний цикл выполняется от 0 до (первый индекс -1), а внутренний цикл for выполняется от 0 до (второй индекс -1). Таким образом, порядок, в котором пользователь вводит элементы, будет следующим: abc[0][0], abc[0][1], abc[0][2]… и так далее.

В приведенном выше примере у меня есть двумерный массив abc целочисленного типа. Концептуально вы можете визуализировать приведенный выше массив следующим образом:

Однако фактическое представление этого массива в памяти будет примерно таким:

Указатели и двумерный массив

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

Таким образом, abc[0] будет иметь адрес первого элемента первой строки (если мы рассмотрим приведенную выше диаграмму номер 1).
аналогично abc[1] будет иметь адрес первого элемента второй строки. Чтобы лучше понять это, давайте напишем программу на C –

Фактическое представление адреса должно быть в шестнадцатеричном формате, для которого мы используем %p вместо %d, как указано в комментариях. Это просто для того, чтобы показать, что элементы хранятся в смежных ячейках памяти. Вы можете связать вывод с диаграммой выше, чтобы увидеть, что разница между этими адресами на самом деле является количеством байтов, потребляемых элементами этой строки.

Адреса, показанные в выходных данных, принадлежат первому элементу каждой строки abc[0][0], abc[1][0], abc[2][0], abc[3][0] и abc. [4][0].

Я попытался создать этот код для ввода матрицы m на n. Я намеревался ввести [[1,2,3],[4,5,6]], но код дает [[4,5,6],[4,5,6] . То же самое происходит, когда я ввожу другую матрицу m на n, код выдает матрицу m на n, строки которой идентичны.

Возможно, вы поможете мне найти ошибку в моем коде.

16 ответов 16

Проблема на этапе инициализации.

Этот код фактически заставляет каждую строку вашей матрицы ссылаться на один и тот же объект столбцов. Если какой-либо элемент в любом столбце изменится, все остальные столбцы изменятся:

Вы можете инициализировать свою матрицу во вложенном цикле, например:

или, в одну строку, используя понимание списка:

Надеюсь, это поможет.

таким образом вы можете принять двумерный список в Python.

где n — это количество элементов в столбцах, а m — это отсутствие элементов в строке.

В pythonic это создаст список из списков

Если ввод отформатирован таким образом,

можно использовать один вкладыш

пояснение с примером:

  1. input() принимает на вход строку. "1 2 3"
  2. split() разбивает строку по пробелам и возвращает
    список строк. ["1", "2", "3"]
  3. list(map(int, . )) преобразует/сопоставляет список строк в список целых чисел. [1, 2, 3]
  4. Все эти шаги выполняются строка раз, и эти списки сохраняются в другом списке. [[1, 2, 3], [4, 5, 6], [7, 8, 9]], строка = 3

Если вы хотите взять n строк ввода, где каждая строка содержит m целых чисел, разделенных пробелами, например:

Тогда вы можете использовать:

Затем напечатайте все, что хотите, для приведенного выше ввода:

O/P будет равно 5 для индексации на основе 0

Помимо принятого ответа, вы также можете инициализировать свои строки следующим образом: matrix[i] = [0]*n

Поэтому следующий фрагмент кода будет работать —

Этот код получает количество строк и столбцов от пользователя, затем берет элементы и отображает их в виде матрицы.

Если ваша матрица представлена ​​в виде строк, как показано ниже, где размер равен s*s, здесь s=5 5 31 100 65 12 18 10 13 47 157 6 100 113 174 11 33 88 124 41 20 140 99 32 111 41 20

тогда вы можете использовать это

ваша матрица будет 'arr'

matrix = [[int(j) для j в input().split()[:n]] для i в диапазоне(m)]

для i в матрице:print(i)

Вы можете сделать любой размер списка

вывод:

Создание матрицы с предварительно заполненными числами можно выполнить с помощью понимания списка. Это может быть трудно читать, но это работает:

с 2 строками и 3 столбцами матрица будет [[1, 2, 3], [4, 5, 6]], с 3 строками и 2 столбцами матрица будет [[1, 2], [3, 4 ], [5, 6]] и т. д.

Ввод: 1 2 3 4 5 6 7 8 9

Примечание: этот код используется в случае контроля. Это только контрольный номер. Из строк, но мы можем ввести любое количество столбцов, которые захотим, т.е. строка [0] = 2, поэтому будьте осторожны. Это не тот код, в котором вы можете контролировать количество столбцов.

ввод

Вывод [[1, 2, 3], [4, 5, 6]]

Я использовал библиотеку numpy, и она отлично работает. Это всего лишь одна строка, и ее легко понять. Ввод должен быть одного размера, разделенного пробелом, а изменение формы преобразует список в желаемую форму. Здесь (2,2) изменяет размер списка из 4 элементов в матрицу 2 * 2. Будьте осторожны, указывая одинаковое количество элементов во входных данных, соответствующих размерности матрицы.

1. Вложенные списки: обработка и печать

В реальных задачах часто приходится хранить прямоугольные таблицы данных. [подробнее об этом!] Такие таблицы называются матрицами или двумерными массивами. В Python любая таблица может быть представлена ​​как список списков (список, где каждый элемент, в свою очередь, является списком). Например, вот программа, которая создает числовую таблицу с двумя строками и тремя столбцами, а затем производит с ней некоторые манипуляции:

Первый элемент здесь — a[0] — это список чисел [1, 2, 3] . Первый элемент этого нового списка — это [0][0] == 1 ; кроме того, a[0][1] == 2 , a[0][2] == 3 , a[1][0] == 4 , a[1][1] == 5 , a[1] [2] == 6 .

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

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

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

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

Или то же самое с перебором по элементам, а не по переменным i и j :

2. Вложенные списки: создание

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

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

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

С помощью нашего визуализатора отслеживайте идентификаторы списков. Если два списка имеют один и тот же номер идентификатора, это фактически один и тот же список в памяти.

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

Возможный способ: вы можете создать список из n элементов (скажем, из n нулей), а затем сделать каждый из элементов ссылкой на другой одномерный список из m элементов:

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

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

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

3. Как вводить двумерный массив?

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

Или, без использования сложных вложенных вызовов:

То же самое можно сделать с генераторами:

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

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

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

Этот алгоритм медленный: он использует два цикла и для каждой пары (i,j) выполняет одну или две инструкции if. Если мы усложним алгоритм, то сможем обойтись без условного оператора.

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

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

По аналогии, для j = 0 , . i-1 установить элементы a[i][j] равными 2 :

Вы можете объединить весь этот код и получить другое решение:

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

сообщить об этом объявлении

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

Массив символов называется строкой. «Привет», «Привет» и т. д. являются примерами String. Точно так же массив строк представляет собой не что иное, как двумерный (2D) массив символов. Чтобы объявить массив строк в C, мы должны использовать тип данных char.

Примером двумерных символов или массива строк является

Объявление массива строк

Синтаксис:-

Здесь первый индекс (размер строки) указывает максимальное количество строк в массиве, а второй индекс (размер столбца) указывает максимальную длину каждой отдельной строки.

Например, char language[5][10] ; В массиве «язык» мы можем хранить не более 5 строк, и каждая строка может содержать не более 10 символов.

В языке C каждый символ занимает 1 байт памяти. Для массива «язык» будет выделено 50 байт (1*5*10) памяти. Где каждая строка будет иметь 10 байт (1*10) памяти.

Инициализация массива строк

Двумерные (2D) строки на языке C можно инициализировать напрямую, как показано ниже,

Двумерный (2D) массив строк в C также может быть инициализирован как,

Поскольку это двухмерный набор символов, поэтому каждая строка (одномерный массив символов) должна заканчиваться нулевым символом, т. е. ‘\0’

Второй способ объявления массива строк — это длительный процесс, и другие программисты не могут легко их прочитать по сравнению с предыдущим объявлением, поэтому в большинстве случаев мы предпочитаем первое объявление.

Каждая строка в этом массиве доступна по ее порядковому номеру. Индекс массива всегда начинается с 0.

Примечание 1: количество символов (размер столбца) должно быть объявлено во время инициализации двумерного массива строк.

Но следующие объявления недействительны.

Примечание 2. После инициализации массива строк мы не можем напрямую назначить новую строку.

Чтение и отображение двухмерного массива строк в C

Двумерный массив строк можно прочитать с помощью циклов. Для чтения мы можем использовать scanf(), gets(), fgets() или любые другие методы для чтения строки.

Двумерный массив строк можно отобразить с помощью циклов. Для отображения мы можем использовать printf(), puts(), fputs() или любые другие методы для отображения строки.

Пример программы для чтения двумерного массива символов или массива строк в C

Программа. Напишите программу для чтения и отображения двумерного массива строк на языке C.

Введите количество имен (

Подпишитесь на нас

сообщить об этом объявлении

Читайте также: