2015-01-29 4 views
0

У меня есть список 2D, содержащий эти значения:Как создать матрицы 3x3?

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

Например, текст [я] должен быть напечатан так:

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 
+0

Если вы выполняете численную работу с матрицами, вы можете посмотреть [numpy] (http://www.numpy.org/). – senshin

+0

Вы пытаетесь создать 3D-список из данных 2D-списка или просто распечатать его, как это было? – martineau

ответ

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 s вместо тех буквальные кортежи), но я стараюсь, чтобы это было максимально просто.

Предмет Q в переговоры о создание матриц, которые этот код не делать, но организма добротность все о печати вместо этого, поэтому я сосредоточился на том, что! Пожалуйста, уточните (отредактируйте свой Q) и прокомментируйте, если вы хотите что-то другое ...

2

Используйте рецепт группы referred to here, чтобы разбить каждый список на 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 
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

Вы можете использовать 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, вы действительно работают с матрицами

+0

На днях я узнаю, как использовать numpy, и все это волшебство будет моим! –

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 
Смежные вопросы