Как список преобразовать в двумерный массив python
Перейти к содержимому

Как список преобразовать в двумерный массив python

  • автор:

Генераторы двумерных массивов

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

[ [0] * m for i in range(n)]

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

[ [0 for j in range(m)] for i in range(n)]

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

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

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

0 0 0 0 0 0 0 1 2 3 4 5 0 2 4 6 8 10 0 3 6 9 12 15 0 4 8 12 16 20

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

Ответом на это задание будет выражение:

[[ i * j for j in range(m)] for i in range(n)]

Ответ, содержащий заданное выражение, нужно ввести в поле ввода (лучше — скопировав из работающей программы). В выражении должны использоваться переменные n и m , означающие число строк и столбцов в массиве. Если в задании сказано, что массив — квадратный, то число строк и столбцов в нем равно n , а значение m не определено и использовать его нельзя.

Использование логических выражений в генераторах

Есть несколько способов использовать в генераторах логические выражения, то есть аналоги условий.

Тернарный оператор

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

Синтаксис тернарного оператора:

знач1 if условие else знач2

Тернарный оператор проверяет условие, если оно истино, то возвращает знач1, иначе возвращается знач2.

Пример вычисления максимума из значений a и b.

print(a if a > b else b)

Приведение типов

Иногда оказывается удобным явно или неявно приводить логические типы к int и наоборот. В этом случае действуют следующие правила.

При приведении значений типа bool к типу int значение True переводится в 1, значение False переводится в 0. Такое преобразование может быть выполнено явно при помощи функции int , или оно выполняется неявно если значение типа bool используется в арифметических операциях. Например, выражение (x > 0) + (y > 0) + (z > 0) позволяет определить, сколько среди чисел x, y, z положительных.

Это позволяет также конструировать аналоги логических выражений. Например, максимум из чисел a и b можно найти так:

