什么是打印值右对齐的pythonic方法?

时间:2011-06-27 12:44:35

标签: format python

我有一个字符串列表,我希望按其后缀分组,然后打印右对齐的值,用空格填充左侧。

这样做的pythonic方式是什么?

我目前的代码是:

def find_pos(needle, haystack):
    for i, v in enumerate(haystack):
        if str(needle).endswith(v):
            return i
    return -1

# Show only Error and Warning things
search_terms = "Error", "Warning"
errors_list = filter(lambda item: str(item).endswith(search_terms), dir(__builtins__))

# alphabetical sort
errors_list.sort()
# Sort the list so Errors come before Warnings
errors_list.sort(lambda x, y: find_pos(x, search_terms) - find_pos(y, search_terms))

# Format for right-aligning the string
size = str(len(max(errors_list, key=len)))
fmt = "{:>" + size + "s}"
for item in errors_list:
    print fmt.format(item)

我想到的另一个选择是:

size = len(max(errors_list, key=len))
for item in errors_list:
    print str.rjust(item, size)

我还在学习Python,所以也欢迎其他有关改进代码的建议。

3 个答案:

答案 0 :(得分:8)

非常接近。

fmt = "{:>{size}s}"
for item in errors_list:
    print fmt.format(item, size=size)

答案 1 :(得分:7)

  1. 这两个排序步骤可以组合成一个:

    errors_list.sort(key=lambda x: (x, find_pos(x, search_terms)))
    

    通常,使用key参数优先于使用cmpDocumentation on sorting

  2. 如果您对长度感兴趣,使用key参数max()有点毫无意义。我会去

    width = max(map(len, errors_list))
    
  3. 由于循环内的长度没有变化,我只准备格式字符串一次:

    right_align = ">{}".format(width)
    
  4. 在循环中,您现在可以使用免费的format() function(即不是str方法,而是使用内置函数):

    for item in errors_list:
        print format(item, right_align)
    
  5. str.rjust(item, size)通常最好写成item.rjust(size)

答案 2 :(得分:1)

您可能希望查看here,其中介绍了如何使用str.rjust和使用打印格式进行右对齐。