2015-01-29 4 views
0

는 I이 값이 포함 된 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]] 

를 텍스트 [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 
+0

행렬로 숫자 작업을 수행하는 경우 [numpy] (http://www.numpy.org/)를 참고하십시오. – senshin

+0

2D 목록의 데이터에서 3D 목록을 만들거나 마치 하나의 것처럼 인쇄하고 있습니까? – 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의 신체의 모든 약 대신을 인쇄, 그래서 나는 그에 집중했습니다! 다른 것을 원할 경우 명확하게 (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)) 

출력 :

NumPy와 함께
[[4 3 8] 
[9 5 1] 
[2 7 6]] 

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

, 당신이 정말로 행렬로 작업

+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 
관련 문제