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

14 投票
5 回答
5909 浏览
提问于 2025-04-17 03:35

我有一个包含数字的字符串,比如说 digit = "7316717"

现在我想把这个字符串分割成每次3个数字一组的方式。这样我就能得到:

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

那么该怎么做呢?最简单的方法是用一个循环来逐个处理。但我觉得Python里面有一些内置的字符串函数可以用更少的代码来实现这个功能。你知道有什么方法吗?

5 个回答

3

itertools 文档中,有一个非常不错的做法叫做 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

12

在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、数据库或者其他程序。为了让程序能更好地理解这些数据,我们通常会对它们进行一些处理,比如转换格式、清理无用信息等。

在这个过程中,可能会遇到一些问题,比如数据格式不对、缺少必要的信息,或者数据之间不兼容。这些问题会导致程序运行出错,或者得到不正确的结果。

为了避免这些问题,我们可以采取一些措施,比如在处理数据之前先检查它们的格式,确保它们符合我们的要求。此外,使用一些工具或者库来帮助我们处理数据,也能大大简化这个过程。

总之,处理数据是编程中非常重要的一部分,掌握一些基本的处理技巧,可以让我们的程序更加稳定和可靠。

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

itertools 示例中提供了一个叫做 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']

撰写回答