将字符串拆分为x个单词的列表,重复最后的x-1个单词

Ala*_*lan 1 python

我需要将字符串拆分成包含x单词数量的列表,但要重复最后一个x-1单词。

line = "Lorem ipsum dolor sit amet consectetur."
Run Code Online (Sandbox Code Playgroud)

如果为x = 2,则输出应为:

['Lorem ipsum', 'ipsum dolor', 'dolor sit', 'sit amet', 'amet consectetur']
Run Code Online (Sandbox Code Playgroud)

如果为x = 3,则输出应为:

['Lorem ipsum dolor', 'ipsum dolor sit', 'dolor sit amet', 'sit amet consectetur']
Run Code Online (Sandbox Code Playgroud)

根据将字符串拆分为两个单词的列表,重复最后一个单词,以下代码成功将字符串拆分为2个单词对:

words = line.split()
print(list(map(' '.join, zip(words[:-1], words[1:]))))
Run Code Online (Sandbox Code Playgroud)

但是,不是将单词的数量硬编码为2,我想指定单词的数量x,例如:

number_of_words = x
def generate_list(x):
Run Code Online (Sandbox Code Playgroud)

我试过了中的整数print(list(map(' '.join, zip(words[:-1], words[1:])))),但是整数似乎只影响单词的顺序,而不影响单词的数量

我想我可以编写单独的函数来处理2个单词,3个单词,4个单词的场景,但是理想情况下,我希望有一个函数可以处理任意x数量的单词。

blh*_*ing 5

对于3个单词的滚动窗口,您可以简单地将一个切片列表传递给zip

list(map(' '.join, zip(words, words[1:], words[2:])))
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用生成器表达式来概括以上表达式:

def rolling_window(words, number_of_words):
    return list(map(' '.join, zip(*(words[i:] for i in range(number_of_words)))))
Run Code Online (Sandbox Code Playgroud)

以便:

rolling_window('Lorem ipsum dolor sit amet consectetur'.split(), 3)
Run Code Online (Sandbox Code Playgroud)

返回:

['Lorem ipsum dolor', 'ipsum dolor sit', 'dolor sit amet', 'sit amet consectetur']
Run Code Online (Sandbox Code Playgroud)