Предполагая, что Python 2, я написал функцию pprint_multiline
, которую вы можете настроить дико.
Вы можете настроить следующее:
- длина линии
- разделитель между элементами
- разделитель между строками (пустая строка для пустой строки между двумя блоками линий,
None
без всякой линии сепаратора на всех)
- выравнивание каждого предмета, и
- знак выравнивания.
Функция принимает список списков, подлежащих печати по горизонтали, поэтому вам нужно будет распаковать словарь перед вызовом этой функции, как показано в примерах, приведенных ниже.
Это работает для любого значения в словарях, если оно реализует функцию __str__
(что делает большинство объектов Python).
Функция:
def pprint_multilines(linelen=80, separator=' ', line_separator=None,
align='left', align_char=' ', lists=[]):
maxlen = max(len(lst) for lst in lists)
printed_lines = ['']*len(lists)
empty = True
printed = False
for i in xrange(maxlen):
max_item_len = max(len(str(lst[i])) for lst in lists)
if max_item_len + len(printed_lines[0]) + 1 > linelen:
if printed and line_separator is not None:
if len(line_separator) > 0:
print line_separator*(linelen/len(line_separator))
else:
print
for printed_line in printed_lines:
print printed_line
printed = True
printed_lines = ['']*len(lists)
empty = True
for lst_idx, lst in enumerate(lists):
if not empty:
printed_lines[lst_idx] += separator
if align == 'left':
printed_lines[lst_idx] += str(lst[i]).ljust(max_item_len, align_char)
else: # align == 'right'
printed_lines[lst_idx] += str(lst[i]).rjust(max_item_len, align_char)
else:
empty = False
if not empty:
if printed and line_separator is not None:
if len(line_separator) > 0:
print line_separator*(linelen/len(line_separator))
else:
print
for printed_line in printed_lines:
print printed_line
Чтобы увидеть его в действии, вы можете увидеть следующие примеры:
dict1 = {'a': 'first', 'b': 'second', 'c': 3, 'd': ['the', 'fourth']}
dict2 = {'a': 1, 'b':2, 'c':3, 'd':4}
dict3 = {'a': '1', 'b':'two', 'c':'three', 'd': 'fourth'}
list_of_keys = ['a','b','c','d']
pprint_multilines(linelen=15, separator=' ', align='left', align_char=' ',
line_separator='-',
lists=[[dict1[key] for key in list_of_keys],
[dict2[key] for key in list_of_keys],
[dict3[key] for key in list_of_keys]])
print
pprint_multilines(linelen=15, separator=' ', align='left', align_char=' ',
lists=[[dict1[key] for key in list_of_keys],
[dict2[key] for key in list_of_keys],
[dict3[key] for key in list_of_keys]])
print
pprint_multilines(linelen=25, separator=' ', align='left', align_char=' ',
line_separator='',
lists=[[dict1[key] for key in list_of_keys],
[dict2[key] for key in list_of_keys],
[dict3[key] for key in list_of_keys]])
print
pprint_multilines(linelen=45, separator=' ', align='left', align_char='_',
lists=[[dict1[key] for key in list_of_keys],
[dict2[key] for key in list_of_keys],
[dict3[key] for key in list_of_keys]])
print
pprint_multilines(linelen=45, separator=' ', align='right', align_char=' ',
lists=[[dict1[key] for key in list_of_keys],
[dict2[key] for key in list_of_keys],
[dict3[key] for key in list_of_keys]])
, которые будут выводить (с некоторыми комментариями):
first second
1 2
1 two
--------------- <-- This is the line separator
3 <-- This next item fits in 15 chars, but
3 if appended to the previous line
three this item won't fit, so break the third item to new lines
--------------- <-- Note that this spans the specified line length
['the', 'fourth']
4
fourth
first second
1 2
1 two
3 <-- No line separator!
3
three
['the', 'fourth']
4
fourth
first second 3 <-- linelen=25, the third item now fits!
1 2 3
1 two three
<-- A blank line separator
['the', 'fourth']
4
fourth
first second 3____ ['the', 'fourth'] <-- Showing alignment chars
1____ 2_____ 3____ 4________________ <-- linelen=45, everything fits!
1____ two___ three fourth___________
first second 3 ['the', 'fourth'] <-- These blocks are right-aligned
1 2 3 4
1 two three fourth
I «Не знаю, как вы хотите, чтобы результат был. Вы хотите, чтобы значения печатались до самого конца строки? Или вы хотите, скажем, четыре значения в строке? – justhalf
Если словари содержат больше значений, чем может помещаться в строку, я думаю, если бы я мог установить заранее определенное значение (например, 50 символов) до начала новой строки, это будет хорошо работать для различных типов словарей. – dimb