将字符串拆分为两个单词的列表,重复最后一个单词

5
我需要将字符串拆分为每两个单词一组的列表,但是每对单词的最后一个单词需要重复。 以下是我尝试过的代码,使用了我在其他问题中找到的示例:
line = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."""

def split_line(in_line):
    line_sp = line.split(" ")
    line_two = [" ".join(line_sp[i:i + 2]) for i in range(0, len(line_sp), 2)]
    return line_two

print(split_line(line))

这将导致:
['Lorem ipsum', 'dolor sit', 'amet, consectetur', 'adipiscing elit,', 'sed do', 'eiusmod tempor', 'incididunt ut', 'labore et', 'dolore magna', 'aliqua.']

但实际上我需要的是这个:
['Lorem ipsum', 'ipsum dolor', 'dolor sit', 'sit amet', 'amet, consectetur', 'consectetur adipiscing', ...]

我该如何使其工作? 谢谢!

8个回答

12

您可以对以下两个单词片段使用zip:

words = line.split()
print(list(map(' '.join, zip(words[:-1], words[1:]))))

这会输出:

['Lorem ipsum', 'ipsum dolor', 'dolor sit', 'sit amet,', 'amet, consectetur', 'consectetur adipiscing', 'adipiscing elit,', 'elit, sed', 'sed do', 'do eiusmod', 'eiusmod tempor', 'tempor incididunt', 'incididunt ut', 'ut labore', 'labore et', 'et dolore', 'dolore magna', 'magna aliqua.']

您的解决方案中每个句子末尾的逗号都没有省略,例如在输出中看到的单词“sit amet,”。我猜应该是“sit amet”。 - Naseer Mohammad

4

简单的for循环

l = line.split(' ')
result = []
for i in range(len(l) - 1):
    result.append(l[i] + ' ' + l[i+1])
print(result) 
# ['Lorem ipsum', 'ipsum dolor', 'dolor sit', 'sit amet,', 'amet, consectetur', 'consectetur adipiscing', 'adipiscing elit,', 'elit, sed', 'sed do', 'do eiusmod', 'eiusmod tempor', 'tempor incididunt', 'incididunt ut', 'ut labore', 'labore et', 'et dolore', 'dolore magna', 'magna aliqua.', 'Lorem ipsum', 'ipsum dolor', 'dolor sit', 'sit amet,', 'amet, consectetur', 'consectetur adipiscing', 'adipiscing elit,', 'elit, sed', 'sed do', 'do eiusmod', 'eiusmod tempor', 'tempor incididunt', 'incididunt ut', 'ut labore', 'labore et', 'et dolore', 'dolore magna', 'magna aliqua.']

3
你需要的是 nltk.bigrams()
import nltk
bigrm = list(nltk.bigrams(line.split()))

谢谢您的建议。Python标准库中是否包含'nltk'? - Litwos

2
你可以从构建line中的单词列表开始。
words = line.split()

然后,您可以使用切片生成包含连续对的列表的列表。
pairs = [words[i:i + 2] for i in range(len(words))]

最后,您可以将每对内容用' '连接起来。
result = [" ".join(pair) for pair in pairs if len(pair) > 1]

1
你可以尝试类似这样的东西,我不知道Python语法所以用Java回答。也许你可以将其转换为Python。
String line = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
    String[] split = line.split(" ");
    String [] line_two = new String[split.length-1];

    for (int i = 1; i < split.length; i++) {
        line_two[i-1] =split[i-1] +" "+split[i];
    }

1
您可以使用带有zip的惰性生成器:
def split_line(in_line):
    line_sp = line.split()
    yield from map(' '.join, zip(line_sp, line_sp[1:]))

print(list(split_line(line)))

['Lorem ipsum', 'ipsum dolor', 'dolor sit', 'sit amet,',
 ...
 'labore et', 'et dolore', 'dolore magna', 'magna aliqua.']

1
你也可以尝试使用正则表达式:

rslt=[ " ".join(tup) for tup in re.findall(r"(\w+)\W+(?=(\w+))",line) ]

\w+ 一个或多个单词字符;

(\w+) 我们捕获匹配的模式;

\W+ 一个或多个非单词字符;

(?=(\w+)) 向前查找 (?=...),但不向前移动,捕获下一个单词。


0

无论价值如何,只需将循环的迭代值从2更改为1:

之前:

line_sp = line.split(" ")
line_two = [" ".join(line_sp[i:i + 2]) for i in range(0, len(line_sp), 2)]
return line_two

已修复:

line_sp = line.split(" ")
line_two = [" ".join(line_sp[i:i + 2]) for i in range(0, len(line_sp),1)]
return line_two

打印(split_line(line))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接