如何尽可能多地用字符串内容填充n个表?

时间:2018-12-13 17:08:14

标签: python python-3.x list loops dictionary

基本上我想实现的是拥有一个字符串,比如说“汤姆有一只猫”。并检查以这种方式将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

,当没有空间来完成下一个单词时,应在ID上加上+1,然后开始填充下一行。然后,当句子完成后,应该继续从第一个字母开始填充。最后,它应该告诉用户句子填充表的次数(示例中为2次)。

我希望我可以理解它,并且我非常感谢每个想法!

编辑: 句子和“。”之间应该有一个空格。是“猫”的一部分。最后,程序应该用“ *”填充所有备用空间,例如:

“ c”“ a”“ t”“。 “”“ T”“ o”“ m”“” *“

但这是最不重要的事情。

2 个答案:

答案 0 :(得分:0)

一种解决方案(可能不是最干净的)是

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

答案 1 :(得分:0)

您可以将句子拆分为单词,并使用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', '*']]