有没有一种简单的内置方法可以将Python的二维列表打印成二维矩阵?
像这样:
[["A", "B"], ["C", "D"]]
会变成类似于以下的内容
A B
C D
我找到了pprint
模块,但它似乎不能满足我的需求。
让事情变得有趣,我们来试试更大的矩阵:
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)
输出:
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
更新:对于多行单元格,可以采用以下方式:
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)
然后应用上述代码。
[[[a,b,c],[xyz]]]=>[[a,x],[b,y],[c,z]]
,然后应用上述方法。 - georg对于没有第三方库的Python 3:
matrix = [["A", "B"], ["C", "D"]]
print('\n'.join(['\t'.join([str(cell) for cell in row]) for row in matrix]))
输出
A B
C D
如果您会使用Pandas(Python数据分析库),那么您可以通过将其转换为DataFrame对象来漂亮地打印二维矩阵:
from pandas import *
x = [["A", "B"], ["C", "D"]]
print DataFrame(x)
0 1
0 A B
1 C D
您总是可以使用numpy:
import numpy as np
A = [['A', 'B'], ['C', 'D']]
print(np.matrix(A))
输出:
[['A' 'B']
['C' 'D']]
print(np.array(A))
来避免警告。 - lingjiankong为了提供一个更简单的替代方案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)
解释
*row
解包 row
,所以当 row
是 ["A", "B"]
时,会调用 print("A", "B")
。
注意
只有每列具有相同的宽度,两个答案才能得到良好的格式化。要更改分隔符,请使用 sep
关键字。例如,
for row in matrix:
print(*row, sep=', ')
will print
A, B
C, D
不使用for循环的单行代码实现
print(*(' '.join(row) for row in matrix), sep='\n')
' '.join(row) for row in matrix)
会为每一行返回一个字符串,例如当row
是["A", "B"]
时,它会返回A B
。
*(' '.join(row) for row in matrix), sep='\n')
展开生成器返回序列'A B', 'C D'
,因此对于给定的示例matrix
,会调用print('A B', 'C D', sep='\n')
。
不使用任何第三方库,你可以这样实现:
matrix = [["A", "B"], ["C", "D"]]
print(*matrix, sep="\n")
输出:
['A', 'B']
['C', 'D']
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)
yields:
A B
C D
< p >prettytable
有很多选项可以以不同的方式格式化您的输出。
请参见https://code.google.com/p/prettytable/获取更多信息。
我还建议使用tabulate,它可以选择性地打印标题:
from tabulate import tabulate
lst = [['London', 20],['Paris', 30]]
print(tabulate(lst, headers=['City', 'Temperature']))
:
City Temperature
------ -------------
London 20
Paris 30
一种更简单的方法是使用print()
中的"end"参数。这只能在Python(和许多其他语言)中起作用,因为所有字母的宽度都相同。
table = [["A", "BC"], ["DEFG", "HIJ"]]
for row in table:
for col in row:
spaces = 5 #adjust as needed
spaces -= (len(col) - 1) #spaces everything out
print(col, end = " " * spaces)
print() #add line break before next row
"end"函数设置在参数结束后将打印什么,因为默认值是\n
。
正如您所看到的,我根据每行中每个项目的长度偏移了有多少个空格。
numpy
对这种情况非常擅长。 - tacaswellprint
有一种非常巧妙的方法来处理这样的事情。有一个end = foo
参数,允许您自定义在打印语句结尾处放置什么内容(默认为\n
)。请参考我的答案以备将来参考:https://dev59.com/YGYs5IYBdhLWcg3wAfPO#73229153。 - ᴇɴᴅᴇʀᴍᴀɴfor x in your_list: print(x)
。 - Petr L.