我有一个标签列表和数据如下。
['id', 'Version', 'chip_name', 'xversion', 'device', 'opt_param', 'place_effort'] [1, 1.0, u'virtex2', u'xilinx11.5', u'xc5vlx50', u'Speed', u'High']
我需要将它们打印到控制台中。为此,我在列表上进行迭代,并使用制表符('\ t')打印出每个元素。
但不幸的是,结果并不那么漂亮。
number of data 1 and number of column 7 id Version chip_name xversion device opt_param place_effort 1 1.0 virtex2 xilinx11.5 xc5vlx50 Speed High
标签和数据的字符串长度变化很大,并且它没有很好地对齐。
Python有这个问题的解决方案吗?
Mike DeSimone的回答,我可以制作出可以用于我的目的的漂亮打印机。 valueResults是一个duple列表。
labels = queryResult.names
valueResults = queryResult.result
# get the maximum width
allData = valueResults
allData.insert(0,labels)
transpose = zip(*valueResults) # remove the sequence as a parameter
#print transpose
for value in transpose:
# value is integer/float/unicode/str, so make it length of str
newValue = [len(str(i)) for i in value]
columnWidth = max(newValue)
columnWidths.append(columnWidth)
dividers.append('-' * columnWidth)
dblDividers.append('=' * columnWidth)
label = value[0]
paddedLabels.append(label.center(columnWidth))
paddedString = ""
for values in valueResults[1:]:
paddedValue = []
for i, value in enumerate(values):
svalue = str(value)
columnWidth = columnWidths[i]
paddedValue.append(svalue.center(columnWidth))
paddedString += '| ' + ' | '.join(paddedValue) + ' |' + '\n'
string += '+-' + '-+-'.join(dividers) + '-+' + '\n'
string += '| ' + ' | '.join(paddedLabels) + ' |' + '\n'
string += '+=' + '=+='.join(dblDividers) + '=+' + '\n'
string += paddedString
string += '+-' + '-+-'.join(dividers) + '-+' + '\n'
这就是结果。
+----+---------+-----------+------------+----------+-----------+--------------+ | id | Version | chip_name | xversion | device | opt_param | place_effort | +====+=========+===========+============+==========+===========+==============+ | 1 | 1.0 | virtex2 | xilinx11.5 | xc5vlx50 | Speed | High | | 2 | 1.0 | virtex2 | xilinx11.5 | xc5vlx50 | Speed | High | +----+---------+-----------+------------+----------+-----------+--------------+
感谢您的帮助。
答案 0 :(得分:4)
使用ljust在打印内容之前填充内容。
import sys
def maxwidth(table, index):
"""Get the maximum width of the given column index"""
return max([len(str(row[index])) for row in table])
def pprint_table(table):
colpad = []
for i in range(len(table[0])):
colpad.append(maxwidth(table, i))
for row in table:
print str(row[0]).ljust(colpad[0] + 1),
for i in range(1, len(row)):
col = str(row[i]).rjust(colpad[i] + 2)
print "", col,
print ""
a = ['id', 'Version', 'chip_name', 'xversion', 'device', 'opt_param', 'place_effort']
b = [1, 1.0, u'virtex2', u'xilinx11.5', u'xc5vlx50', u'Speed', u'High']
# Put it in the table
c = [a, b]
pprint_table(c)
输出:
id Version chip_name xversion device opt_param place_effort
1 1.0 virtex2 xilinx11.5 xc5vlx50 Speed High
答案 1 :(得分:3)
这样的事情:
labels = ['id', 'Version', 'chip_name', 'xversion', 'device', 'opt_param',
'place_effort']
values = [1, 1.0, u'virtex2', u'xilinx11.5', u'xc5vlx50', u'Speed', u'High']
paddedLabels = []
paddedValues = []
for label, value in zip(labels, values):
value = str(value)
columnWidth = max(len(label), len(value))
paddedLabels.append(label.center(columnWidth))
paddedValues.append(value.center(columnWidth))
print ' '.join(paddedLabels)
print ' '.join(paddedValues)
输出:
id Version chip_name xversion device opt_param place_effort
1 1.0 virtex2 xilinx11.5 xc5vlx50 Speed High
如果你想获得幻想,请将它reStructuredText - 准备好:
labels = ['id', 'Version', 'chip_name', 'xversion', 'device', 'opt_param',
'place_effort']
values = [1, 1.0, u'virtex2', u'xilinx11.5', u'xc5vlx50', u'Speed', u'High']
paddedLabels = []
paddedValues = []
dividers = []
dblDividers = []
for label, value in zip(labels, values):
value = str(value)
columnWidth = max(len(label), len(value))
paddedLabels.append(label.center(columnWidth))
paddedValues.append(value.center(columnWidth))
dividers.append('-' * columnWidth)
dblDividers.append('=' * columnWidth)
print '+-' + '-+-'.join(dividers) + '-+'
print '| ' + ' | '.join(paddedLabels) + ' |'
print '+=' + '=+='.join(dblDividers) + '=+'
print '| ' + ' | '.join(paddedValues) + ' |'
print '+-' + '-+-'.join(dividers) + '-+'
输出:
+----+---------+-----------+------------+----------+-----------+--------------+
| id | Version | chip_name | xversion | device | opt_param | place_effort |
+====+=========+===========+============+==========+===========+==============+
| 1 | 1.0 | virtex2 | xilinx11.5 | xc5vlx50 | Speed | High |
+----+---------+-----------+------------+----------+-----------+--------------+
答案 2 :(得分:3)
你可以试试这个
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
... print '{0:10} ==> {1:10d}'.format(name, phone)
...
Jack ==> 4098
Dcab ==> 7678
Sjoerd ==> 4127
来自http://docs.python.org/tutorial/inputoutput.html
:
之后的整数是填充。
或更好
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print ('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
... 'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
答案 3 :(得分:2)
您可以使用现成的解决方案:: prettytable A simple Python library for easily displaying tabular data in a visually appealing ASCII table format
其他解决方案,请参阅我的类似问题其他答案:How to extend pretty print module to tables?
答案 4 :(得分:1)
另一个解决方案是根本不使用制表符,并使用空格来调整列宽,也不需要手动填充,因为'%Ns'字符串格式化很方便,例如。
header = ['id', 'Version', 'chip_name', 'xversion', 'device', 'opt_param', 'place_effort']
rows = [[1, 1.0, u'virtex2', u'xilinx11.5', u'xc5vlx50', u'Speed', u'High']]
def print_row(row):
column_width=12
format_str = ("%-"+str(column_width)+"s")*len(row)
print format_str%tuple(row)
print_row(header)
for row in rows:
print_row(row)
<强>输出:强>
id Version chip_name xversion device opt_param place_effort
1 1.0 virtex2 xilinx11.5 xc5vlx50 Speed High
答案 5 :(得分:0)
对于快速解决方案,如果ln是包含所有这些列表的列表,
for l in ln:
print "\t".join([str(x).ljust(10) for x in l])
将打印由制表符分隔的列并左对齐。如果它还不漂亮的话,增加ljust中的值。