【问题标题】:Printing multiple items in list in different lines在不同行中打印列表中的多个项目
【发布时间】:2016-03-06 14:24:23
【问题描述】:

我在一个项目中需要帮助,我有一个包含 25 个项目的列表中的板。如何打印以使其每 5 项跳过一行。如果我有这个:

    myList = []
    for i in range (1,25):
        myList.append(i)

我查看了'\n'print(myList, end=''),但我没有得到任何结果。我想要这样的最终结果:

    1  2  3  4  5
    6  7  8  9  10
    11 12 13 14 15
    16 17 18 19 20
    21 22 23 24 25

非常感谢。

【问题讨论】:

  • 您只打印数字还是任何对象?您还需要二维矩阵作为结果还是只需要输出?
  • 这基本上是一个 FizzBu​​zz 问题。
  • 您应该阅读有关 join() 和 format() 函数的信息。
  • 如果您认为它可以解决您的问题,请accept 回答。它将在整个社区中识别正确的解决方案。这可以通过单击答案旁边的绿色复选标记来完成。请参阅此image 以供参考。干杯。

标签: python list for-loop printing newline


【解决方案1】:

要获得从 1 到 25 的列表,您需要执行 range(1, 26)。除此之外,您可以按照您要求的格式打印它:

numbers = range(1, 26)
for i, elem in enumerate(numbers):
    if i % 5 == 0:
        print()
    print(str(elem).ljust(3), end='')
print()

输出:

1  2  3  4  5  
6  7  8  9  10 
11 12 13 14 15 
16 17 18 19 20 
21 22 23 24 25

enumerate(list) 为列表中的每个元素返回一对 (index, element)str.ljust(n) 左对齐字符串,使其长度为 n 个字符,其余部分用空格填充。

编辑:或者,正如 @PM_2Ring 在 cmets 中提出的那样:

numbers = range(1, 26)
for i, elem in enumerate(numbers, 1):
    print(str(elem).ljust(3), end='\n' if i % 5 == 0 else '')

作为str(elem).ljust(3) 的替代品,您还可以使用'{:<3}'.format(elem) (Python 2.7+) 或'{0:<3}'.format(elem) (Python

【讨论】:

  • 或者,提供 1 的起始 arg 以枚举:enumerate(numbers, 1),然后您可以使用条件表达式计算打印 end arg:end = '\n' if i % 5 == 0 else ''。然后打印调用变为:print(str(elem).ljust(3), end=end)print('{0:<3}'.format(elem), end=end);在 Python 2.7+ 中,格式字符串可以简化为'{:<3}'
  • 感谢您的替代解决方案,我已将其添加到答案中!
【解决方案2】:
for i in range(len(myList)/5+1):
    print " ".join([str(j) for j in myList[5*i:5*i+5]])

【讨论】:

    【解决方案3】:

    您可以使用数组,因为您可以轻松地将它们重塑为您的电路板大小:

    import numpy as np
    array = np.arange(1,26)
    array = array.reshape((5,5))
    
    for line in range(0,5):
        print ' '.join(map(str, array[line,:]))
    

    【讨论】:

    • 对于 OP 来说,使用 numpy 可能有点太高级了。 OTOH,您的代码(可能)比我的单行代码更容易理解。 :)
    【解决方案4】:

    只是为了好玩,这是一个难以理解的功能性单线:

    print('\n'.join(map(''.join, zip(*[iter(map('{0:>3}'.format, myList))] * 5))))
    

    请注意,虽然这可能看起来很酷(对某些读者而言),但确实不建议在实际程序中使用这种密集的嵌套代码。

    这里基本上是相同的算法被拆分以使其更具可读性,其中一个 map 调用转换为列表理解:

    strings = map('{0:>3}'.format, myList)
    chunked = zip(*[iter(strings)] * 5)
    rows = [''.join(s) for s in chunked]
    print '\n'.join(rows)
    

    这个算法最棘手的部分是zip(*[iter(strings)] * 5)[iter(strings)] * 5 部分在 strings 可迭代对象上创建一个包含 5 个对迭代器的引用的列表。 * splat 运算符将这些引用作为单独的参数传递给 zipzip 然后创建长度为 5 的元组,依次从其每个参数绘制以填充元组。但是它的每个参数都是对 same 迭代器 iter(strings) 的引用,因此该迭代器的内容被打包成元组。

    【讨论】:

      【解决方案5】:

      循环遍历每五个元素并添加中间数字:

      for y in range(1, 26, 5):
          print "\t{0}\t{1}\t{2}\t{3}\t{4}".format(y, y+1, y+2, y+3, y+4)
      

      对于每行更多的项目,双循环更容易:

      for y in range(1, 26, 5):
          for x in range(y, y+5):
              out += "\t" + str(x)
          out += "\n"
      print out
      

      我这里用的是制表符,不过你也可以用string的ljust函数。

      【讨论】:

        【解决方案6】:

        使用一些地图:

        myList = range(1, 26)
        for line in map(lambda x: myList[x:x+5], range(0, len(myList), 5)):
            print '\t'.join(map(str, line))
        
        1   2   3   4   5
        6   7   8   9   10
        11  12  13  14  15
        16  17  18  19  20
        21  22  23  24  25
        

        【讨论】:

          【解决方案7】:
          from math import sqrt
          
          r = range(25)
          n =int(sqrt(len(r)))
          
          for i in xrange(0,n):
              print "\t".join([str(s) for s in r[i*n:i*n+n]])
          

          【讨论】:

          • 不需要为了得到sqrt函数而导入math;只需使用电源运算符** 0.5,这样效率更高。但是,这里可能不需要计算平方根:我们可以假设棋盘中的行数和列数是给定的。
          猜你喜欢
          • 2017-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-28
          • 1970-01-01
          • 2019-12-18
          • 1970-01-01
          相关资源
          最近更新 更多