Python 如何按多个长度拆分字符串?

Python 如何按多个长度拆分字符串?,python,string,list,split,Python,String,List,Split,这是我在表格中的第一个问题 例如: 我有这个字符串==294216673539910447 还有这个数字列表==[3,2,3,3,2,2,3] 我需要输出==[294,21667,353,99,10447] 我在表单中找到的所有内容都是按x拆分的,但与多x无关的内容请尝试以下操作: def split(s, len_arr): res = [] start = 0 for part_len in len_arr: res.append(s[start:st

这是我在表格中的第一个问题

例如: 我有这个字符串==
294216673539910447
还有这个数字列表==
[3,2,3,3,2,2,3]
我需要输出==
[294,21667,353,99,10447]

我在表单中找到的所有内容都是按x拆分的,但与多x无关的内容请尝试以下操作:

def split(s, len_arr):
    res = []
    start = 0
    for part_len in len_arr:
        res.append(s[start:start+part_len])
        start += part_len
    return res

> split("294216673539910447", [3, 2, 3, 3, 2, 2, 3])
> ['294', '21', '667', '353', '99', '10', '447']

Python中没有multiplit,因此最好自己实现它

我知道如何使用
numpy
实现功能,我将尝试使用Python重复相同的步骤:

from itertools import accumulate
s = '294216673539910447'
numbers = [3, 2, 3, 3, 2, 2, 3]
idx = list(accumulate(numbers, initial=0))
print([s[i:j] for i,j in zip(idx[:-1], idx[1:])])
这说明了一种应用累积总和的漂亮方法<代码>累计计算指数位置,它们是
[0,3,5,8,11,13,15,18]
。因此,您需要正确地排列它们以获得切片
0:3
3:5
,…,
15:18

输出
使用迭代器,并使用
“”.join()
将其合并,如:

def split(s, arr):
    iterator = iter(s)
    return ["".join(next(iterator) for _ in range(length)) for length in arr]

print(split('294216673539910447', [3, 2, 3, 3, 2, 2, 3]))
结果:

['294', '21', '667', '353', '99', '10', '447']

另一种方法是-转换为字符串并按索引拆分

在Python中,可以通过以下方式完成:

number=str(294216673539910447)
分割=[3,2,3,3,2,2,3]
计数=0
结果=[]
对于拆分中的s:
result.append(int(number[count:s+count]))
计数+=s
打印(结果)
其输出:

[294, 21, 667, 353, 99, 10, 447]

我写了一个函数,可以灵活地使用不同类型的输入来实现这一点

import itertools

def splits(sequence, indexes, relative=False):
    """
    Split sequence at each index in "indexes".

    If "relative" is True, each index is taken as relative to the previous one.

    >>> list(splits('hello world', [3, 6]))
    ['hel', 'lo ', 'world']
    >>> list(splits('hello world', [3, 3], relative=True))
    ['hel', 'lo ', 'world']
    """
    if relative:
        indexes = itertools.accumulate(indexes)
    start = None
    for stop in itertools.chain(indexes, [None]):
        yield sequence[start:stop]
        start = stop  # For next loop
实际上:

>>> list(splits('294216673539910447', [3, 2, 3, 3, 2, 2], True))
['294', '21', '667', '353', '99', '10', '447']

请注意,您不需要输入列表中的最后一个索引。

欢迎使用Stack Overflow,请向我们展示您的尝试。首先,我认为23是错误的。我想输出应该是21。我给你一个提示。你需要一个循环。试试看,让我们看看你有什么收获。:)相关的:
>>> list(splits('294216673539910447', [3, 2, 3, 3, 2, 2], True))
['294', '21', '667', '353', '99', '10', '447']