2

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

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

4 回答 4

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,
于 2013-09-20T22:52:38.323 回答
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))
于 2013-09-20T22:15:03.787 回答
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 个项目,但在最后一个项目上只有一个。

于 2013-09-20T22:15:04.343 回答
0

我喜欢Joseph的解决方案,也许只是......

print "%s," % str(j).rjust(alignment, ' '),

于 2013-09-20T23:10:58.877 回答