从关键字之间的列表中提取特定的数据块

2024-09-30 08:20:20 发布

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

我试图在关键词之间提取列表的特定部分,即介于和之间的所有内容,忽略其他所有内容。你知道吗

['badsffsg\n', 'fssdfsdgdg\n''<begin data>\n', 'data\n', '<end data>\n', 'bagsdg\n', 'fsdgdg\n', '<begin data>\n', 'data\n', 'data\n', '<end data>\n' 'gsdg\n']

我搞不清楚如何遍历这个列表。我解决了一个类似的问题,但它是针对字典中固定索引处只有一个数据块的情况。你知道吗

def extract_person(lines, start_index=0):

    start = start_index
    end = lines.index('<end data>\n', start_index + 1)   
    mylist = []

    for line in range(start + 1, end):

这一次是一个列表,有多个数据块,它不确定数据从哪里开始。我需要的是一些建议。你知道吗


Tags: 数据内容列表dataindexstart关键词end
3条回答

使用列表的索引方法对您有利。你知道吗

some_data = ['a', 2, 'b', 'start', 1, 2, 3, 'end']

start = some_data.index('start')+1
end = some_data.index('end')

for data in some_data[start:end]:
    print(data)

这个输出

1
2
3

如果缺少标记,可以添加条件测试

当然,有几种不同的方法来编写解决方案。让我们忘记使用索引(因为当找不到标记时需要捕获异常;我假设您需要一个没有索引的简单算法)。如果您仔细阅读这两个描述,下面的代码实际上是Michael建议的变体:

data = ['a', 2, 'b',
        'start', 1, 2, 3, 'end',
        'c', 'd',
        'start', 2, 2, 5, 'end',
        10,
        'start', 5, 6 ,7, 'end']

blocks = [] # to keep valid data blocks
pos = 0
end = len(data)
while pos < end:
    if data[pos] == 'start':
        block = []
        pos += 1
        while pos < end and data[pos] != 'end': # condition order important!
            block.append(data[pos])
            pos += 1
        blocks.append(block)
    else:
        pos += 1

print(blocks)

说明:

我们将在变量blocks中收集有效的数据块。你知道吗

我们使用pos(position)从开始到end(而不是更多)遍历列表以保持当前索引位置。找到'start'意味着创建一个空的新block来存储下一个项目,直到找到一个'end'标记。你知道吗

我们附加块数据,但要注意列表不会过早结束,直到找到'end'标记。条件顺序很重要,因为否则我们可能会尝试使用无效(太大)索引访问data。如果左侧的第一个条件已经为False,则and运算符右侧的条件不会被计算,因此在这种情况下不会出现错误。你知道吗

我们继续,直到名单结束。你知道吗

如果有一个'start'标记没有和'end'标记,则在结果blocks列表中会留下最后一个空块。你知道吗

如果当前在数据块中,请使用变量作为标志。最初将标志设置为False。你知道吗

遍历列表,遇到block start时,将flag设置为True。 如果标志是True,列表项既不是开始标记也不是结束标记,则处理作为当前数据块一部分的列表项。遇到block end时,将flag设置为False,并可能对关闭的数据块进行一些最终处理。你知道吗

相关问题 更多 >

    热门问题