2014-10-30 2 views
-1

Предположим, я хочу вывести три строки. Каждая строка соответствует другой таблице. Столбцы являются соответствующими значениями для ключей.В python, как я могу распечатать все значения для одного и того же ключа из разных словарей друг над другом?

Это позволит сделать распечатку по вертикали:

for i in list_of_keys: 
    print dict1[i], dict2[i], dict3[i] 

Любой способ для меня, чтобы создать простой способ для значений словаря для штабелирования друг на друга вместо этого?

Один из способов сделать это было бы написать:

for i in list_of_keys: 
    print dict1[i], 
for i in list_of_keys: 
    print dict2[i], 

Но проблема здесь, если словари содержат больше значений, чем может поместиться на одной линии, я получаю несколько строк для словаря до этого словаря не закончится а затем несколько строк внизу. В отличие от выстраивания словаря значения для значения с помощью клавиш, определяющих столбцы, значения которых выстроены вверх.

+0

I «Не знаю, как вы хотите, чтобы результат был. Вы хотите, чтобы значения печатались до самого конца строки? Или вы хотите, скажем, четыре значения в строке? – justhalf

+0

Если словари содержат больше значений, чем может помещаться в строку, я думаю, если бы я мог установить заранее определенное значение (например, 50 символов) до начала новой строки, это будет хорошо работать для различных типов словарей. – dimb

ответ

0

Предполагая, что 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 
Смежные вопросы