如何自动以表格方式格式化子列表?

时间:2017-07-29 16:09:23

标签: python-3.x formatting nested-lists

我有以下列表,其中包含子列表

tableData = [['apples', 'oranges', 'cherries', 'banana'],['Alice', 'Bob', 'Carol', 'David'], ['dogs', 'cats', 'moose', 'goose']]

我的目标是以那种方式格式化

  apples    Alice     dogs
 oranges      Bob     cats
cherries    Carol    moose
  banana    David    goose

以下代码执行此操作

In [55]: for nested_list in zip(*tableData):
             print("{:>9} {:>9} {:>9}".format(*nested_list))

但是,我需要手动指定每个子列表的格式。

我一直试图找到一种方法,使用for循环自动完成它,但我没有找到任何与如何做的相关。

任何提示都受到欢迎。

感谢。

2 个答案:

答案 0 :(得分:1)

这个怎么样:

for line in zip(*tableData):
    for word in line:
        print("{:>9}".format(word), end=' ')
    print()

解释

如果print()不存在,则所有子列表都将放在一行中

  apples     Alice      dogs   oranges       Bob      cats  cherries     Carol     moose    banana     David     goose

print()允许换行

答案 1 :(得分:1)

如果您只想使用{:>9}作为具有任意列数的格式代码,请尝试以下操作:

fieldFormat = ' '.join(['{:>9}'] * len(tableData))
for nestedList in zip(*tableData):
    print(fieldFormat.format(*nestedList))

这只是创建一个{:>9}格式说明符列表,一个用于tableData中的每一列,然后将它们与空格连接在一起。

如果您想自动计算字段宽度,可以执行以下操作:

fieldWidths = [max(len(word) for word in col) for col in tableData]
fieldFormat = ' '.join('{{:>{}}}'.format(wid) for wid in fieldWidths)
for nestedList in zip(*tableData):
    print(fieldFormat.format(*nestedList))

fieldWidths是从列表推导生成的,用于计算每列中每个单词的最大长度。从内到外:

(len(word) for word in col)

这是一个生成col中每个单词长度的生成器。

max(len(word) for word in col)

将生成器(或任何可迭代的)送入max将计算迭代生成的所有内容的最大值。

[max(len(word) for word in col) for col in tableData]

此列表理解产生col中每列tableData数据中所有字词的最大长度。

然后通过将fieldFormat转换为格式说明符来生成

fieldWidths。再次从内部:

'{{:>{}}}'.format(wid)

这会将wid格式化为{:>#}格式。 {{是一种让格式说明符生成{的方法;同样,}}会产生}。中间的{}实际上是使用wid格式化的。

('{{:>{}}}'.format(wid) for wid in fieldWidths)

这是一个生成器函数,它对fieldWidths中列出的每个宽度执行上述格式化。

fieldFormat = ' '.join('{{:>{}}}'.format(wid) for wid in fieldWidths)

这只是将这些格式与中间的空格连接起来创建fieldFormat格式说明符。

相关问题