Как обратиться к каждому элементу исходной матрицы в Python?
У меня есть код который работает с матрицей находящейся в файле и работает с кодами module_1 module_2 и module_3
import csv
from matplotlib.pyplot import matshow, show
from module_1 import task_1
from module_2 import task_2
from module_3 import task_3
def read(csvfile):
with open(csvfile, 'r') as file:
r = list(csv.reader(file))
for x in range(len(r)):
for y in range(len(r[x])):
r[x][y] = int(r[x][y])
return r
def write(matrix, name = "result.csv"):
with open(name, 'w') as file:
for x in range(len(matrix)):
for y in range(len(matrix[x])):
if y == len(matrix[x]) - 1:
file.write(str(matrix[x][y]) + "\n")
else:
file.write(str(matrix[x][y]) + " ")
t1 = task_1(read("tekst.csv"))
for x in range(len(t1)):
print(t1, end='\n')
print('\n')
t2 = task_2(read("tekst.csv"))
for x in range(len(t2)):
for y in range(len(t2[x])):
print(t2[x][y], end=' ')
print()
t3 = task_3(read("tekst.csv"))
for x in range(len(t3)):
print(t3[x], end='\n')
print('\n')
write(t2)
matshow(t2)
show()
module_1 меняет матрицу на нули
def task_1(m):
d = [0]*len(m)
return d
И происходит вывод:
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
Но мне нужно чтобы был вывод:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Так же и в module_3 он удаляет последние 4 строки матрицы:
def task_3(m):
return m[:-4]
Вывод:
[1, 2, 3, 4, 5, 6, 7, 8]
[8, 7, 6, 5, 4, 3, 2, 1]
[2, 3, 4, 5, 6, 7, 8, 9]
[9, 8, 7, 6, 5, 4, 3, 2]
А нужно:
1 2 3 4 5 6 7 8
8 7 6 5 4 3 2 1
2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2
Входные данные в файле tekst.csv
1,2,3,4,5,6,7,8
8,7,6,5,4,3,2,1
2,3,4,5,6,7,8,9
9,8,7,6,5,4,3,2
1,3,5,7,9,7,5,3
3,1,5,3,2,6,5,7
1,7,5,9,7,3,1,5
2,6,3,5,1,7,3,2
Ответы (1 шт):
1)
Сразу же в глаза бросается тот факт, что Вы обращаетесь к таблице несколько раз. Это крайне неэффективно по времени и по памяти (вы постоянно преобразовываете таблицу в список). Обратитесь к ней в самом начале и передайте ей, например, переменную TABLE. Для повторяющихся переменных также советую использовать константы, описать их вначале вашей программы. Например, присвоить переменной TABLE_NAME имя таблицы с расширением .csv, т.е. TABLE_NAME = 'tekst.csv'
2)
Измените функции task_1, task_2 и task_3, чтобы в них происходило окончательное создание матриц. Таким образом, функция будет возвращать полноценный список с столбцами и строками.
3)
Замените громоздкий цикл для функций def write() и def read().
В данном случае я имею в виду заменить цикл внутри write() на:
ROWS = [(0,0,0),(0,0,0),(0,0,0)]
# () - ЭТО ОБЪЕКТ SET (можете прочитать по нему документацию в интернете). КАЖДЫЙ SET - ЭТО ОДНА СТРОКА В ВАШЕЙ МАТРИЦЕ. В СОВОКУПНОСТИ ОНИ СОСТАВЛЯЮТ ПОЛНОЦЕННУЮ МАТРИЦУ
csvfile=open(TABLE_NAME, 'w', newline='')
obj=csv.writer(csvfile)
for row in ROWS:
obj.writerow(row)
csvfile.close()
Цикл внутри read() заменить на:
with open(TABLE_NAME) as fp:
reader = csv.reader(fp, delimiter=",", quotechar='"')
data_read = [row for row in reader]
4)
Замените эту часть вашей программы:
t1 = task_1(read("tekst.csv"))
for x in range(len(t1)):
print(t1, end='\n')
print('\n')
t2 = task_2(read("tekst.csv"))
for x in range(len(t2)):
for y in range(len(t2[x])):
print(t2[x][y], end=' ')
print()
t3 = task_3(read("tekst.csv"))
for x in range(len(t3)):
print(t3[x], end='\n')
На это:
TABLE = read(TABLE_NAME)
matrix_t1 = task_1(TABLE)
matrix_t2 = task_2(TABLE)
matrix_t3 = task_3(TABLE)
print(*matrix_t1, sep = " ")
print(*matrix_t2, sep = " ")
print(*matrix_t3, sep = " ")