打印包装成一定长度的列的网格

时间:2018-07-27 18:29:14

标签: python python-3.x multidimensional-array printing formatting

我正在尝试以一种格式打印二维列表,该格式将每列的长度包装为该列中最长单词的长度(加上2个空格填充)。下面我尝试实现的示例:

null

当前,我的代码几乎实现了此目的,但是如果一行中的项目少于最大项目数,它会保留最后“ n”个列的数量。下面的示例:

t1      thing2   t3            t4
thing5  t6       thingymajig7  thing8
thing9  thing10

到目前为止,这是我代码的一部分:

t1      thing2
thing5  t6
thing9  thing10

我需要添加/更改什么才能阻止它删除不完整的列?

1 个答案:

答案 0 :(得分:0)

问题似乎出在这行:

widths = [max(len(item) for item in col) for col in zip(*rows)]

摘自zip文档:https://docs.python.org/3/library/functions.html#zip

  

最短的可迭代输入耗尽时,迭代器停止。

因此,rows中的每个列表都必须加长到rows中的最长列表的长度,此脚本才能起作用。您可以这样实现:

rows = [['thing1', 'thing2', 'thing3', 't4'], ['t5', 't6', 'thingymajig7', 'thing8'], ['thing9', 'thing10']]

max_row_len = len(max(rows, key=len))

for row in rows:
  row_len = len(row)
  row.extend(['blank' for f in range(max_row_len - row_len)])

widths = [max(len(item) for item in col) for col in zip(*rows)]

for r in rows:
    print("  ".join((item.ljust(width) for item, width in zip(r, widths))))

然后可以将'blank'替换为''