2012-11-04 41 views
32

Có cách nào đơn giản, được xây dựng để in danh sách 2D Python dưới dạng ma trận 2D không?In danh sách 2D 2D đẹp

Vì vậy, đây:

[["A", "B"], ["C", "D"]] 

sẽ trở thành cái gì đó như

A B 
C D 

tôi thấy các module pprint, nhưng nó dường như không làm những gì tôi muốn.

+2

Tôi đã gọi đó là danh sách 3D. Nếu bạn sẵn sàng để kéo nó vào, 'numpy' là khá tốt về loại điều này. – tacaswell

+0

@tcaswell: Rất tiếc, đúng. Tôi chỉ muốn nó được coi là ma trận 2D. Đã thay đổi câu hỏi để làm cho thiên tài rõ ràng là – houbysoft

Trả lời

47

Để thực hiện những điều thú vị, chúng ta hãy thử với một ma trận lớn hơn:

matrix = [ 
    ["Ah!", "We do have some Camembert", "sir"], 
    ["It's a bit", "runny", "sir"], 
    ["Well,", "as a matter of fact it's", "very runny, sir"], 
    ["I think it's runnier", "than you", "like it, sir"] 
] 

s = [[str(e) for e in row] for row in matrix] 
lens = [max(map(len, col)) for col in zip(*s)] 
fmt = '\t'.join('{{:{}}}'.format(x) for x in lens) 
table = [fmt.format(*row) for row in s] 
print '\n'.join(table) 

Output:

Ah!      We do have some Camembert sir    
It's a bit    runny      sir    
Well,     as a matter of fact it's very runny, sir 
I think it's runnier than you     like it, sir 

UPD: cho tế bào multiline, một cái gì đó như thế này nên làm việc:

text = [ 
    ["Ah!", "We do have\nsome Camembert", "sir"], 
    ["It's a bit", "runny", "sir"], 
    ["Well,", "as a matter\nof fact it's", "very runny,\nsir"], 
    ["I think it's\nrunnier", "than you", "like it,\nsir"] 
] 

from itertools import chain, izip_longest 

matrix = chain.from_iterable(
    izip_longest(
     *(x.splitlines() for x in y), 
     fillvalue='') 
    for y in text) 

Và sau đó áp dụng mã trên.

Xem thêm http://pypi.python.org/pypi/texttable

+0

! NHƯNG những gì nếu chúng ta muốn nhiều dòng trong mỗi tế bào tức là một mảng 3D :) – CpILL

+0

@CILLILL: một tùy chọn sẽ giải nén 3D thành một 2D: '[[[a, b, c], [xyz]]] => [ [a, x], [b, y], [c, z]] 'và sau đó áp dụng ở trên. – georg

+0

bạn có nghĩa là xoay vòng dữ liệu? – CpILL

11

Nếu bạn có thể sử dụng Pandas (Thư viện Phân tích dữ liệu Python), bạn có thể khá-in một ma trận 2D bằng cách chuyển đổi nó vào một đối tượng DataFrame:

from pandas import * 
x = [["A", "B"], ["C", "D"]] 
print DataFrame(x) 

    0 1 
0 A B 
1 C D 
+6

Trong khi câu trả lời này có lẽ là chính xác và hữu ích, nó được ưu tiên hơn nếu bạn [đưa ra một số giải thích cùng với nó] (http://meta.stackexchange.com/q/114762/159034) để giải thích cách giải quyết vấn đề. Điều này trở nên đặc biệt hữu ích trong tương lai, nếu có thay đổi (có thể không liên quan) khiến nó ngừng hoạt động và người dùng cần phải hiểu nó đã hoạt động như thế nào. –

+0

Đây chính xác là những gì tôi muốn. Cảm ơn. – Arvind

0

Một cách tiếp cận nhẹ hơn pandas là sử dụng các mô-đun prettytable

from prettytable import PrettyTable 

x = [["A", "B"], ["C", "D"]] 

p = PrettyTable() 
for row in x: 
    p.add_row(row) 

print p.get_string(header=False, border=False) 

sản lượng:

A B 
C D 

prettytable có nhiều tùy chọn để định dạng đầu ra theo nhiều cách khác nhau.

Xem https://code.google.com/p/prettytable/ để biết thêm

7

Bạn luôn có thể sử dụng NumPy

import numpy as np 
print(np.matrix(A)) 
-2

Xem đoạn mã sau.

# Define an empty list (intended to be used as a matrix) 
matrix = [] 
matrix.append([1, 2, 3, 4]) 
matrix.append([4, 6, 7, 8]) 
print matrix 
# Now just print out the two rows separately 
print matrix[0] 
print matrix[1] 
+0

hãy thử điều này và xem điều gì xảy ra không giống như câu trả lời. Vui lòng xem lại: https: // stackoverflow.com/help/how-to-answer – Daniel

Các vấn đề liên quan