我正在尝试将列表写入具有特定列数的行。例如,请列出:
data = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
我想用这样的格式写出来:
1.0, 2.0, 3.0,
4.0, 5.0, 6.0,
7.0, 8.0, 9.0,
10.0,
我尝试过以下代码;但是,只能打印第一行:
strformat = ['{'+str(i)+':>5.1f},' for i in range(0,3)]
strformat = ''.join(strformat).lstrip().rstrip() + '\n'
print strformat.format(*[x for x in data])
提前致谢!
答案 0 :(得分:1)
def chunks(seq, n):
# http://stackoverflow.com/a/312464/190597 (Ned Batchelder)
""" Yield successive n-sized chunks from seq."""
for i in xrange(0, len(seq), n):
yield seq[i:i + n]
data = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
for row in chunks(data, 3):
print(', '.join(map(str, row)))
产量
1.0, 2.0, 3.0
4.0, 5.0, 6.0
7.0, 8.0, 9.0
10.0
或者,或许更接近您的代码:
strformat = '\n'.join(
', '.join('{:>5.1f}' for item in row)
for row in chunks(data, 3))
print(strformat.format(*data))
答案 1 :(得分:1)
所以,你实际上是想在这里做两件事。
首先,您正在尝试对列表进行列化(将其转换为每个项目中包含三个元素的新结构)。你可以编写一个看起来像这样的函数:
def columnize(data, columns):
for i in xrange(0, len(data), columns):
yield data[i:i+columns]
然后你想要用指定的格式打印它们。你有什么是可行的,但你可以通过跳过位置参数使它更简单一些。您可以实际只提供'{0} {1} {2}'
而不是'{} {} {}'
,因为参数按顺序格式化。打印代码如下所示:
columns = 3
for row in columnize(data, columns):
strformat = '{:>5.1f},' * len(row)
print strformat.format(*row)
请注意,我们只需使用字符串乘法运算符即可处理最后一行的大小写;大多数情况下,行将有3个项目,但在最后一个项目中它只有一个。
答案 2 :(得分:1)
嗯,这是一种相当简单的方式;定期拆分列表。 它还以正确的对齐方式打印,具体取决于列表中最长项目的长度。 不是非常简洁,但在我看来,你喜欢的是什么。
data = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
width = 3
table = [data[x:x+width] for x in range(0, len(data), width)]
alignment = len(str(max(data)))
for i in table:
for j in i:
print "%s," % str(j).rjust(alignment),
print
1.0, 2.0, 3.0,
4.0, 5.0, 6.0,
7.0, 8.0, 9.0,
10.0,
使用更长的物品:
1.0, 2.0, 3.0,
400.0, 5000.0, 6.0,
7.0, 8.0, 9.0,
10.0,
答案 3 :(得分:0)
我喜欢Joseph的解决方案,也许只是......
print "%s," % str(j).rjust(alignment, ' '),