python根据字符串中的长度将数字字符串分为多个部分

2024-09-25 12:21:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数字字符串,我想从文件中读取并解析成子部分,子部分的长度基于字符串中的数字。字符串中的第一个数字是第一个子节的长度。例如,如果我有一个数据字符串,如下所示: 4、11、22、33、3、44、55、5、44、55、66、77

我想分成以下几部分:

第一小节的长度是4,所以,4,11,22,33

第二小节是长度3,所以是3,44,55

第三小节是长度5,所以5,44,55,66,77

我尝试在slice中使用变量,以便在遍历数据时可以增加start/stop值,但不需要变量。我找到了一种方法,可以在执行过程中删除每个小节,以便第一个值始终是下一小节的长度,但看起来有点笨拙。你知道吗

如果您有任何建议,我将不胜感激-谢谢


Tags: 数据方法字符串过程slice数字start建议
3条回答

在处理更复杂的逻辑时,我更喜欢使用常规循环。你知道吗

在本例中,我将使用while循环,运行直到列表为空,并删除已处理的元素。如果节是错误的(即最后一节超出了字符串的大小),assert将告诉您。你知道吗

sequence = [4, 11, 22, 33, 3, 44, 55, 5, 44, 55, 66, 77]
sections = []
while sequence:
    section_size = sequence[0]
    assert len(sequence) >= section_size
    sections.append(sequence[:section_size])
    sequence = sequence[section_size:]

print sections

这将分割部分并将它们保存在名为sections的列表中,大小作为第一个元素,如示例中所示。你知道吗

编辑:添加了错误检查。你知道吗

我只是想把这个扔出去。与BoppreH的解决方案非常相似,但它通过迭代索引避免了创建n额外列表的开销:

def generateSlices(seq):
    i = 0
    while i < len(seq):
        n = x[i]
        yield x[i:i + n]
        i += n

生成子列表后,可以通过执行以下操作检查错误:

mySubLists = [[5, 23, 33, 44, 2], [10]]

all(len(x) == x[0] for x in mySubLists)

顺便问一下,为什么您的数据以这种奇怪的方式构建?它似乎容易出错。你知道吗

你可以这样做:

your_list = [4, 11, 22, 33, 3, 44, 55, 5, 44, 55, 66, 77]
subsec = []
it = iter(your_list)
for n in it:
    subsec.append([n] + map(lambda x: next(it), range(int(n-1))))

这样你只会在你的列表上循环一次。你知道吗

或者

for n in it:
    subsec.append([n] + [next(it) for _ in range(int(n-1))])

相关问题 更多 >