Генераторы двумерных массивов
Для создания двумерных массивов можно использовать вложенные генераторы, разместив генератор списка, являющегося строкой, внутри генератора для строк. Например, сделать список из 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 20A: Номера строк
Заполните массив, записав в каждом элементе номер строки, в которой он находится.
Пример для 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 4B: Номера столбцов
Заполните массив, записав в каждом элементе номер столбца, в котором он находится.
Пример для 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 5C: Слева направо, сверху вниз
Заполните массив целыми числами начиная с нуля по строчкам, слева направо, строчки обходятся сверху вниз.
Пример для 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 29D: Сверху вниз, слева направо
Заполните массив целыми числами начиная с нуля по столбцам, сверху вниз, столбцы обходятся слева направо.
Пример для 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 29E: Снизу вверх, слева направо
Заполните массив целыми числами начиная с нуля по столбцам, снизу вверх, столбцы обходятся слева направо.
Пример для 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 25F: Справа налево, снизу вверх
Заполните массив целыми числами начиная с нуля по строчкам, справа налево, строчки обходятся снизу вверх.
Пример для 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 0G: Квадраты-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 4H: Квадраты-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 0I: Шахматная доска
Заполните прямоугольный массив числами 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 0J: Нумерация диагоналей - 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 9K: Нумерация диагоналей - 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 1L: Расстояние до побочной диагонали
Заполните квадратный массив целыми числами по образцу. На побочной диагонали стоят нули, на соседних с нею диагоналях стоят 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 4M: Каждая четвертая диагональ
Заполните квадратный массив целыми числами по образцу. На побочной диагонали стоят единицы, каждая четвертая по счету диагональ, параллельная побочной, также заполнена единицами.
Пример для 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 0N: Решетка
Заполните прямоугольный массив целыми числами по образцу (нули стоят на пересечении строк и столбцов с нечетными номерами, в остальных клетках стоят единицы).
Пример для 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 1O: Выше и ниже главной диагонали
Заполните прямоугольный массив целыми числами по образцу. На главной диагонали стоят нули, выше главной диагонали — единицы, ниже — двойки
Пример для 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 1P: Андреевский крест
Заполните квадратный массив целыми числами по образцу. На главной и побочной диагоналях стоят единицы, остальные элементы равны нулю.
Пример для 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 1Q: Квадранты
Заполните квадратный массив целыми числами по образцу. На главной и побочных диагоналях стоят нули, эти диагонали делят массив на четыре части. В верхней части записаны единицы, в правой записаны двойки, в нижней записаны тройки, в левой записаны четверки.
Пример для 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 0R: Большие квадраты
Заполните прямоугольный массив целыми числами квадратами размера 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 0S: Змейка
Заполните прямоугольный массив целыми числами начиная с нуля по строчкам “змейкой”: слева направо, затем справа налево. строчки обходятся сверху вниз.
Пример для 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 29T: Заполнение в шахматном порядке
Заполните прямоугольный массив целыми числами начиная с единицы по строчкам слева направо, строчки обходятся сверху вниз. При этом в левом верхнем углу записано число 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 0U: Вложенные прямоугольники
Заполните прямоугольный массив вложенными прямоугольниками. Клетки, находящиеся на краях прямоугольника, заполняются числом 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 0V: Крест
Заполните квадратный массив целыми числами по образцу. В углах записан число 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 0W: Ромбы
Заполните квадратный массив целыми числами по образцу. В углах записан число 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 0X: Вдоль главной диагонали
Заполните квадратный массив целыми числами по образцу. Часть массива ниже главной диагонали заполнена нулями. На главной диагонали записаны числа 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 6Y: Заполнение по диагоналям
Заполните прямоугольный массив целыми числами начиная с нуля вдоль диагоналей, параллельных побочной диагонали. Заполнение проводится сверху вниз, диагонали обходятся слева направо.
Пример для 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 69Z: Заполнение по спирали
Заполните прямоугольный массив целыми числами начиная с нуля спиралью, закручивающейся по часовой стрелке из левого верхнего угла к центру массива.
Пример для 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()
- как решить эту задачу с numpy и без него? Уже не спрашиваю про list comprehension, т.к. есть надежда что обычное решение я в него как-то втисну.
- в чем ошибочна логика моего решения? Это по сути даже более важный вопрос, т.к. он уже про понимание. Такое ощущение, что я не понимаю чего-то важного и тонкого из списков, хотя и изучал эту тему по разным источникам. Спасибо всем, кто прочитал до конца и кто сможет ответить.
Как преобразовать двумерный список строк целых чисел в двумерный список просто целых чисел?
"Напишите программу, на вход которой подаётся прямоугольная матрица в виде последовательности строк, заканчивающихся строкой, содержащей только строку "end" (без кавычек) (дальше условия задачи можно не читать)
Программа должна вывести матрицу того же размера, у которой каждый элемент в позиции i, j равен сумме элементов первой матрицы на позициях (i-1, j), (i+1, j), (i, j-1), (i, j+1). У крайних символов соседний элемент находится с противоположной стороны матрицы.
В случае одной строки/столбца элемент сам себе является соседом по соответствующему направлению."Пример входящих данных:
9 5 3
0 7 -1
-5 2 9
end1 2 3 4 5 6 7 8 9 10 11 12 13 14 15b = [] 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: