将字符串列表打印到文件,每n项后插入换行符
我现在有一个字符串列表 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 个回答
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列表分块的回答,我们选择的每一块的大小等于列表长度的平方根。你也可以选择对平方根进行四舍五入,而不是直接取整。
这个理解会获取长度合适的子列表,并用空格将它们连接在一起。最终的结果将是一个字符串列表,显示你的结果,并用空格分开。然后我们再用换行符把这些结果连接起来。
这可能有点疯狂,但这是另一种方法。
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))
你可以使用列表推导式和 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
这里使用的是来自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)