【问题标题】:How to print prime numbers in a tabular format如何以表格格式打印素数
【发布时间】:2021-10-17 18:10:52
【问题描述】:

我的目标是以表格格式打印素数,而不是每行打印一个值。到目前为止,我所有的尝试都以行或打印错误的表格结束。

start = int(input("Start number: "))
end = int(input("End number: "))

if start < 0 or end < 0:
    print("Start and End must be positive.")
    start = int(input("Start number: "))
    end = int(input("End number: "))
if end < start:
    print("End must be greater than Start number: ")
    start = int(input("Start number: "))
    end = int(input("End number: "))

prime = True
for num in range(start,end+1):
    if num > 1:
        for i in range(2,num):
            if num % i == 0:
                break
        else:
            num = print(num)

我这里的只能逐行打印

#start number: 1
#end number: 100
 # 2  3  5  7 11 13 17 19 23 29 
 #31 37 41 43 47 53 59 61 67 71 
 #73 79 83 89 97 

【问题讨论】:

  • num = print(num) 是错误的。 print 不返回任何内容
  • 考虑tabulate 包?一旦你建立了主要名单......
  • 如果您查看print 的文档(使用help(print)),它有一个名为end 的参数,默认情况下是换行符。要在一行上打印多个内容,您需要将其设置为空 ('') 或空格。例如。 print(num, end=' ').
  • 你能举个例子说明你希望输出的样子吗?

标签: python python-3.x


【解决方案1】:

这可以与str.rjust 或其朋友一起完成

>>> "2".rjust(3)
'  2'
>>> 

首先我们收集要打印的数字并计算其中最大的字符数,并将该值加一,该结果就是我们将用于 rjust 的结果

>>> nums=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>> j = len(str(max(nums))) + 1
>>> 

现在我们选择每行要打印多少个

>>> linesize = 10
>>> 

最后我们使用print 关键字参数end 来控制何时打印在同一行,enumerate 来控制我们已经打印了多少

>>> for i,p in enumerate(nums,1):
        print( str(p).rjust(j), end="" )
        if i%linesize==0:
            print() #to go to the next line

        
  2  3  5  7 11 13 17 19 23 29
 31 37 41 43 47 53 59 61 67 71
 73 79 83 89 97
>>> 

【讨论】:

    【解决方案2】:

    您可以使用str.format 并使用generator 实现可重用 解决方案:

    from math import floor
    
    def tabular(records, line_width=42, sep_space=3):
        
        width = len(str(max(records))) + sep_space
        columns = floor(line_width/width)
        
        for i in range(0, len(records), columns):
    
            row_records = records[i:i+columns]
            row_format = ("{:>" + str(width) + "}") * len(row_records)
    
            yield row_format.format(*row_records)
    
    # test data / prime numbers
    numbers = [
        2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 
        41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
        89, 97
    ]
    
    for row in tabular(numbers):
        print(row)
    
    #    2    3    5    7   11   13   17   19
    #   23   29   31   37   41   43   47   53
    #   59   61   67   71   73   79   83   89
    #   97
    

    其他数字的示例:

    for row in tabular(list(range(0, 1600, 50)), 79, 2):
        print(row)
    
    #     0    50   100   150   200   250   300   350   400   450   500   550   600
    #   650   700   750   800   850   900   950  1000  1050  1100  1150  1200  1250
    #  1300  1350  1400  1450  1500  1550
    

    str.format 为例,但不使用生成器:

    # test data / prime numbers
    numbers = [
        2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 
        41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
        89, 97
    ]
    
    width = len(str(max(numbers))) + 3
    
    for i in range(0, len(numbers), 10):
    
        row_records = numbers[i:i+10]
        row_format = ("{:>" + width + "}") * len(row_records)
        print(row_format.format(*row_records))
    
    #    2    3    5    7   11   13   17   19   23   29
    #   31   37   41   43   47   53   59   61   67   71
    #   73   79   83   89   97
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      相关资源
      最近更新 更多