我有以下列表,其中包含子列表
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循环自动完成它,但我没有找到任何与如何做的相关。
任何提示都受到欢迎。
感谢。
答案 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
格式说明符。