Python在移动窗口中拆分字符串

时间:2011-10-03 13:56:35

标签: python string split

我有一个包含数字的字符串 - digit = "7316717"

现在我想以这样的方式拆分字符串,使得输出一次是3位数的移动窗口。所以我得到了 -

["731", "316", "167", "671", "717"]

该方法将如何?直截了当的方式是进行for循环和迭代。但我觉得一些内置的python字符串函数可以用更少的代码完成。知道任何这样的方法吗?

4 个答案:

答案 0 :(得分:11)

itertools examples提供了window功能,可以做到:

from itertools import islice
def window(seq, n=2):
    "Returns a sliding window (of width n) over data from the iterable"
    "   s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...                   "
    it = iter(seq)
    result = tuple(islice(it, n))
    if len(result) == n:
        yield result    
    for elem in it:
        result = result[1:] + (elem,)
        yield result

使用示例:

>>> ["".join(x) for x in window("7316717", 3)]
['731', '316', '167', '671', '717']

答案 1 :(得分:8)

>>> s = "7316717"
>>> [s[i:i+3] for i in range(len(s)-2)]
['731', '316', '167', '671', '717']

答案 2 :(得分:3)

itertools docs中有一个非常好的食谱pairwise

为组中的n元素进行一些现代化,我制作了这段代码:

from itertools import tee, izip

def window(iterable, n):
    els = tee(iterable, n)
    for i, el in enumerate(els):
        for _ in xrange(i):
            next(el, None)
    return izip(*els)


print(["".join(i) for i in window("2316515618", 3)])

Python 2.7

答案 3 :(得分:0)

digit = "7316717"
digit_sets = [digit[i:i+3] for i in range(len(digit)-2)]