2016-11-19 10 views
2

У меня есть список lst из entries = namedtuple('Entry', ['title', 'x', 'y', 'val']), где каждый элемент elm из lst имеет <class 'generator'>.Довольно печать с использованием формата строки для списка namedtuple с отступом (Python)

У меня есть метод, который печатает элементы этого списка, как так:

def print_elements_lst(lst_to_print): 
    return "\n".join("%s %s %s %s" % elm for elm in lst_to_print) 

Моя проблема заключается в том, что я пытаюсь добавить отступы между 1-й и 2-й строки (то есть между 'title' и 'x'), чтобы между ними существовало согласованное количество пустых пространств.

here С, я вычислить желанной обивка следующим образом:

pad = max(len(token) for elm in lst_to_print) + 2 

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

Любые предложения?

ответ

3

Измените строку форматирования в зависимости от значения pad.

>>> pad = 20 
>>> fmt = "%-{}s %s %s %s".format(pad) 
>>> fmt # `-20s`: left align (width = 20), without `-` -> right align 
'%-20s %s %s %s' 
>>> fmt % ('hello', 1, 2, 3) 
'hello    1 2 3' 

>>> def print_elements_lst(lst_to_print): 
...  pad = max(len(elm.title) for elm in lst_to_print) + 2 
...  fmt = "%-{}s %s %s %s".format(pad) # Specify width depending on `pad` 
...  return "\n".join(fmt % elm for elm in lst_to_print) 
... 
>>> Entry = namedtuple('Entry', ['title', 'x', 'y', 'val']) 
>>> entries = [ 
...  Entry('Hello world', 1, 2, 10), 
...  Entry('Python', 20, 2, 10), 
... ] 
>>> print(print_elements_lst(entries)) 
Hello world 1 2 10 
Python  20 2 10 
+0

Красивая. Python может быть таким приятным;) – Yannis