0

我有一串数字,我想从文件中读取并解析成小节,小节的长度基于字符串中的数字。字符串中的第一个数字是第一个小节的长度。例如,如果我有一串数据如下: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

我尝试在切片中使用变量,以便在遍历数据时增加开始/停止值,但它不需要变量。我想出了一种方法来删除每个小节,这样第一个值将始终是下一个小节的长度,但这似乎有点笨拙。

我会很感激任何建议-谢谢

4

3 回答 3

3

您可以执行以下操作:

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))])
于 2013-02-19T01:09:44.807 回答
1

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

在这种情况下,我会使用一个while循环,一直运行到列表为空,然后删除已处理的元素。如果这些部分是错误的(即最后一个部分超出了字符串的大小),断言会告诉你。

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,并将大小作为第一个元素,就像在您的示例中一样。

编辑:添加错误检查。

于 2013-02-19T01:06:41.703 回答
0

Just thought I'd throw this out there. Very similar to both BoppreH's solution, but it avoids the overhead of creating n additional lists by iterating over indices:

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

You can check for errors after generating a list of sublists by doing:

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

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

Incidentally, why is your data structured in this strange way? It seems error-prone.

于 2013-02-19T01:43:05.817 回答