漂亮的打印二维列表?
Posted
技术标签:
【中文标题】漂亮的打印二维列表?【英文标题】:Pretty print 2D list? 【发布时间】:2012-10-24 06:25:34 【问题描述】:是否有一种简单的内置方法可以将 2D Python 列表打印为 2D 矩阵?
所以这个:
[["A", "B"], ["C", "D"]]
会变成这样的
A B
C D
我找到了pprint
模块,但它似乎没有达到我想要的效果。
【问题讨论】:
我会称之为 3D 列表。如果你愿意加入,numpy
对这类事情还算不错。
在***.com/a/65878050/13600624查看我的回答。
【参考方案1】:
您可以更新print
的end=' '
,以便在内循环中打印空格而不是'\n',而外循环可以有print()
。
a=[["a","b"],["c","d"]]
for i in a:
for j in i:
print(j, end=' ')
print()
我从here 找到了这个解决方案。
【讨论】:
【参考方案2】:我还推荐tabulate,它也可以选择打印标题:
from tabulate import tabulate
lst = [['London', 20],['Paris', 30]]
print(tabulate(lst, headers=['City', 'Temperature']))
:
City Temperature
------ -------------
London 20
Paris 30
【讨论】:
【参考方案3】:如果您使用的是 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))))
【讨论】:
【参考方案4】:对于没有任何第三方库的 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
【讨论】:
在这里被低估的答案。效果很好,保持原生,一行 FTW。 我唯一的遗憾是,我只能为这个答案投一票【参考方案5】:只是为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=', ')
将打印
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
。
【讨论】:
好东西,哎。【参考方案6】:您可以随时使用numpy:
import numpy as np
A = [['A', 'B'], ['C', 'D']]
print(np.matrix(A))
输出:
[['A' 'B']
['C' 'D']]
【讨论】:
显示输出以与其他解决方案进行比较将是一个“很高兴” 使用print(np.array(A))
避免警告【参考方案7】:
见以下代码。
# 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]
【讨论】:
试试这个,看看会发生什么听起来不像是一个答案。请查看:***.com/help/how-to-answer【参考方案8】:如果您可以使用 Pandas(Python 数据分析库),您可以通过将其转换为 DataFrame 对象来漂亮地打印 2D 矩阵:
from pandas import *
x = [["A", "B"], ["C", "D"]]
print DataFrame(x)
0 1
0 A B
1 C D
【讨论】:
虽然此答案可能是正确且有用的,但如果您 include some explanation along with it 解释它如何帮助解决问题,则最好。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。 这正是我想要的。谢谢。【参考方案9】:比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)
产量:
A B
C D
prettytable
有很多选项可以以不同方式格式化您的输出。
更多信息请见https://code.google.com/p/prettytable/
【讨论】:
【参考方案10】:为了让事情变得有趣,让我们尝试一个更大的矩阵:
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
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)
然后应用上面的代码。
另见http://pypi.python.org/pypi/texttable
【讨论】:
天才!但是,如果我们想要每个单元格内有多条线,即 3D 数组 :) @CpILL:一种选择是将 3D 解压缩为 2D:[[[a,b,c],[xyz]]]=>[[a,x],[b,y],[c,z]]
,然后应用上述内容。
你的意思是透视数据?
@CpILL:添加了一个示例。
我们如何将表格限制为前 10 个值?以上是关于漂亮的打印二维列表?的主要内容,如果未能解决你的问题,请参考以下文章