【问题标题】:Print list of strings to file with newline inserted after n items将字符串列表打印到文件中,并在 n 项后插入换行符
【发布时间】:2014-03-28 18:50:46
【问题描述】:

我目前有一个字符串列表 x:

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

我想通过在 n = sqrt(len(x)) 的 n 个元素之后添加一个换行符来将其作为正方形打印到一个文本文件中,从而产生一个带有输出的文本文件:

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

有人知道实现此目的的聪明方法吗?我必须使用带模数的计数器还是 python 可以更有效地做到这一点?

【问题讨论】:

    标签: python string list newline


    【解决方案1】:

    使用 itertools 文档中的 grouper recipe

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:
        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 列表here 的答案。我们只是选择一个块大小等于列表长度的平方根。您可以将其更改为舍入而不是截断平方根。

        理解将检索具有正确长度的子列表,并用空格将它们连接在一起。结果将是一个字符串列表,显示您的结果,以空格分隔。然后我们用一个换行符加入它

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-05-03
            • 2019-01-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-18
            相关资源
            最近更新 更多