思考Python

d34*_*r53 1 python optimization formatting

我最近一直在学习Python,今晚我正在玩几个例子,我只是想出了以下内容:

#!/usr/bin/env python
a = range(1,21)    # Range of numbers to print
max_length = 1     # String length of largest number
num_row = 5        # Number of elements per row

for l in a:
    ln = len(str(l))
    if max_length <= ln:
        max_length = ln

for x in a:
    format_string = '{:>' + str(max_length) + 'd}'
    print (format_string).format(x),
    if not x % num_row and x != 0:
        print '\n',
Run Code Online (Sandbox Code Playgroud)

其中输出如下:

 1  2  3  4  5 
 6  7  8  9 10 
11 12 13 14 15 
16 17 18 19 20
Run Code Online (Sandbox Code Playgroud)

脚本正在做我想要的,即每行打印5行数的对齐行,计算最大宽度加1; 但我几乎确信有一个:

  • 更多"pythonic"方式来做到这一点
  • 更有效的方法来做到这一点.

无论如何我不是大O的专家,但我相信我的两个for循环将其从O(n)更改为至少O(2n),所以我真的想看看是否有可能以某种方式将它们组合起来.我也不太热衷于我的format_string宣言,有没有更好的方法呢?你没有帮我欺骗家庭作业或任何东西,我认为这会通过大多数Python课程,我只想更多地围绕Python的思维方式,因为我主要来自Perl(不确定它是否显示: ).提前致谢!

fal*_*tru 5

  • 你不需要format_string每次都做.使用str.rjust,您不需要使用格式字符串.
  • 而不是使用x % num_row(列表的元素),使用i(基于1的索引使用enumerate(a, 1)).考虑一个案例a = range(3, 34).
    • 你可以放弃,i == 0因为i永远不会0.
  • not x % num_row很难理解.请x % num_row == 0改用.

a = range(1,21)
num_row = 5

a = map(str, a)
max_length = len(max(a, key=len))
for i, x in enumerate(a, 1):
    print x.rjust(max_length),
    if i % num_row == 0:
        print
Run Code Online (Sandbox Code Playgroud)