漂亮的打印2D Python列表

hou*_*oft 55 python matrix

是否有一种简单的内置方法将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)

  • 虽然这个答案可能是正确和有用的,但如果您[包括一些解释](http://meta.stackexchange.com/q/114762/159034)来解释它如何帮助解决问题则是首选.如果存在导致其停止工作的变化(可能不相关)并且用户需要了解它曾经如何工作,这在将来变得特别有用. (9认同)
  • 这正是我想要的.谢谢. (3认同)

Sou*_*nda 21

你可以随时使用numpy

import numpy as np
A = [['A', 'B'], ['C', 'D']]
print(np.matrix(A))
Run Code Online (Sandbox Code Playgroud)

  • 显示输出以与其他解决方案进行比较将是一个“不错的选择” (2认同)

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)


Ano*_*ous 7

只是为了提供一个更简单的替代方案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给定的示例调用。


ZSG*_*ZSG 6

如果您使用的是 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)

在此输入图像描述


Dov*_*eld 5

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/