【问题标题】:Python wrap/format a list when printedPython在打印时包装/格式化列表
【发布时间】:2012-03-30 08:28:57
【问题描述】:

在 Python 2.7 中,我有一个包含数字 1-25 字符串的列表(例如)。打印它们时,我希望列表打印 5 行,每行 5 个数字。

理想情况下:

>>> print(myList)
['1', '2', '3', '4', '5'
 '6', '7', '8', '9', '10',
 ...
 ...
 '21', '22', '23', '24', '25']

我知道如果我必须这样做,我可以简单地在 myList 中创建五个单独的列表并调用

print(myList[0])
print(myList[1])
...

但我真的很想避免这种情况。

提前致谢!

【问题讨论】:

    标签: python list formatting python-2.7


    【解决方案1】:

    Python标准库提供textwrap

    from textwrap import fill
    
    values = [str(x) for x in range(25)]
    print(fill(str(values), width=20))
    

    【讨论】:

    【解决方案2】:

    你必须滚动你自己的表示函数,比如

    def wrap_list(items, items_per_line=5):
        items = list(items)
        lines = []
        for i in range(0, len(items), items_per_line):
            chunk = items[i:i + items_per_line]
            line = ", ".join(map(repr, chunk))
            lines.append(line)
        return "[{}]".format(",\n ".join(lines))
    

    示例用法:

    >>> print(wrap_list(map(str, range(25))))
    ['0', '1', '2', '3', '4',
     '5', '6', '7', '8', '9',
     '10', '11', '12', '13', '14',
     '15', '16', '17', '18', '19',
     '20', '21', '22', '23', '24']
    

    【讨论】:

    • 比我快 8 秒... mumble grumble
    【解决方案3】:

    这是一个使用 for 循环的简洁解决方案:

    for n, val in enumerate(myList, 1):
        print val,
        if n % 5 == 0:
            print "\n"
    if n % 5:
        print "\n" # end the last line, if any
    

    枚举从 1 开始,以避免在开始时出现杂散的换行符。

    【讨论】:

    • 这不会打印前导 [ 或尾随 ],也不会缩进除第一行之外的所有行。但是很好地使用具有起始值的枚举
    • 添加括号和缩进有点简单,不是吗?我刚刚演示了换行。
    【解决方案4】:

    我认为没有任何现成的功能可以用于此目的,您可能仍然需要拆分原始列表,或者编写自己的打印功能。通过拆分原始列表有一个简单的解决方案:

    import pprint
    pprint.pprint([l[i:i+5] for i in xrange(0, len(l), 5)])
    

    但是,它仅适用于长度为 5 倍的列表(或您在自己的版本中指定的任何其他整数),它不能处理任意长度的列表。对于这种情况,您可能需要自己的打印功能。

    【讨论】:

      【解决方案5】:

      看到这个,想写一个难看的单行,所以这里是:

      >>> l = range(25)
      >>> w = 5
      >>> print '\n'.join([str(x) for x in [l[i:i + w] for i in range(0, 25, w)]])
      [0, 1, 2, 3, 4]
      [5, 6, 7, 8, 9]
      [10, 11, 12, 13, 14]
      [15, 16, 17, 18, 19]
      [20, 21, 22, 23, 24]
      

      把它当作一个想法

      【讨论】:

        【解决方案6】:

        这是你们中的一个:

        for i in range(len(myList)):
            if i != 0 and i % (len(myList)/numOfLines) == 0: 
                print '\n'
            print myList[i],
        

        【讨论】:

        • 这不会打印前导 [ 或尾随 ],也不会缩进除第一行以外的所有行。
        猜你喜欢
        • 2013-10-24
        • 2011-11-13
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        相关资源
        最近更新 更多