漂亮的打印二维列表?

问题描述 投票:0回答:12

是否有一种简单的内置方法可以将 2D Python 列表打印为 2D 矩阵?

所以这个:

[["A", "B"], ["C", "D"]]

会变成类似的东西

A    B
C    D

我找到了

pprint
模块,但它似乎没有达到我想要的效果。

python matrix
12个回答
100
投票

为了让事情变得有趣,让我们尝试使用更大的矩阵:

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


70
投票

对于没有任何第三方库的 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

58
投票

如果您可以使用 pandas(Python 数据分析库),您可以通过将其转换为 DataFrame 对象来漂亮地打印 2D 矩阵:

import pandas as pd
x = [["A", "B"], ["C", "D"]]
print(pd.DataFrame(x))


   0  1
0  A  B
1  C  D

41
投票

您始终可以使用numpy

import numpy as np
A = [['A', 'B'], ['C', 'D']]
print(np.matrix(A))

输出:

[['A' 'B']
 ['C' 'D']]

13
投票

只是为了提供一个更简单的替代方案

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
,因此,例如,当
print("A", "B")
row
时,会调用
["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)
为每一行返回一个字符串,例如
A B
row
["A", "B"]
时。

*(' '.join(row) for row in matrix), sep='\n')
解包返回序列
'A B', 'C D'
的生成器,以便为给定的示例
print('A B', 'C D', sep='\n')
调用
matrix


11
投票

没有任何第三方库,你可以这样做:

matrix = [["A", "B"], ["C", "D"]]
print(*matrix, sep="\n")

输出:

['A', 'B']
['C', 'D']

6
投票

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/ 了解更多信息


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))))


3
投票

我还推荐tabulate,它也可以选择打印标题:

from tabulate import tabulate

lst = [['London', 20],['Paris', 30]]
print(tabulate(lst, headers=['City', 'Temperature']))

City      Temperature
------  -------------
London             20
Paris              30

1
投票

更简单的方法是使用

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

如你所见,我根据每行中每个项目的长度偏移了多少个空格。


0
投票

您可以更新

print
end=' '
,以便它打印空格而不是 ' ' 在内循环和外循环中可以有
print()
.

a=[["a","b"],["c","d"]]
for i in a:
  for j in i:
    print(j, end=' ')
  print()

我从这里找到了这个解决方案。


-4
投票

请参阅以下代码。

# 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]
© www.soinside.com 2019 - 2024. All rights reserved.