Как заполнить n таблиц содержимым строки столько раз, сколько сможете? - PullRequest
0 голосов
/ 13 декабря 2018

По сути, я бы хотел получить строку, скажем, «У Тома есть кошка».и проверьте, сколько раз он будет заполнять, например, таблицу 10x3 таким образом, не разрезая слова пополам:

"T" "o" "m" " " "h" "a" "s" " " "a" " "

"c" "a" "t" "." " " "T" "o" "m" " " " "

"h" "a" "s" " " "a" " " "c" "a" "t" "."

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

for i in range(1, rows+1)     #id's of keys of already created dict
        for n in range(columns):
            for letter in string:
                d["{}".format(i)][n] = letter

, и когда нет места для завершения следующего слова, он должен добавить +1 к идентификатору и начать заполнение следующей строки.Затем, когда предложение закончено, оно должно начинаться с первой буквы.В конце он должен сообщить пользователю, сколько раз предложение заполняло таблицу (2 раза в примере).

Надеюсь, я сделал это понятным, и я очень благодарен за каждую идею!

Редактировать: Между предложениями и "." Должен быть пробел.является частью "кошки".Также в конце программа должна заполнить всю свободную комнату "*", например:

"c" "a" "t" ".""" "T" "o" "m" "" "*"

но это наименее важная вещь.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вы можете разбить предложение на слова и использовать 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', '*']]
0 голосов
/ 13 декабря 2018

Одно из решений (возможно, не самое чистое):

def into_grid(s, width, height):
    words = cycle(s.split(" "))
    res = ""
    row = 0
    col = 0
    next_word = next(words)
    while row < height:
        if col + len(next_word) <= width:
            res += next_word + " "
            col += len(next_word) + 1
            next_word = next(words)
        else:
            row += 1
            col = 0
            res += "\n"
    return res
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...