Вы можете разбить предложение на слова и использовать itertools.cycle
для циклического перебора каждого слова, а также заполнить список списков в соответствии с количеством свободных мест в текущей строке в зависимости от длины текущего слова плюс начальный пробел в строкене является пустым:
from itertools import cycle
def fill(sentence, rows, cols):
table = [[]]
words = cycle(sentence.split())
while True:
word = next(words)
if len(table[-1]) + len(word) + bool(table[-1]) > cols:
table[-1].extend('*' * (cols - len(table[-1])))
if len(table) == rows:
return table
table.append([])
if table[-1]:
table[-1].append(' ')
table[-1].extend(word)
, поэтому:
fill('Tom has a cat.', 4, 10)
возвращает:
[['T', 'o', 'm', ' ', 'h', 'a', 's', ' ', 'a', '*'],
['c', 'a', 't', '.', ' ', 'T', 'o', 'm', '*', '*'],
['h', 'a', 's', ' ', 'a', ' ', 'c', 'a', 't', '.'],
['T', 'o', 'm', ' ', 'h', 'a', 's', ' ', 'a', '*']]