我用Google搜索并搜索了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将显示为'A \ n'并且打印将显示在矩阵之前。
请有人帮助我,即使你把我引导到一个非常明显的地方让我看起来像个白痴,我只是想学习这个。
答案 0 :(得分:10)
您问题的答案取决于您的学习目标。如果您试图让矩阵“点击”以便以后可以使用它,我建议您查看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']
你必须使用像list comprehension这样的东西来获得所有第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
答案 1 :(得分:9)
循环有助于:
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()
function转置矩阵;如果将每一行作为单独的参数传递给函数,zip()
将这些值重新组合为列的元组。 *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
答案 2 :(得分:2)
你也可以使用追加功能
b = [ ]
for x in range(0, 5):
b.append(["O"] * 5)
def print_b(b):
for row in b:
print " ".join(row)
答案 3 :(得分:0)
你可以这样做:
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']]
答案 4 :(得分:0)
通过将列表转换为字符串并执行字符串操作以从矩阵中正确打印,我得到了一个简单的解决方法。
通过创建一个函数,每次要打印矩阵时,都可以省去编写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)
每个条目都带有0
的5x5矩阵示例:
>>> 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
每个条目都有0
的2x3矩阵示例:
>>> 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
我建议您只需更改将数据输入列表中的列表的方式。在我的方法中,较大列表中的每个列表代表矩阵中的一行,而不是列。
答案 5 :(得分:0)
如果您不想使用numpy,则可以使用“列表列表”概念。要创建任何2D数组,只需使用以下语法:
mat = [[input() for i in range (col)] for j in range (row)]
,然后输入所需的值。