我正在尝试根据限制提供对字符串进行切片,如果切片构成一个完整的单词,则将其附加到列表中。 如果它们没有形成完整的单词,我想前进/后退,直到找到前一个单词的末尾,然后在该点处将字符串切成薄片,并在其余字符串中继续进行。
我已经编写了代码,但是在递归方式上遇到了问题。
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样式实现一行代码吗?
答案 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']