2012-11-04 26 views
32

Czy istnieje prosty, wbudowany sposób drukowania listy 2D w języku Python jako macierzy 2D?Dość drukowana lista pytań w formacie 2D

Więc tak:

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

stałoby się coś

A B 
C D 

znalazłem moduł pprint, ale nie wydaje się, aby robić to, co chcę.

+2

Nazwałbym tę listę 3D. Jeśli chcesz go ściągnąć, "numpy" jest całkiem niezły w tego rodzaju sprawach. – tacaswell

+0

@tcaswell: whoops, racja. Po prostu chcę, żeby była traktowana jako matryca 2D. Zmieniono pytanie, aby uczynić to jednoznacznym geniuszem – houbysoft

Odpowiedz

47

Żeby było ciekawe, spróbujmy z większej matrycy:

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) 

wyjściowa:

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: dla komórek multilinii, coś jak to powinno działać:

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) 

Następnie zastosuj powyższy kod.

Zobacz także http://pypi.python.org/pypi/texttable

+0

! ALE jeśli chcemy mieć wiele linii w każdej komórce tj. Tablicę 3D :) – CpILL

+0

@CpILL: jedną opcją byłoby rozpakowanie 3D w 2D: '[[[a, b, c], [xyz]]] => [ [a, x], [b, y], [c, z]] ", a następnie zastosować powyższe. – georg

+0

masz na myśli przestawić dane? – CpILL

11

Jeśli można użyć Pandy (Python Biblioteka danych Analysis) Można pretty-print 2D macierzy poprzez przekształcenie go w obiekt DataFrame:

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

    0 1 
0 A B 
1 C D 
+6

Chociaż ta odpowiedź jest prawdopodobnie poprawna i przydatna, zaleca się, aby [podać wyjaśnienie wraz z nią] (http://meta.stackexchange.com/q/114762/159034), aby wyjaśnić, w jaki sposób pomaga rozwiązać problem. Staje się to szczególnie przydatne w przyszłości, jeśli nastąpi zmiana (prawdopodobnie niezwiązana ze sobą), która powoduje, że przestaje działać, a użytkownicy muszą zrozumieć, w jaki sposób działał. –

+0

Dokładnie tego chciałem. Dzięki. – Arvind

0

Bardziej lekkie podejście niż pandas jest stosowanie modułu 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) 

wydajność:

A B 
C D 

prettytable ma wiele opcji formatowania danych wyjściowych na różne sposoby.

Zobacz https://code.google.com/p/prettytable/ uzyskać więcej informacji

7

zawsze można użyć numpy

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

Zobacz poniższy kod.

# 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

Spróbuj tego i zobacz, co się dzieje, nie brzmi jak odpowiedź. Przejrzyj: https: // stackoverflow.com/help/how-to-answer – Daniel