首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >思考Python

思考Python
EN

Stack Overflow用户
提问于 2013-08-06 07:29:40
回答 4查看 150关注 0票数 2

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

代码语言:javascript
运行
复制
#!/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',

其产出如下:

代码语言:javascript
运行
复制
 1  2  3  4  5 
 6  7  8  9 10 
11 12 13 14 15 
16 17 18 19 20

这个脚本正在做我想做的事情,即打印对齐行,每行5个数字,计算最大宽度加上一个;但我几乎确信其中有一个:

  • 更多的“琵琶”方法
  • 更有效的方法来做到这一点。

我不是大O的专家,但我相信我的两个for循环把它从O(n)变成了至少O(2n),所以我真的很想看看是否有可能以某种方式将它们结合起来。我也不太喜欢我的format_string声明,有更好的方法吗?您没有帮助我在作业或其他方面作弊,我认为这将通过大多数Python类,我只是想更多地了解Python的思维方式,因为我主要来自Perl (不确定它是否显示:)。提前感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-06 07:37:50

  • 你不需要每次都做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代替。
代码语言:javascript
运行
复制
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
票数 5
EN

Stack Overflow用户

发布于 2013-08-06 07:37:09

我认为你可以做更多的最大长度的仿生计算:)

代码语言:javascript
运行
复制
max_length = len(str(max(a)))

如果你的数字可能是负值或浮点数

代码语言:javascript
运行
复制
max_length = max([len(str(x)) for x in a])
票数 1
EN

Stack Overflow用户

发布于 2013-08-06 07:52:02

另一个条目。只是为了添加一个带有一些函数编程的程序。:-)

代码语言:javascript
运行
复制
n = 20
f = lambda x: str(x).rjust(len(str(n+1))) + (" " if x % 5 else "\n")
print "".join(map(f, range(1,n+1))),
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18074138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档