2013-11-11 2 views
0

Скажем, у меня есть словарь, как:Как распечатать словарь в формате таблицы?

my_dict = {1:[1,2,3],4:[5,6,7],8:[9,10,11]} 

Я хочу, чтобы иметь возможность распечатать его, так это выглядит как:

1 4 8 
1 5 9 
2 6 10 
3 7 11 

Я на самом деле работает с гораздо большими словарями, и было бы хорошо, если я могу видеть, как они выглядят, так как они так трудно читать, когда я просто говорю print(my_dict)

+1

Почему не использовать модуль 'pprint' для печати? –

+0

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

ответ

8

Вы можете использовать zip() для создания столбцов:

for row in zip(*([key] + value for key, value in sorted(my_dict.items()))): 
    print(*row) 

Демо:

>>> my_dict = {1:[1,2,3],4:[5,6,7],8:[9,10,11]} 
>>> for row in zip(*([key] + value for key, value in sorted(my_dict.items()))): 
...  print(*row) 
... 
1 4 8 
1 5 9 
2 6 10 
3 7 11 

Это делает предположить, что списки значений все одинаковой длины; если не самая короткая строка будет определять максимальное количество напечатанных строк. Используйте itertools.zip_longest() для печати более:

from itertools import zip_longest 
for row in zip_longest(*([key] + value for key, value in sorted(my_dict.items())), fillvalue=' '): 
    print(*row) 

Демо:

>>> from itertools import zip_longest 
>>> my_dict = {1:[1,2,3],4:[5,6,7,8],8:[9,10,11,38,99]} 
>>> for row in zip_longest(*([key] + value for key, value in sorted(my_dict.items())), fillvalue=' '): 
...  print(*row) 
... 
1 4 8 
1 5 9 
2 6 10 
3 7 11 
    8 38 
    99 

Вы можете использовать sep='\t' для выравнивания столбцов по позиции табуляции.

+0

Если я не ошибаюсь, это не работает в python 2.7? Кажется, не нравится ни одна из строк или zip_longest. – fantabolous

+1

@fantabolous: 'zip_longest' называется' izip_longest' в Python 2. 'print (* row)' не будет работать в 2, если вы не используете 'from __future__ import print_function' в своем модуле, или используйте' print '' .join (строка) '. –

+0

Спасибо Martijn за преобразование python 2. Я не думаю, что на самом деле я упоминал * zip в любом месте;) – fantabolous

1
>>> my_dict = {1:[1,2,3],4:[5,6,7],8:[9,10,11]} 
>>> keys = my_dict.keys() 
>>> print(*iter(keys), sep='\t') 
8 1 4 
>>> for v in zip(*(my_dict[k] for k in keys)): print(*v, sep='\t') 
... 
9 1 5 
10 2 6 
11 3 7 
Смежные вопросы