В Python есть ли способ добавить позади?
У меня есть матрица:
[[1 2 3],
[4 5 6],
[7 8 9]]
и мне нужно создать новую матрицу:
[[7 4 1],
[8 5 2],
[9 6 3]]
Я старался
new_matrix = [[1]]
new_matrix.append(matrix[1][0])
и получил new_matrix = [4 1]
вместо new_matrix = [1 4]
Если вам нужно больше разъяснений, просто спросите.
4 ответа
Да. использование new_matrix.insert(0,matrix[1][0])
,
insert(position,value)
позволяет вставлять объекты в указанные позиции в списке. В этом случае, так как вы хотите вставить число в начале, позиция равна нулю.
Заметьте, однако, что это займет O(n) времени, если new_matrix имеет n элементов. Если new_matrix имеет 100 элементов, добавление чего-либо к началу займет в десять раз больше, чем если бы оно имело 10. Это намного медленнее, чем добавление чего-либо в конец списка, что обычно занимает O(1): оно должно быть быстрым независимо насколько большой new_matrix. Смотрите здесь, чтобы узнать больше о временной сложности операций с Python. Если вы будете регулярно добавлять элементы в начало списков, вы можете подумать о том, можете ли вы изменить то, что делаете.
Также обратите внимание, что то, как вы все сделали, даст вам new_matrix из [4,[1]]. Я не совсем уверен, что вы хотите: если вы хотите, чтобы конечные результаты, как вы их описываете, то вам нужно new_matrix = [1]
, Если ваш код правильный (new_matrix = [[1]]
), и вы хотите [[4,1]]
тогда вам нужно будет сделать new_matrix[0].insert(0,4)
, Если ты хочешь [[4],[1]]
вам нужно будет сделать new_matrix.insert(0,[4])
, и так далее.
Кроме того, поскольку вы, кажется, делаете что-то с матрицами, вы рассматривали возможность использования numpy?
(Я хотел бы отметить, что, если этот ответ кажется немного не по теме, это потому, что этот вопрос был отредактирован так, чтобы он был совершенно другим, чем первоначально задавался.)
Что касается нового вопроса: хотя ответ Стефана - хороший питон, возможно, вы слишком много работаете над собой. Ясно, что вы пытаетесь реализовать что-то вроде транспонирования матрицы, кроме зеркального отображения. Если вы делаете подобные манипуляции, Numpy будет намного проще и быстрее. В этом случае с массивами numpy вам нужно будет сделать следующее:
import numpy as np # import numpy
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # Here's your matrix
new_matrix_1 = matrix[::-1,:] # Here's your matrix with all the rows reversed: [[7,8,9],[4,5,6],[1,2,3]]
new_matrix = new_matrix_1.T # Here's the transpose of that, which is what you want.
Хотя это только одно, это облегчит все, что вы делаете. Например, арифметика на самом деле будет работать: new_matrix+matrix
, 2*new_matrix
, и так далее. В противном случае вам придется реализовать это вручную.
Зачем строить матрицу в крошечные шаги, когда вы можете просто сделать это сразу?
>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> new_matrix = zip(*matrix[::-1])
>>> new_matrix
[(7, 4, 1), (8, 5, 2), (9, 6, 3)]
Или, если вам нужны строки в виде списков:
>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> new_matrix = map(list, zip(*matrix[::-1]))
>>> new_matrix
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
Объяснение:
- Сначала
[::-1]
переворачивает матрицу, т. е. переворачивает ее с ног на голову. Это приближает нас к желаемому результату. zip
затем транспонирует матрицу, комбинируя ее строки. Первый элемент результата zip - это список первого элемента каждой строки, т. Е. Первый элемент zip - это первый столбец. И так далее, т. Е. Почтовый индекс дает вам список столбцов, т. Е. Транспонированной матрицы.
От:
[[1 2 3],
[4 5 6],
[7 8 9]]
в
[[7 4 1],
[8 5 2],
[9 6 3]]
можно сделать как
import numpy as np
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix[::-1].T
Если вы в список понимания и прочее:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
result = [ [ i[k] for i in matrix[::-1] ] for k in range(len(matrix)) ]