Как питонный способ вывести значения по правому краю? - PullRequest
2 голосов
/ 27 июня 2011

У меня есть список строк, которые я хочу сгруппировать по их суффиксу, а затем распечатать значения по правому краю, добавив пробелы в левую сторону.

Как это можно сделать с помощью 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 ]

8 голосов
/ 27 июня 2011

Очень близко.

fmt = "{:>{size}s}"
for item in errors_list:
    print fmt.format(item, size=size)
7 голосов
/ 27 июня 2011
  1. Два шага сортировки можно объединить в один:

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

    Как правило, использование параметра key предпочтительнее использования cmp. Документация по сортировке

  2. Если вас все равно интересует длина, использование параметра key для max() немного бессмысленно.Я бы пошел на

    width = max(map(len, errors_list))
    
  3. Поскольку длина внутри цикла не изменяется, я подготовил строку формата только один раз:

    right_align = ">{}".format(width)
    
  4. Внутри цикла вы можете теперь делать с бесплатной функцией format() (т.е. не с методом str, а со встроенной функцией):

    for item in errors_list:
        print format(item, right_align)
    
  5. str.rjust(item, size) обычно и предпочтительно записывается как item.rjust(size).

1 голос
/ 27 июня 2011

Возможно, вы захотите посмотреть здесь , в котором описано, как выровнять по правому краю, используя str.rjust и используя форматирование печати. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...