Is there a simple, built-in way to print a 2D Python list as a 2D matrix?
So this:
[["A", "B"], ["C", "D"]]
would become something like
A B C D
I found the pprint module, but it doesn’t seem to do what I want.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
To make things interesting, let’s try with a bigger matrix:
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: for multiline cells, something like this should work:
text = [
["Ah!", "We do havensome Camembert", "sir"],
["It's a bit", "runny", "sir"],
["Well,", "as a matternof fact it's", "very runny,nsir"],
["I think it'snrunnier", "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)
And then apply the above code.
See also http://pypi.python.org/pypi/texttable
Method 2
If you can use Pandas (Python Data Analysis Library) you can pretty-print a 2D matrix by converting it to a DataFrame object:
from pandas import * x = [["A", "B"], ["C", "D"]] print DataFrame(x) 0 1 0 A B 1 C D
Method 3
For Python 3 without any third part libs:
matrix = [["A", "B"], ["C", "D"]]
print('n'.join(['t'.join([str(cell) for cell in row]) for row in matrix]))
Output
A B C D
Method 4
You can always use numpy:
import numpy as np A = [['A', 'B'], ['C', 'D']] print(np.matrix(A))
Output:
[['A' 'B'] ['C' 'D']]
Method 5
Just to provide a simpler alternative to print('n'.join(['t'.join([str(cell) for cell in row]) for row in matrix])) :
matrix = [["A", "B"], ["C", "D"]]
for row in matrix:
print(*row)
Explanation
*row unpacks row, so print("A", "B") is called when row is ["A", "B"], for example.
Note
Both answers will only be formatted nicely if each column has the same width. To change the delimiter, use the sep keyword. For example,
for row in matrix:
print(*row, sep=', ')
will print
A, B C, D
instead.
One-liner without a for loop
print(*(' '.join(row) for row in matrix), sep='n')
' '.join(row) for row in matrix) returns a string for every row, e.g. A B when row is ["A", "B"].
*(' '.join(row) for row in matrix), sep='n') unpacks the generator returning the sequence 'A B', 'C D', so that print('A B', 'C D', sep='n') is called for the example matrix given.
Method 6
A more lightweight approach than pandas is to use the prettytable module
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)
yields:
A B C D
prettytable has lots of options to format your output in different ways.
See https://code.google.com/p/prettytable/ for more info
Method 7
If you’re using a Notebook/IPython environment, then sympy can print pleasing matrices using IPython.display:
import numpy as np from sympy import Matrix, init_printing init_printing() print(np.random.random((3,3))) display(np.random.random((3,3))) display(Matrix(np.random.random((3,3))))
Method 8
Without any third party libraries, you could do:
matrix = [["A", "B"], ["C", "D"]] print(*matrix, sep="n")
Output:
['A', 'B'] ['C', 'D']
Method 9
I would also recommend tabulate, which can optionally print headers too:
from tabulate import tabulate lst = [['London', 20],['Paris', 30]] print(tabulate(lst, headers=['City', 'Temperature']))
:
City Temperature ------ ------------- London 20 Paris 30
Method 10
You can update print‘s end=' ' so that it prints space instead of ‘n’ in the inner loop and outer loop can have print().
a=[["a","b"],["c","d"]]
for i in a:
for j in i:
print(j, end=' ')
print()
I found this solution from here.
Method 11
See the following code.
# 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]
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0
