Python 循环浏览字典并以特定格式打印
我有以下字典:Python 循环浏览字典并以特定格式打印,python,dictionary,Python,Dictionary,我有以下字典: # a small DB of people who stole my books dic = { 'Cohen' : 'Calvino' 'Evertt' 'Borges', 'Larry' : 'The Bible', 'Volanski' : 'Phone Book' } # here's an abortive attempt to print it in a CSV format for k in dic.keys(): print (k
# a small DB of people who stole my books
dic = {
'Cohen' : 'Calvino' 'Evertt' 'Borges',
'Larry' : 'The Bible',
'Volanski' : 'Phone Book'
}
# here's an abortive attempt to print it in a CSV format
for k in dic.keys():
print (k, '\t')
for v in dic.keys():
print (dic[v], ' ')
这是丑陋的输出:
Volanski
Phone Book
CalvinoEverttBorges
The Bible
Cohen
Phone Book
CalvinoEverttBorges
The Bible
Larry
Phone Book
CalvinoEverttBorges
The Bible
Cohen Larry Volanski
Calvino The Bible Phone Book
Evertt
Borgest
我希望输出是这样的:
Volanski
Phone Book
CalvinoEverttBorges
The Bible
Cohen
Phone Book
CalvinoEverttBorges
The Bible
Larry
Phone Book
CalvinoEverttBorges
The Bible
Cohen Larry Volanski
Calvino The Bible Phone Book
Evertt
Borgest
(只有选项卡分隔,我没有在这里显示)关键是您没有以正确的方式开始定义数据。Python对定义第一个条目的方式的理解与它的打印方式完全相同:一个字符串。如果需要多个元素,则需要将元素定义为包含多个元素:
dic = {
'Cohen' : ['Calvino', 'Evertt', 'Borges'],
'Larry' : ['The Bible'],
'Volanski' : ['Phone Book']
}
现在,您可以简单地执行以下操作:
for key, value in dic.items():
print "%s\t%s" % (key, "\t".join(value))
编辑好的,没有看到您希望名称在顶部,标题向下。有点棘手,但这可以做到:
import itertools
print "\t".join(dic.keys())
for books in itertools.izip_longest(*dic.values(), fillvalue=''):
print "\t".join(books)
你可以计算出更整洁的格式
dic = {'Cohen' : ['Calvino', 'Evertt', 'Borges'],
'Larry' : ['The Bible'],
'Volanski' : ['Phone Book']}
# Get max name size
mx_nm_len = len(max(dic,key=len))
mx_bk_len = max([len(max(books, key=len)) for books in dic.itervalues()])
# Store max name size + 1
mx = max([mx_nm_len, mx_bk_len]) + 1
# Store people
keys = dic.keys()
# Create generic format code to print neat list
fmat = ("%-"+str(mx)+"s")*len(keys)
# Print header line
print fmat % tuple(keys)
# similar to zip command but works for any number of lists
# Assumes all dic.values() are lists
# "zips" to longest list and uses None when any given list runs out of values
books = map(None, *dic.values())
# replaces None values in row outputs with empty strings and prints result using
# string format code (fmat)
for row in books:
row = tuple([book if book!= None else "" for book in row])
print fmat % row
此解决方案可确保对输出进行排序,并确保项目在正确的列中结束。我使用
expandtabs()
来设置选项卡长度,使其非常漂亮
import itertools
dic = {'Cohen':['Calvino', 'Evertt','Borges'],'Larry': ['The Bible'], 'Volanski' :['Phone Book']}
sorted_keys = sorted(dic.keys())
for name in sorted_keys:
print (name+'\t').expandtabs(15),
print
zippp = list(itertools.izip_longest(*[dic[i] for i in sorted_keys]))
for i in xrange(len(zippp[0])):
for j in xrange(len(zippp)):
if zippp[i][j]:
print (zippp[i][j]+'\t').expandtabs(15),
print
产生:
Cohen Larry Volanski
Calvino The Bible Phone Book
Evertt
Borges
是的,这就是我想要的样子;)谢谢你,菲利克斯!首先,使用list,比如
['Calvino','Evertt','Borges']
我明白了。但是现在输出看起来是按行格式化的,而不是按列格式化的:沃兰斯基电话簿Cohen Calvino Evertt Borges Larry BibleGood解决方案,但空行会导致转换。。。使用ljust
可能会很好地使用从值中最长字符串计算的固定填充…@fraxel提供了一个保证,如果在访问之间不修改字典,它们将给出相同的顺序:“if items()、key()、values()、iteritems()、iterkeys()和itervalues()调用时不需要对字典进行任何修改,列表将直接对应。”@Daniel Roseman-非常感谢,我不知道,知道这些非常有用(但可能有点危险…)字典键可能应该排序,python不保证排序顺序。你可以用itertools来做这个清理,但是又错过了所有的乐趣和理解:这很好,非常感谢你的评论,否则我就不会理解代码了!没问题,很高兴它很有用。“最棘手”的是我对map函数的使用。添加更多注释以帮助解释其目的。