是否有一种简单的内置方法将2D Python列表打印为2D矩阵?
所以这:
[["A", "B"], ["C", "D"]]
Run Code Online (Sandbox Code Playgroud)
会变得像
A B
C D
Run Code Online (Sandbox Code Playgroud)
我找到了pprint模块,但它似乎没有做我想要的.
geo*_*org 63
为了让事情变得有趣,让我们尝试使用更大的矩阵:
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)
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
UPD:对于多行单元格,这样的东西应该有效:
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)
Run Code Online (Sandbox Code Playgroud)
然后应用上面的代码.
另见http://pypi.python.org/pypi/texttable
ste*_*ten 28
如果您可以使用Pandas(Python数据分析库),您可以通过将其转换为DataFrame对象来漂亮地打印2D矩阵:
from pandas import *
x = [["A", "B"], ["C", "D"]]
print DataFrame(x)
0 1
0 A B
1 C D
Run Code Online (Sandbox Code Playgroud)
Sou*_*nda 21
你可以随时使用numpy
import numpy as np
A = [['A', 'B'], ['C', 'D']]
print(np.matrix(A))
Run Code Online (Sandbox Code Playgroud)
Mao*_*kai 11
没有任何第三方库,你可以这样做:
matrix = [["A", "B"], ["C", "D"]]
print(*matrix, sep="\n")
Run Code Online (Sandbox Code Playgroud)
输出:
['A', 'B']
['C', 'D']
Run Code Online (Sandbox Code Playgroud)
Rod*_*pez 10
对于Python 3:
matrix = [["A", "B"], ["C", "D"]]
print('\n'.join(['\t'.join([str(cell) for cell in row]) for row in matrix]))
Run Code Online (Sandbox Code Playgroud)
产量
A B
C D
Run Code Online (Sandbox Code Playgroud)
只是为了提供一个更简单的替代方案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)
Run Code Online (Sandbox Code Playgroud)
解释
*rowunpacks row,例如,print("A", "B")当rowis时调用["A", "B"]。
注意
只有当每列具有相同的宽度时,两个答案的格式才会很好。要更改分隔符,请使用sep关键字。例如,
for row in matrix:
print(*row, sep=', ')
Run Code Online (Sandbox Code Playgroud)
将打印
A, B
C, D
Run Code Online (Sandbox Code Playgroud)
反而。
没有 for 循环的单行
print(*(' '.join(row) for row in matrix), sep='\n')
Run Code Online (Sandbox Code Playgroud)
' '.join(row) for row in matrix)为每一行返回一个字符串,例如A Bwhen rowis ["A", "B"]。
*(' '.join(row) for row in matrix), sep='\n')解包返回序列的生成器'A B', 'C D',以便print('A B', 'C D', sep='\n')为matrix给定的示例调用。
如果您使用的是 Notebook/IPython 环境,那么 sympy 可以使用 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))))
Run Code Online (Sandbox Code Playgroud)
比pandas使用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)
Run Code Online (Sandbox Code Playgroud)
产量:
A B
C D
Run Code Online (Sandbox Code Playgroud)
prettytable 有很多选项可以以不同的方式格式化输出。
有关详细信息,请参阅https://code.google.com/p/prettytable/