思考Python

我最近一直在学习
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',

其中输出如下:

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

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

>更多“pythonic”方式来做到这一点
>更有效的方法来做到这一点.

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

最佳答案 >您不需要每次都生成format_string.使用
str.rjust,您不需要使用格式字符串.

>不使用x%num_row(列表元素),而是使用i(使用枚举(a,1)的基于1的索引).考虑一个案例a =范围(3,34).

>你可以放弃i == 0因为我永远不会是0.

>不是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
点赞