成对分割所有并排单词的字符串单词

时间:2013-04-20 23:04:41

标签: python

我需要将字符串拆分成单词,然后将每个连续的单词成对加入,如下所示:

"This is my subject string"  

会去:

"This is"    
"is my"  
"my subject"  
"subject string" 

字符串可以是5个字到250个字。此外,它将在大量数据上执行此操作,1GB左右。有没有一种有效的方法在Python中执行此操作?

我已经看到很多关于哪种方法最有效的建议,所以想先问一下。

6 个答案:

答案 0 :(得分:5)

您可以使用拆分方法和列表推导来完成:

text = "This is my subject string"
words = text.split() #note that split without arguments splits on whitespace
pairs = [words[i]+' '+words[i+1] for i in range(len(words)-1)]
print(pairs)

答案 1 :(得分:5)

为此准备了itertools recipe called pairwise!你也不会使用它。

>>> from itertools import tee, izip
>>> def pairwise(iterable):
        "s -> (s0,s1), (s1,s2), (s2, s3), ..."
        a, b = tee(iterable)
        next(b, None)
        return izip(a, b)


>>> list(pairwise(text.split()))
[('This', 'is'), ('is', 'my'), ('my', 'subject'), ('subject', 'string')]

答案 2 :(得分:0)

在这种情况下,天真的实现应该可以正常工作,假设每个字符串都很小(不是1GB)

string = "This is my subject string"

words = string.split()
prevWord = None

for word in words:
    if prevWord != None:
        print prevWord, word
    prevWord = word

与往常一样,在处理相当大的数据集时,您需要阅读一个项目,处理它,阅读下一个项目等。不要尝试split()整个文件。

答案 3 :(得分:0)

如果你不介意计算初始列表的长度,那么你可以这样做:

s = 'this is a test string'.split()
n = len(s)
for first, second in itertools.izip(itertools.islice(s, 0, n-1), itertools.islice(s, 1, n)):
    print(first, second)

输出:

('this', 'is')
('is', 'a')
('a', 'test')
('test', 'string')

这对于大量数据应该是有效的,因为你没有创建一个巨大的列表(除了你已有的列表)。

答案 4 :(得分:0)

>>> import re
>>> text = "This is my subject string"
>>> re.findall(r'(\w+)\s+(?=(\w+))', text)
[('This', 'is'), ('is', 'my'), ('my', 'subject'), ('subject', 'string')]

如果你需要一个发电机,只需使用re.finditer

pairs = (m.groups() for m in re.finditer(r'(\w+)\s+(?=(\w+))', text))

这非常快/高效,第二个版本将是最有效的,因为它不会立即将所有单词存储在内存中,但它不会那么快。您必须分析建议给您的方法,以确定哪种方法适合您。

答案 5 :(得分:-1)

这是Pythonic方式

from itertools import izip
[' '.join(pair) for pair in izip(words[:-1], words[1:])]

izip 会保持效率或多或少