多列输出函数 《python 核心编程》习题6-19
多列输出
有任意项的序列或其他容器,把它们等距离分列显示。由调用者提供数据和输出格式。
例如,如果你传入100个项并定义3列输出,按照需要的模式并显示这些数据。这种情况下应该是两列显示33个项,最后一列显示34个。
你可以让用户选择水平排序或者垂直排序
代码
"""
多列输出函数,如果不能刚好排下则排到后面的几列
如101项 按 3 列输出,则第一列为33个,第二列和第三列为34个
"""
# @Time: 2016/12/21 11:35
# @Author:[email protected]
# @File: t6_19.py
def print_table(container, column_count=1,row_sort=True ):
""" 按照指定列数输出一个可遍历容器
container: 容器
column_count: 列数
row_sort: {True:按行排序 | False:按列排序} """
lens = len(container) # 容器的长度
row_count = lens // column_count # 全部填满的行数
tail=lens%column_count # 最后留下的小尾巴的数量
spaces = column_count -tail # 最后一行的空位数量
if row_sort:
for i in range(lens-tail): # 先把满的行输出
print("%10d"%container[i],end="")
if i%column_count==column_count-1:
print("\n",end="")
for i in range(spaces): # 输出最后一行的空格
print("%10s"%"",end="")
for i in range(lens-tail,lens): # 输出最后一行剩下的数
print("%10d" % container[i], end="")
print("\n",end="")
else:
strings=["" for r in range(row_count+1)] # 定义一个列表存储每行的输出
i=0
r=0
# 本算法顺次遍历每一列,然后判断如果为最后一行并且还有没输出的空格就输出空格
spaces = column_count - tail # 存储最后一行的空格数
while i<lens: # 遍历每一个元素
if r==row_count and spaces: # 如果是最后一行且还有没输出的空格
strings[r]+="%10s"%"" # 在最后一行输出空格
spaces-=1 # 未输出的空格数量-1
else:
strings[r]+="%10d"%container[i] # 如果不是最后一行或者空格已经输出完毕,正常输出
i+=1 # 移动到下一个
r+=1 # 移动到下一列
if r==row_count+1: # 如果列数已经超出限制,返回第一列
r=0
print("\n".join(strings))
样例:
print_table(range(103),7,True) 用7列 按行排序,输出0-102 共103个数字 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 print_table(range(102), 7, False) # 用7列,按列排序 输出 0-101 共102个数字 0 14 28 42 57 72 87 1 15 29 43 58 73 88 2 16 30 44 59 74 89 3 17 31 45 60 75 90 4 18 32 46 61 76 91 5 19 33 47 62 77 92 6 20 34 48 63 78 93 7 21 35 49 64 79 94 8 22 36 50 65 80 95 9 23 37 51 66 81 96 10 24 38 52 67 82 97 11 25 39 53 68 83 98 12 26 40 54 69 84 99 13 27 41 55 70 85 100 56 71 86 101