Красивая печать (2D-массивы, коробка)

#python #arrays #multidimensional-array

#python #массивы #многомерный массив

Вопрос:

Я написал следующий код:

 for row in range(len(listOfLists)):
    print(' '   '- '*len(listOfLists))
    print('|', end='')
    for col in range(len(listOfLists[row])):
        print(listOfLists[row][col], end='|')
    print(' ') #To change lines 
print(' '   '- '*len(listOfLists))
  

Ввод:

 [['a', 'b', 'c'],
 ['d', 'e', 'f'],
 ['g', 'h', 'i'],
 ['j', 'k', 'l']]
  

Вывод:

  - - - - 
|a|b|c| 
 - - - - 
|d|e|f| 
 - - - - 
|g|h|i| 
 - - - - 
|j|k|l| 
 - - - - 
  

Желаемый результат:

  - - - 
|a|b|c| 
 - - - 
|d|e|f| 
 - - - 
|g|h|i| 
 - - - 
|j|k|l| 
 - - - 
  

Который печатает ‘ — ‘ вокруг элементов 2D-массива.
Однако мой код работает только для квадратного массива (n ^ 2).

Как я могу обобщить его, чтобы он работал для любого варианта массива (если все списки имеют одинаковую длину)

Спасибо

Комментарии:

1. пожалуйста, сделайте отступ в своем коде

2. Не могли бы вы, пожалуйста, правильно отформатировать код и привести пример того, что вы получаете и чего хотите?

3. @vishes_shell это тоже 🙂

4. @345243lkj Извините!!! Я исправил это! 🙂

5. @vishes_shell Мне очень жаль за неясный формат. Я исправил это сейчас! 🙂

Ответ №1:

Ваша проблема заключалась в том, что len(listOfLists) это использовалось для размера печатаемой таблицы в обоих направлениях. len(listOfLists) по умолчанию используется количество строк, при этом len(listOfLists[0]) вы получаете количество столбцов.

  listOfLists = [['a', 'b', 'c'],
     ['d', 'e', 'f'],
     ['g', 'h', 'i'],
     ['j', 'k', 'l']]

for row in range(len(listOfLists)):
    print(' '   '- '*len(listOfLists[0]))
    print('|', end='')
    for col in range(len(listOfLists[row])):
        print(listOfLists[row][col], end='|')
    print(' ') #To change lines 
print(' '   '- '*(len(listOfLists[0])))
  

вывод:

  - - - 
|a|b|c| 
 - - - 
|d|e|f| 
 - - - 
|g|h|i| 
 - - - 
|j|k|l| 
 - - - 
  

Счастливого кодирования!

Комментарии:

1. Хороший улов. Исправлено, чтобы учесть это

2. @345243lkj Большое вам спасибо! 🙂

Ответ №2:

Вы печатаете этот разделитель на основе количества строк, а не количества столбцов. Использование дополнительных тестовых примеров помогает немедленно выполнить отладку.

 def printListOfLists(listOfLists):
    for row in range(len(listOfLists)):
        print(' '   '- ' * len(listOfLists[0]))
        print('|', end='')
        for col in range(len(listOfLists[row])):
            print(listOfLists[row][col], end='|')
        print(' ')  # To change lines
    print(' '   '- ' * len(listOfLists[0]))


printListOfLists([
    ['a', 'b', 'c'],
    ['d', 'e', 'f'],
    ['g', 'h', 'i'],
    ['j', 'k', 'l']
])

printListOfLists([['a', 'b', 'c']])

printListOfLists([['a'], ['b'], ['c']])
  

Теперь ожидаются все полученные результаты:

  - - - 
|a|b|c| 
 - - - 
|d|e|f| 
 - - - 
|g|h|i| 
 - - - 
|j|k|l| 
 - - - 


 - - - 
|a|b|c| 
 - - - 


 - 
|a| 
 - 
|b| 
 - 
|c| 
 - 
  

Комментарии:

1. Большое вам спасибо за вашу помощь!

Ответ №3:

 def awesome_print(listOfLists):
    for row in range(len(listOfLists)):
        print(' '   '- '*len(listOfLists[row]))
        print('|', end='')
        for col in range(len(listOfLists[row])):
            print(listOfLists[row][col], end='|')
        print(' ') #To change lines 
    print(' '   '- '*len(listOfLists[row]))

awesome_print([[1,2,3], [1,2,3], [2,3,0], [2,3,4]])
  

Вывод

  - - - 
|1|2|3| 
 - - - 
|1|2|3| 
 - - - 
|2|3|0| 
 - - - 
|2|3|4| 
 - - - 
  

В случае, если вам нужно распечатать данные с нефиксированным размером подмассивов

 def awesome_print2(listOfLists):
    for row in range(len(listOfLists)):
        print(' '   '- '*len(listOfLists[row]))
        print('|', end='')
        for col in range(len(listOfLists[row])):
            print(listOfLists[row][col], end='|')
        print()
        print(' '   '- '*len(listOfLists[row]))
awesome_print2([[1,2,3,5], [1,2,3], [2,3,0,6,3], [2,3,4]])
  

Вывод:

  - - - - 
|1|2|3|5|
 - - - - 
 - - - 
|1|2|3|
 - - - 
 - - - - - 
|2|3|0|6|3|
 - - - - - 
 - - - 
|2|3|4|
 - - - 
  

Комментарии:

1. Кажется, что между каждой строкой есть дополнительное пространство. Последний оператор print должен находиться вне цикла for, чтобы избежать этого (если это не было сделано намеренно)

2. Большое спасибо за вашу помощь! 🙂