如何创建3x3矩阵?

时间:2015-01-29 01:58:20

标签: python python-3.x

我有一个包含这些值的2D列表:

text = [[4, 3, 8, 9, 5, 1, 2, 7, 6], [8, 3, 4, 1, 5, 9, 6, 7, 2], 
[6, 1, 8, 7, 5, 3, 2, 9, 4], [6, 9, 8, 7, 5, 3, 2, 1, 4], 
[6, 1, 8, 7, 5, 3, 2, 1, 4], [6, 1, 3, 2, 9, 4, 8, 7, 5]]

例如,text [i]应该像这样打印:

4 3 8
9 5 1
2 7 6

但我的矩阵打印出来:

   r = 6
   m = []
    for i in range(r):
        m.append([int(x) for x in text[i]])
    for i in m:
        print (i) 
>>
    4 3 8 9 5 1 2 7 6 
    8 3 4 1 5 9 6 7 2
    6 1 8 7 5 3 2 9 4 
    6 9 8 7 5 3 2 1 4 
    6 1 8 7 5 3 2 1 4 
    6 1 3 2 9 4 8 7 5 

5 个答案:

答案 0 :(得分:5)

您可以使用numpy。首先,将列表转换为numpy数组。然后,取一个元素并将其重塑为3x3矩阵。

import numpy as np

text = [[4, 3, 8, 9, 5, 1, 2, 7, 6], [8, 3, 4, 1, 5, 9, 6, 7, 2],
[6, 1, 8, 7, 5, 3, 2, 9, 4], [6, 9, 8, 7, 5, 3, 2, 1, 4],
[6, 1, 8, 7, 5, 3, 2, 1, 4], [6, 1, 3, 2, 9, 4, 8, 7, 5]]

text = np.array(text)

print text[0].reshape((3, 3))
print text[1].reshape((3, 3))

输出:

[[4 3 8]
 [9 5 1]
 [2 7 6]]

[[8 3 4]
 [1 5 9]
 [6 7 2]]

有了numpy,你真的在​​使用矩阵

答案 1 :(得分:2)

def print9_as_3x3(list9):
    for i in 0, 3, 6:
        for j in 0, 1, 2:
            print(list9[i+j], end= ' ')
    print()

这当然可以很容易地推广(使用range而不是那些文字元组),但我试图保持尽可能简单。

Q的主题是关于创建矩阵,这个代码没有做,但是Q的主体全部都是关于打印,所以我专注于此!如果你想要不同的东西,请澄清(编辑你的Q)和评论......

答案 2 :(得分:2)

使用石斑鱼配方referred to here将每个列表拆分为3个,然后打印每组3个。

def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return itertools.zip_longest(*args, fillvalue=fillvalue)
    # zip_longest is new in Python3

for matrix in text:
    for chunk in grouper(matrix, 3):
        print(chunk)
    print() # empty line in between each 3x3

结果:

(4, 3, 8)
(9, 5, 1)
(2, 7, 6)

(8, 3, 4)
(1, 5, 9)
(6, 7, 2)

(6, 1, 8)
(7, 5, 3)
(2, 9, 4)

(6, 9, 8)
(7, 5, 3)
(2, 1, 4)

(6, 1, 8)
(7, 5, 3)
(2, 1, 4)

要从问题中输出文字输出,你必须做一些格式化,但它不应该太糟糕。类似的东西:

for matrix in text:
    for chunk in grouper(matrix, 3):
        print(" ".join(map(str, chunk)))
    print()

结果:

4 3 8
9 5 1
2 7 6

8 3 4
1 5 9
6 7 2

6 1 8
7 5 3
2 9 4

6 9 8
7 5 3
2 1 4

6 1 8
7 5 3
2 1 4

6 1 3
2 9 4
8 7 5

答案 3 :(得分:0)

for a, b ,c in (x[i:i+3] for x in text for i in range(0,len(x),3)):
    print(a,b,c)

4 3 8
9 5 1
2 7 6
8 3 4
1 5 9
6 7 2
6 1 8
7 5 3
2 9 4
6 9 8
7 5 3
2 1 4
6 1 8
7 5 3
2 1 4
6 1 3
2 9 4
8 7 5

答案 4 :(得分:0)

我不完全清楚你追求的是什么,所以这里有一个猜测:

text = [[4, 3, 8, 9, 5, 1, 2, 7, 6], [8, 3, 4, 1, 5, 9, 6, 7, 2],
        [6, 1, 8, 7, 5, 3, 2, 9, 4], [6, 9, 8, 7, 5, 3, 2, 1, 4],
        [6, 1, 8, 7, 5, 3, 2, 1, 4], [6, 1, 3, 2, 9, 4, 8, 7, 5]]

# convert to 3D list in-place
for i, data in enumerate(text):
    text[i] = [[data[0], data[1], data[2]],
               [data[3], data[4], data[5]],
               [data[6], data[7], data[8]]]

# utility for print a 3x3 matrix         
def formatrix(label, matrix):
    indent = len(label)
    return '\n'.join((label + ', '.join(map(str, matrix[0])),
                      indent*' ' + ', '.join(map(str, matrix[1])),
                      indent*' ' + ', '.join(map(str, matrix[2]))))

# print each matrix in reformatted list
for i, matrix in enumerate(text):
    print(formatrix('text[%s]: ' % i, matrix))

输出:

text[0]: 4, 3, 8
         9, 5, 1
         2, 7, 6
text[1]: 8, 3, 4
         1, 5, 9
         6, 7, 2
text[2]: 6, 1, 8
         7, 5, 3
         2, 9, 4
text[3]: 6, 9, 8
         7, 5, 3
         2, 1, 4
text[4]: 6, 1, 8
         7, 5, 3
         2, 1, 4
text[5]: 6, 1, 3
         2, 9, 4
         8, 7, 5