У нас есть две ортогональные проблемы:
- Как разбить строку.
- Как построить группы из 3 последовательных элементов.
Для 1 вы можете использовать регулярные выражения или - как уже указывали другие - достаточно простого str.split
.Для 2 обратите внимание, что вы хотите, чтобы выглядело очень похоже на pairwise
абстракцию в рецептах itertools :
http://docs.python.org/library/itertools.html#recipes
Итак, мы пишем нашу обобщенную n-мудрую функцию:
import itertools
def nwise(iterable, n):
"""nwise(iter([1,2,3,4,5]), 3) -> (1,2,3), (2,3,4), (4,5,6)"""
iterables = itertools.tee(iterable, n)
slices = (itertools.islice(it, idx, None) for (idx, it) in enumerate(iterables))
return itertools.izip(*slices)
И мы получаем простой и модульный код:
>>> s = "The quick, brown fox jumps over the lazy dog."
>>> list(nwise(s.split(), 3))
[('The', 'quick,', 'brown'), ('quick,', 'brown', 'fox'), ('brown', 'fox', 'jumps'), ('fox', 'jumps', 'over'), ('jumps', 'over', 'the'), ('over', 'the', 'lazy'), ('the', 'lazy', 'dog.')]
Или, как вы просили:
>>> # also: map(" ".join, nwise(s.split(), 3))
>>> [" ".join(words) for words in nwise(s.split(), 3)]
['The quick, brown', 'quick, brown fox', 'brown fox jumps', 'fox jumps over', 'jumps over the', 'over the lazy', 'the lazy dog.']