我需要将字符串拆分成包含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数量的单词。
对于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)