我有一本字典:
d = {1: ["Spices", math.floor(random.gauss(40, 5))],
2: ["Other stuff", math.floor(random.gauss(20, 5))],
3: ["Tea", math.floor(random.gauss(50, 5))],
10: ["Contraband", math.floor(random.gauss(1000, 5))],
5: ["Fruit", math.floor(random.gauss(10, 5))],
6: ["Textiles", math.floor(random.gauss(40, 5))]
}
我想将其打印出来,以便与标题很好地对齐。我可以将标题添加到字典中并始终确保它们排在最前面吗? 我已经看到了几种垂直方式,但是我希望它的最大列宽接近最大str()或int()。
示例:
KEY_的 _ __ _ __ _ 标签的 _ __ _ __ _ ___ 数
1 的 _ __ _ __ _ ___ 香料的 _ __ _ __ _ __ 42个
2 _ __ _ __ _ ___ 其他资料 _ ____ _16
等
显然我甚至不能手动在这个编辑器中执行此操作,但我希望这个想法能够实现。
我也不是真的想要__。只是一个占位符。
谢谢大家。
答案 0 :(得分:50)
您可以使用string formatting:
print "{:<8} {:<15} {:<10}".format('Key','Label','Number')
for k, v in d.iteritems():
label, num = v
print "{:<8} {:<15} {:<10}".format(k, label, num)
<强>输出:强>
Key Label Number
1 Spices 38.0
2 Other stuff 24.0
3 Tea 44.0
5 Fruit 5.0
6 Textiles 37.0
10 Contraband 1000.0
答案 1 :(得分:18)
我一直在寻找具有未知列宽的解决方案来打印数据库表。所以这就是:
def printTable(myDict, colList=None):
""" Pretty print a list of dictionaries (myDict) as a dynamically sized table.
If column names (colList) aren't specified, they will show in random order.
Author: Thierry Husson - Use it as you want but don't blame me.
"""
if not colList: colList = list(myDict[0].keys() if myDict else [])
myList = [colList] # 1st row = header
for item in myDict: myList.append([str(item[col] or '') for col in colList])
colSize = [max(map(len,col)) for col in zip(*myList)]
formatStr = ' | '.join(["{{:<{}}}".format(i) for i in colSize])
myList.insert(1, ['-' * i for i in colSize]) # Seperating line
for item in myList: print(formatStr.format(*item))
样品:
printTable([{'a':123,'bigtitle':456,'c':789},{'a':'x','bigtitle':'y','c':'z'}, \
{'a':'2016-11-02','bigtitle':1.2,'c':78912313213123}], ['a','bigtitle','c'])
输出:
a | bigtitle | c
---------- | -------- | --------------
123 | 456 | 789
x | y | z
2016-11-02 | 1.2 | 78912313213123
在Psycopg上下文中,您可以这样使用它:
curPG.execute("SELECT field1, field2, ... fieldx FROM mytable")
printTable(curPG.fetchall(), [c.name for c in curPG.description])
如果您需要多行行的变体,那么它是:
def printTable(myDict, colList=None, sep='\uFFFA'):
""" Pretty print a list of dictionaries (myDict) as a dynamically sized table.
If column names (colList) aren't specified, they will show in random order.
sep: row separator. Ex: sep='\n' on Linux. Default: dummy to not split line.
Author: Thierry Husson - Use it as you want but don't blame me.
"""
if not colList: colList = list(myDict[0].keys() if myDict else [])
myList = [colList] # 1st row = header
for item in myDict: myList.append([str(item[col] or '') for col in colList])
colSize = [max(map(len,(sep.join(col)).split(sep))) for col in zip(*myList)]
formatStr = ' | '.join(["{{:<{}}}".format(i) for i in colSize])
line = formatStr.replace(' | ','-+-').format(*['-' * i for i in colSize])
item=myList.pop(0); lineDone=False
while myList:
if all(not i for i in item):
item=myList.pop(0)
if line and (sep!='\uFFFA' or not lineDone): print(line); lineDone=True
row = [i.split(sep,1) for i in item]
print(formatStr.format(*[i[0] for i in row]))
item = [i[1] if len(i)>1 else '' for i in row]
样品:
sampleDict = [{'multi lines title': 12, 'bigtitle': 456, 'third column': '7 8 9'},
{'multi lines title': 'w x y z', 'bigtitle': 'b1 b2', 'third column': 'z y x'},
{'multi lines title': '2', 'bigtitle': 1.2, 'third column': 78912313213123}]
printTable(sampleDict, sep=' ')
输出:
bigtitle | multi | third
| lines | column
| title |
---------+-------+---------------
456 | 12 | 7
| | 8
| | 9
---------+-------+---------------
b1 | w | z
b2 | x | y
| y | x
| z |
---------+-------+---------------
1.2 | 2 | 78912313213123
如果没有sep
参数,printTable(sampleDict)
会为您提供:
bigtitle | multi lines title | third column
---------+-------------------+---------------
456 | 12 | 7 8 9
b1 b2 | w x y z | z y x
1.2 | 2 | 78912313213123
答案 2 :(得分:2)
我更喜欢熊猫DataFrame
import pandas as pd
data = {'Name': ['a', 'b', 'c'], 'Age': [10, 11, 12]}
df = pd.DataFrame(data)
print(df)
输出:
Name Age
0 a 10
1 b 11
2 c 12
进一步了解如何打印漂亮的数据帧here
答案 3 :(得分:1)
基于Le Droid的代码,我为每行添加了分隔符“-”,这可以使打印更加清晰。谢谢,Le Droid。
def printTable(myDict, colList=None):
if not colList:
colList = list(myDict[0].keys() if myDict else [])
myList = [colList] # 1st row = header
for item in myDict:
myList.append([str(item[col] or '') for col in colList])
#maximun size of the col for each element
colSize = [max(map(len,col)) for col in zip(*myList)]
#insert seperating line before every line, and extra one for ending.
for i in range(0, len(myList)+1)[::-1]:
myList.insert(i, ['-' * i for i in colSize])
#two format for each content line and each seperating line
formatStr = ' | '.join(["{{:<{}}}".format(i) for i in colSize])
formatSep = '-+-'.join(["{{:<{}}}".format(i) for i in colSize])
for item in myList:
if item[0][0] == '-':
print(formatSep.format(*item))
else:
print(formatStr.format(*item))
输出:
-----------+----------+---------------
a | bigtitle | c
-----------+----------+---------------
123 | 456 | 789
-----------+----------+---------------
x | y | z
-----------+----------+---------------
2016-11-02 | 1.2 | 78912313213123
-----------+----------+---------------
答案 4 :(得分:0)
String formatting提供了一个不错的简单解决方案。这个答案是对@Ashwini的不错答案的Python 3的更新。
str_fmt = "{:<8} {:<15} {:<10}"
print(str_fmt.format('Key','Label','Number'))
for k, v in d.items():
label, num = v
print(str_fmt.format(k, label, num))
答案 5 :(得分:-1)
您可以使用ljust或rjust字符串方法:
print key.ljust(10), label.ljust(30), number.ljust(20)