Как сделать матрицы в Python?

я погуглил его и искал StackOverflow и YouTube.. Я просто не могу заставить матрицы в Python щелкать в моей голове. Кто-нибудь может мне помочь? Я просто пытаюсь создать базовое поле 5x5, которое отображает:

A A A A A
B B B B B
C C C C C
D D D D D
E E E E E

я получил

a b c d e
a b c d e
a b c d e
a b c d e
a b c d e

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

[['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E']]

и если я попытаюсь добавить n к ним или распечатать "" и т. д. Это просто не работает.. N будет отображаться как 'n' и печатать отобразится перед матрицей.

5 ответов


зацикливание помогает:

for row in matrix:
    print ' '.join(row)

или использовать вложенные str.join() вызовы:

print '\n'.join([' '.join(row) for row in matrix])

демо:

>>> matrix = [['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E']]
>>> for row in matrix:
...     print ' '.join(row)
... 
A B C D E
A B C D E
A B C D E
A B C D E
A B C D E
>>> print '\n'.join([' '.join(row) for row in matrix])
A B C D E
A B C D E
A B C D E
A B C D E
A B C D E

если вы хотите показать транспонированные строки и столбцы, транспонируйте матрицу с помощью zip() функции; если вы проходите каждую строку в качестве отдельного аргумента для функции zip() рекомбинирует это значение по значению как кортежи столбцов вместо этого. The *args синтаксис позволяет применять целую последовательность строк как отдельные аргументы:

>>> for cols in zip(*matrix):  # transposed
...     print ' '.join(cols)
... 
A A A A A
B B B B B
C C C C C
D D D D D
E E E E E

ответ на ваш вопрос зависит от ваших целей обучения. Если вы пытаетесь заставить матрицы "щелкнуть", чтобы вы могли использовать их позже, я бы предложил посмотреть на Numpy array вместо списка списков. Это позволит вам легко вырезать строки, столбцы и подмножества. Просто попробуйте получить столбец из списка списков, и вы будете разочарованы.

С помощью списка списков в качестве матрицы...

давайте возьмем Ваш список списков для пример:

L = [list("ABCDE") for i in range(5)]

легко получить подэлементы для любой строки:

>>> L[1][0:3]
['A', 'B', 'C']

или всю строку:

>>> L[1][:]
['A', 'B', 'C', 'D', 'E']

но попробуйте перевернуть это, чтобы получить те же элементы в формате столбца, и это не сработает...

>>> L[0:3][1]
['A', 'B', 'C', 'D', 'E']

>>> L[:][1]
['A', 'B', 'C', 'D', 'E']

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

>>> [x[1] for x in L]
['B', 'B', 'B', 'B', 'B']

введите матриц

если вы используете массив вместо этого, вы получите нарезку и индексирование что вы ожидаете от MATLAB или R (или большинства других языков, если на то пошло):

>>> import numpy as np
>>> Y = np.array(list("ABCDE"*5)).reshape(5,5)
>>> print Y
[['A' 'B' 'C' 'D' 'E']
 ['A' 'B' 'C' 'D' 'E']
 ['A' 'B' 'C' 'D' 'E']
 ['A' 'B' 'C' 'D' 'E']
 ['A' 'B' 'C' 'D' 'E']]
>>> print Y.transpose()
[['A' 'A' 'A' 'A' 'A']
 ['B' 'B' 'B' 'B' 'B']
 ['C' 'C' 'C' 'C' 'C']
 ['D' 'D' 'D' 'D' 'D']
 ['E' 'E' 'E' 'E' 'E']]

захватить строку 1 (как со списками):

>>> Y[1,:]
array(['A', 'B', 'C', 'D', 'E'], 
      dtype='|S1')

захватить столбец 1 (новый!):

>>> Y[:,1]
array(['B', 'B', 'B', 'B', 'B'], 
      dtype='|S1')

Итак, теперь, чтобы сгенерировать печатную матрицу:

for mycol in Y.transpose():
    print " ".join(mycol)


A A A A A
B B B B B
C C C C C
D D D D D
E E E E E

вы также можете использовать функцию append

b = [ ]

for x in range(0, 5):
    b.append(["O"] * 5)

def print_b(b):
    for row in b:
        print " ".join(row)

вы можете сделать это коротко, как это:

matrix = [["A, B, C, D, E"]*5]
print(matrix)


[['A, B, C, D, E', 'A, B, C, D, E', 'A, B, C, D, E', 'A, B, C, D, E', 'A, B, C, D, E']]

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

создание функции

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

def print_matrix(matrix):
    for row in matrix:
        new_row = str(row)
        new_row = new_row.replace(',','')
        new_row = new_row.replace('[','')
        new_row = new_row.replace(']','')
        print(new_row)

примеры

пример матрицы 5x5 с 0 в каждой записи:

>>> test_matrix = [[0] * 5 for i in range(5)]
>>> print_matrix(test_matrix)
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 

пример матрицы 2x3 с 0 как каждая запись:

>>> test_matrix = [[0] * 3 for i in range(2)]
>>> print_matrix(test_matrix)
0 0 0
0 0 0

редактировать

если вы хотите, чтобы он напечатал:

A A A A A
B B B B B
C C C C C
D D D D D 
E E E E E

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