我有一个字符串列表,我希望按其后缀分组,然后打印右对齐的值,用空格填充左侧。
这样做的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,所以也欢迎其他有关改进代码的建议。
答案 0 :(得分:8)
非常接近。
fmt = "{:>{size}s}"
for item in errors_list:
print fmt.format(item, size=size)
答案 1 :(得分:7)
这两个排序步骤可以组合成一个:
errors_list.sort(key=lambda x: (x, find_pos(x, search_terms)))
通常,使用key
参数优先于使用cmp
。 Documentation on sorting
如果您对长度感兴趣,使用key
参数max()
有点毫无意义。我会去
width = max(map(len, errors_list))
由于循环内的长度没有变化,我只准备格式字符串一次:
right_align = ">{}".format(width)
在循环中,您现在可以使用免费的format()
function(即不是str
方法,而是使用内置函数):
for item in errors_list:
print format(item, right_align)
str.rjust(item, size)
通常最好写成item.rjust(size)
。
答案 2 :(得分:1)
您可能希望查看here,其中介绍了如何使用str.rjust和使用打印格式进行右对齐。