print(a * (a > b) + b * (a 

В этом примере если (a > b) , то первое слагаемое будет равно a, а второе слаемое будет равно 0. Если же (a , то первое слагаемое будет 0, а второе будет равно b.

При приведении значения типа int к типу bool число 0 переводится в False , а ненулевые числа переводятся в True . При переводе строк и списков к типу bool пустые строки и списки приводятся к значению False , а непустые — к True .

Интересны правила применения логических операций and и or к выражениям нелогического типа. Здесь применяются правила неполного вычисления логических выражений. Для операции and сначала вычисляется значение левого операнда. Если левый операнд приводится к логическому False (то есть имеет значение False , 0, является пустой строкой или пустым списком), то возвращается значение левого операнда. Иначе возвращается значение правого операнда. Аналогично работает операция or : если значение левого операнда True , неотрицательное число, непустая строка или список, то возвращается значение левого операнда, иначе возвращается значение правого операнда.

Упражнения

0: Таблица умножения

Заполните массив таблицей умножения по правилу A[i][j] = i * j .

Пример для n = 5 , m = 6 .

0 0 0 0 0 0 0 1 2 3 4 5 0 2 4 6 8 10 0 3 6 9 12 15 0 4 8 12 16 20

A: Номера строк

Заполните массив, записав в каждом элементе номер строки, в которой он находится.

Пример для n = 5 , m = 6 .

0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4

B: Номера столбцов

Заполните массив, записав в каждом элементе номер столбца, в котором он находится.

Пример для n = 5 , m = 6 .

0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5

C: Слева направо, сверху вниз

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

Пример для n = 5 , m = 6 .

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

D: Сверху вниз, слева направо

Заполните массив целыми числами начиная с нуля по столбцам, сверху вниз, столбцы обходятся слева направо.

Пример для n = 5 , m = 6 .

0 5 10 15 20 25 1 6 11 16 21 26 2 7 12 17 22 27 3 8 13 18 23 28 4 9 14 19 24 29

E: Снизу вверх, слева направо

Заполните массив целыми числами начиная с нуля по столбцам, снизу вверх, столбцы обходятся слева направо.

Пример для n = 5 , m = 6 .

4 9 14 19 24 29 3 8 13 18 23 28 2 7 12 17 22 27 1 6 11 16 21 26 0 5 10 15 20 25

F: Справа налево, снизу вверх

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

Пример для n = 5 , m = 6 .

29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

G: Квадраты-1

Заполните квадратный массив целыми числами по образцу.

Пример для n = 5 .

0 1 2 3 4 1 1 2 3 4 2 2 2 3 4 3 3 3 3 4 4 4 4 4 4

H: Квадраты-2

Заполните квадратный массив целыми числами по образцу.

Пример для n = 5 .

0 1 2 3 4 0 1 2 3 3 0 1 2 2 2 0 1 1 1 1 0 0 0 0 0

I: Шахматная доска

Заполните прямоугольный массив числами 0 и 1 в шахматном порядке. В левом верхнему углу записана 1.

Пример для n = 5 , m = 6 .

1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0

J: Нумерация диагоналей - 1

Заполните прямоугольный массив целыми числами по образцу.

Пример для n = 5 , m = 6 .

0 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8 4 5 6 7 8 9

K: Нумерация диагоналей - 2

Заполните прямоугольный массив целыми числами по образцу (на главной диагонали стоят нули, выше нее стоят 1, затем 2, 0, 1 и т.д. Номера всех диагоналей чередуются по циклу 0, 1, 2, . ).

Пример для n = 5 , m = 6 .

0 1 2 0 1 2 2 0 1 2 0 1 1 2 0 1 2 0 0 1 2 0 1 2 2 0 1 2 0 1

L: Расстояние до побочной диагонали

Заполните квадратный массив целыми числами по образцу. На побочной диагонали стоят нули, на соседних с нею диагоналях стоят 1, затем 2 и т.д.

Пример для n = 5 .

4 3 2 1 0 3 2 1 0 1 2 1 0 1 2 1 0 1 2 3 0 1 2 3 4

M: Каждая четвертая диагональ

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

Пример для n = 10 .

0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0

N: Решетка

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

Пример для n = 5 , m = 6 .

1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1

O: Выше и ниже главной диагонали

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

Пример для n = 5 , m = 6 .

0 1 1 1 1 1 2 0 1 1 1 1 2 2 0 1 1 1 2 2 2 0 1 1 2 2 2 2 0 1

P: Андреевский крест

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

Пример для n = 7 .

1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1

Q: Квадранты

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

Пример для n = 8 .

0 1 1 1 1 1 1 0 4 0 1 1 1 1 0 2 4 4 0 1 1 0 2 2 4 4 4 0 0 2 2 2 4 4 4 0 0 2 2 2 4 4 0 3 3 0 2 2 4 0 3 3 3 3 0 2 0 3 3 3 3 3 3 0

R: Большие квадраты

Заполните прямоугольный массив целыми числами квадратами размера 2×2 из единиц, квадраты идут в шахматном порядке, начиная с левого верхнего угла.

Пример для n = 7 , m = 10 .

1 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0

S: Змейка

Заполните прямоугольный массив целыми числами начиная с нуля по строчкам “змейкой”: слева направо, затем справа налево. строчки обходятся сверху вниз.

Пример для n = 5 , m = 6 .

0 1 2 3 4 5 11 10 9 8 7 6 12 13 14 15 16 17 23 22 21 20 19 18 24 25 26 27 28 29

T: Заполнение в шахматном порядке

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

Пример для n = 5 , m = 6 .

1 0 2 0 3 0 0 4 0 5 0 6 7 0 8 0 9 0 0 10 0 11 0 12 13 0 14 0 15 0

U: Вложенные прямоугольники

Заполните прямоугольный массив вложенными прямоугольниками. Клетки, находящиеся на краях прямоугольника, заполняются числом 0, соседние с ними клетки заполняются числом 1, соседние с ними — числом 2 и т.д.

Пример для n = 6 , m = 9 .

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 2 2 2 2 2 1 0 0 1 2 2 2 2 2 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0

V: Крест

Заполните квадратный массив целыми числами по образцу. В углах записан число 0, в соседних с ними с углами клетках записано число 1, в соседних с ними клетках записано число 2 и т.д. Клетки считаются соседними, если у них есть общая сторона или вершина.

Пример для n = 8 .

0 1 2 3 3 2 1 0 1 1 2 3 3 2 1 1 2 2 2 3 3 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 3 3 2 2 2 1 1 2 3 3 2 1 1 0 1 2 3 3 2 1 0

W: Ромбы

Заполните квадратный массив целыми числами по образцу. В углах записан число 0, в соседних с ними с углами клетках записано число 1, в соседних с ними клетках записано число 2 и т.д. Клетки считаются соседними, если у них есть общая сторона.

Пример для n = 7 .

0 1 2 3 2 1 0 1 2 3 4 3 2 1 2 3 4 5 4 3 2 3 4 5 6 5 4 3 2 3 4 5 4 3 2 1 2 3 4 3 2 1 0 1 2 3 2 1 0

Пример для n = 8 .

0 1 2 3 3 2 1 0 1 2 3 4 4 3 2 1 2 3 4 5 5 4 3 2 3 4 5 6 6 5 4 3 3 4 5 6 6 5 4 3 2 3 4 5 5 4 3 2 1 2 3 4 4 3 2 1 0 1 2 3 3 2 1 0

X: Вдоль главной диагонали

Заполните квадратный массив целыми числами по образцу. Часть массива ниже главной диагонали заполнена нулями. На главной диагонали записаны числа 0, 1, . n - 1. На диагонали выше главной — числа n, n + 1, . 2n - 2. Следующая диагональ заполняется, начиная с числа 2n - 1 и т.д.

Пример для n = 7 .

0 7 13 18 22 25 27 0 1 8 14 19 23 26 0 0 2 9 15 20 24 0 0 0 3 10 16 21 0 0 0 0 4 11 17 0 0 0 0 0 5 12 0 0 0 0 0 0 6

Y: Заполнение по диагоналям

Заполните прямоугольный массив целыми числами начиная с нуля вдоль диагоналей, параллельных побочной диагонали. Заполнение проводится сверху вниз, диагонали обходятся слева направо.

Пример для n = 7 , m = 10 .

0 1 3 6 10 15 21 28 35 42 2 4 7 11 16 22 29 36 43 49 5 8 12 17 23 30 37 44 50 55 9 13 18 24 31 38 45 51 56 60 14 19 25 32 39 46 52 57 61 64 20 26 33 40 47 53 58 62 65 67 27 34 41 48 54 59 63 66 68 69

Z: Заполнение по спирали

Заполните прямоугольный массив целыми числами начиная с нуля спиралью, закручивающейся по часовой стрелке из левого верхнего угла к центру массива.

Пример для n = 7 , m = 10 .

0 1 2 3 4 5 6 7 8 9 29 30 31 32 33 34 35 36 37 10 28 51 52 53 54 55 56 57 38 11 27 50 65 66 67 68 69 58 39 12 26 49 64 63 62 61 60 59 40 13 25 48 47 46 45 44 43 42 41 14 24 23 22 21 20 19 18 17 16 15

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

Решаю задачу. Вводится список целых чисел в строку через пробел. С помощью list comprehension сформировать из них двумерный список lst размером n x n (квадратную таблицу чисел). То есть, на входе, например: 1 2 3 4 5 6 7 8 9 На выходе: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] Казалось что всё просто, но первое решение не прошло (думаю, нет смысла объяснять почему):

lst = list(map(int, input().split())) n = int(len(lst) ** 0.5) lst = [[lst[i] for i in range(n)] for j in range(n)] print(lst) 

Решил сделать для начала хоть как-то, даже с numpy, а потом уже перевести в list comprehension.

import numpy as np lst = list(map(int, input().split())) n = int(len(lst) ** 0.5) lst_split = np.array_split(lst, n) lst_new = lst_split.tolist() print(lst) 

Однако, не тут-то было. Numpy сделал нужную матрицу, но обратно выпускать ее из своих нампаевских объятий уже не захотел. Если оставить всё в виде array (то есть, отказаться от этой операции: lst_new = lst_split.tolist() ), то получается такой ответ:

[array([1, 2, 3]), array([4, 5, 6]), array([7, 8, 9])] 

что не является правильным ответом. Но если сделать "как надо", т.е. с обратным преобразованием в список, то получаем такую ошибку:

AttributeError: 'list' object has no attribute 'tolist' 

Первая мысль была: "Как же так? Неправда, братцы. Он, наверно, пошутил?" (с). Но немного придя в себя я понял, что (скорее всего) подразумевается тот list, который охватывается эти три массива:

array([1, 2, 3]), array([4, 5, 6]), array([7, 8, 9]) 

Тогда стала задача - как перевести в списки те массивы, которые у меня внутри списка? Была идея сделать это, так сказать, методом лапароскопии, то есть так:

for i in lst_split: i = i.tolist() 
  1. как решить эту задачу с numpy и без него? Уже не спрашиваю про list comprehension, т.к. есть надежда что обычное решение я в него как-то втисну.
  2. в чем ошибочна логика моего решения? Это по сути даже более важный вопрос, т.к. он уже про понимание. Такое ощущение, что я не понимаю чего-то важного и тонкого из списков, хотя и изучал эту тему по разным источникам. Спасибо всем, кто прочитал до конца и кто сможет ответить.

Как преобразовать двумерный список строк целых чисел в двумерный список просто целых чисел?

"Напишите программу, на вход которой подаётся прямоугольная матрица в виде последовательности строк, заканчивающихся строкой, содержащей только строку "end" (без кавычек) (дальше условия задачи можно не читать)
Программа должна вывести матрицу того же размера, у которой каждый элемент в позиции i, j равен сумме элементов первой матрицы на позициях (i-1, j), (i+1, j), (i, j-1), (i, j+1). У крайних символов соседний элемент находится с противоположной стороны матрицы.
В случае одной строки/столбца элемент сам себе является соседом по соответствующему направлению."

Пример входящих данных:
9 5 3
0 7 -1
-5 2 9
end

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
b = [] c = [] f = [] while True: a = [i for i in input().split()] if a[0] == 'end': break for i in a: f.append(int(i)) #Двумерный список чисел. Но вместо [[9 5 3] [0 7 -1] [-5 2 9]] получается [[9 5 3 0 7 -1 -5 2 9] [9 5 3. b.append(a) #Двумерный список строк-чисел (не знаю, как более правильно сформулировать). Получается [['9' '5' '3'] ['0' '7' '-1'] ['-5' '2' '9']] c = b.copy() d = len(b[0]) for i in range(len(b)): for j in range (d): c[i][j] = b[i-d+1][j]+b[i-1][j]+b[i][j-d+1]+b[i][j-1]

Вопрос: как либо f, либо b преобразовать в необходимый список [[9 5 3] [0 7 -1] [-5 2 9]]?

Как преобразовать массив NumPy в список в Python (с примерами)

Вы можете использовать следующий базовый синтаксис для преобразования массива NumPy в список в Python:

my_list = my_array. tolist () 

В следующих примерах показано, как использовать этот синтаксис на практике.

Пример 1. Преобразование одномерного массива в список

В следующем коде показано, как преобразовать одномерный массив NumPy в список в Python:

import numpy as np #create NumPy array my_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) #convert NumPy array to list my_list = my_array. tolist () #view list print(my_list) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] #view object type type (my_list) list 

Пример 2. Преобразование многомерного массива в список

В следующем коде показано, как преобразовать многомерный массив NumPy в список в Python:

import numpy as np #create NumPy array my_array = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]) #convert NumPy array to list my_list = my_array. tolist () #view list print(my_list) [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]] #view object type type (my_list) list 

Пример 3. Преобразование многомерного массива в плоский список

В следующем коде показано, как преобразовать многомерный массив NumPy в плоский список в Python:

import numpy as np #create NumPy array my_array = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]) #convert NumPy array to flattened list my_list = my_array. flatten().tolist () #view list print(my_list) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] #view object type type (my_list) list 

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные преобразования в Python:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *