写入列表到具有特定列数的行

时间:2013-09-20 22:02:49

标签: python format row

我正在尝试将列表写入具有特定列数的行。例如,请列出:

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])

提前致谢!

4 个答案:

答案 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, ' '),