将字符串列表打印到文件,每n项后插入换行符

0 投票
4 回答
695 浏览
提问于 2025-04-18 00:21

我现在有一个字符串列表 x:

[ '15.0000291159500048', '15.0000203137357904', '14.9999702802477710', '5.0000017127321428', '-5.0000029074634842', '0.0000000599304253', '0.0000001437028190', '-0.0000000724688421', '-0.0000000510019702' ]

我想把它打印到一个文本文件里,格式是一个正方形。具体来说,就是每 n 个元素后面加一个换行符,其中 n 等于 x 的长度的平方根。这样输出的文本文件内容应该是:

15.0000291159500048 15.0000203137357904 14.9999702802477710
5.0000017127321428 -5.0000029074634842 0.0000000599304253
0.0000001437028190 -0.0000000724688421 -0.0000000510019702

有没有人知道有什么聪明的方法可以做到这一点?我需要用计数器和取模运算,还是 Python 自带的功能可以更高效地完成这个任务?

4 个回答

0
l = [ '15.0000291159500048', '15.0000203137357904', '14.9999702802477710', '5.0000017127321428', '-5.0000029074634842', '0.0000000599304253', '0.0000001437028190', '-0.0000000724688421', '-0.0000000510019702' ]  
stepSize = int(sqrt(len(l)))
print '\n'.join([' '.join(l[i:i+stepSize]) for i in range(0, len(l), stepSize)])

根据这里关于如何将Python列表分块的回答,我们选择的每一块的大小等于列表长度的平方根。你也可以选择对平方根进行四舍五入,而不是直接取整。

这个理解会获取长度合适的子列表,并用空格将它们连接在一起。最终的结果将是一个字符串列表,显示你的结果,并用空格分开。然后我们再用换行符把这些结果连接起来。

0

这可能有点疯狂,但这是另一种方法。

x = [ '15.0000291159500048', '15.0000203137357904', '14.9999702802477710', '5.0000017127321428', '-5.0000029074634842', '0.0000000599304253', '0.0000001437028190', '-0.0000000724688421', '-0.0000000510019702' ] s = math.sqrt(len(x)) matrix = [[x[a+b] for z in xrange(int(s)) ] for y in range(0, len(x), int(s)) ] print "\n".join( map(lambda innerRow: " ".join( map(lambda item: str(item), innerRow)), matrix))

2

你可以使用列表推导式和 str.join 方法:

In [26]: lis = [ '15.0000291159500048', '15.0000203137357904', '14.9999702802477
710', '5.0000017127321428', '-5.0000029074634842', '0.0000000599304253', '0.0000
001437028190', '-0.0000000724688421', '-0.0000000510019702' ]

In [27]: n = 3

In [28]: print "\n".join([' '.join(lis[i:i+n]) for i in xrange(0, len(lis), n)])

15.0000291159500048 15.0000203137357904 14.9999702802477710
5.0000017127321428 -5.0000029074634842 0.0000000599304253
0.0000001437028190 -0.0000000724688421 -0.0000000510019702
2

这里使用的是来自itertools文档的grouper配方

>>> data = [ '15.0000291159500048', '15.0000203137357904', '14.9999702802477710', '5.0000017127321428', '-5.0000029074634842', '0.0000000599304253', '0.0000001437028190', '-0.0000000724688421', '-0.0000000510019702' ]
>>> n = int(math.sqrt(len(data)))
>>> print '\n'.join(' '.join(row) for row in grouper(data, n, ''))
15.0000291159500048 15.0000203137357904 14.9999702802477710
5.0000017127321428 -5.0000029074634842 0.0000000599304253
0.0000001437028190 -0.0000000724688421 -0.0000000510019702

下面是grouper()的样子:

from itertools import izip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

撰写回答