8

我用谷歌搜索了它并搜索了 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' 并且打印将显示在矩阵之前。

请有人帮助我,即使您将我引导到应该非常明显的地方并使我看起来像个白痴,我也只想学习这一点。

4

6 回答 6

10

您的问题的答案取决于您的学习目标是什么。如果您试图让矩阵“单击”以便以后使用它们,我建议您查看 Numpyarray而不是列表列表。这将使您可以轻松地切出行、列和子集。只需尝试从列表列表中获取一列,您就会感到沮丧。

使用列表列表作为矩阵...

让我们以您的列表列表为例:

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']

您必须使用列表理解之类的东西来获取所有第一个元素....

>>> [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
于 2013-09-30T05:30:47.273 回答
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()函数转置矩阵;如果将每一行作为单独的参数传递给函数,则将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
于 2013-09-29T23:29:30.053 回答
2

您还可以使用附加功能

b = [ ]

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

def print_b(b):
    for row in b:
        print " ".join(row)
于 2015-03-20T20:00:02.587 回答
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']]
于 2015-07-21T15:27:05.730 回答
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

我建议您更改将数据输入到列表中的列表的方式。在我的方法中,较大列表中的每个列表都代表矩阵中的一行,而不是列。

于 2016-10-30T22:40:42.957 回答
0

如果您不想使用 numpy,则可以使用列表概念的列表。要创建任何二维数组,只需使用以下语法:

  mat = [[input() for i in range (col)] for j in range (row)]

然后输入所需的值。

于 2019-07-25T15:07:23.123 回答