如何将一个字符串切成单词的子字符串并递归追加到列表?

时间:2019-02-22 23:09:35

标签: python

我正在尝试根据限制提供对字符串进行切片,如果切片构成一个完整的单词,则将其附加到列表中。 如果它们没有形成完整的单词,我想前进/后退,直到找到前一个单词的末尾,然后在该点处将字符串切成薄片,并在其余字符串中继续进行。

我已经编写了代码,但是在递归方式上遇到了问题。

strr = "stackoverflow is the best knowledge platform"
limit = 11

def get_list(strr, limit, fin_list = []):
    i = 0
    if limit <= len(strr):
        if strr[limit].isspace(): 
            fin_list.append(strr[i:limit])
            i=limit+1
            return get_list(strr[i:],limit, fin_list)
            print(fin_list)
        else:
            return get_list(strr,limit-1)


print(get_list(strr, limit))

我的限制是11,所以我的预期输出是

['stackoverflow','is the best','knowledge','platform']

stackoverflow ==>完整单词,因此继续前进

我尝试过的另一种方法是使用字典,但无法解决问题。 可以使用理解力以典型的python样式实现一行代码吗?

1 个答案:

答案 0 :(得分:0)

您应该使用while循环来找到最接近极限的空白,然后倒退,如果找不到空白,则继续前进。递归查找下一个子字符串,直到其余的字符串符合长度限制:

def get_list(strr, limit):
    if len(strr) <= limit:
        return [strr] if strr else []
    i = limit
    while 0 < i < len(strr) and not strr[i].isspace():
        i -= 1
    if not i:
        i = limit
        while i < len(strr) and not strr[i].isspace():
            i += 1
    return [strr[:i]] + get_list(strr[i + 1:], limit)

这样:

get_list('stackoverflow is the best knowledge platform', 11)

返回:

['stackoverflow', 'is the best', 'knowledge', 'platform']

或者,您可以按空格分隔输入,并遍历单词列表,以决定是否将单词添加到当前单词串或输出当前单词串,然后根据是否开始新单词将使字符串超过限制:

def get_list(strr, limit):
    words = ''
    for word in strr.split():
        if len(words) + len(word) + 1 > limit:
            if words:
                yield words
                words = word
            else:
                yield word
                words = ''
        else:
            if words:
                words += ' '
            words += word
    if words:
        yield words

这样:

print(list(get_list(strr, 3)))
print(list(get_list(strr, 11)))
print(list(get_list(strr, 100)))

输出:

['stackoverflow', 'is', 'the', 'best', 'knowledge', 'platform']
['stackoverflow', 'is the best', 'knowledge', 'platform']
['stackoverflow is the best knowledge platform']