Python 循环遍历列表、枚举并在特定索引处开始和结束,但不修改索引

问题描述 投票:0回答:1

我有一个文本文件作为列表,每一行都是列表中的一个项目。该列表包含多个开始标记和结束标记(但不是结构化的),我必须迭代开始标记和结束标记之间的文件处理数据。由于文件中存在潜在错误,如果开始标记和结束标记之间的某些数据丢失,我必须忽略该数据部分。

为此,我首先收集有效开始索引和有效结束索引的列表,确保开始索引和结束索引的数量相同。然后我必须迭代这些切片并检查它们之间是否缺少数据,如果有则丢弃开始和结束索引。问题是,由于稍后的处理,我需要保留该行的实际索引,因此我无法轻松使用切片,并且到目前为止我还没有发现在 for 循环中设置开始和结束位置的好方法已枚举。

因此假设列表中行的索引是: 开始 = [1,32,60,90] 结束 = [29,59,65,125]

所以我现在需要处理 filelist[1:29] 和 filelist[32:59] 等,但这样做是行不通的,因为在 for 循环内,它改变了实际数据的索引,使得第 32 行将变成第 0 行。我不能这样做,因为我需要存储在为程序的另一部分处理该数据时找到的其他索引。是的,我可以解释这一点,但这很烦人并且使可读性变得复杂,并且必须有一种方法可以在 Python 中做到这一点 - 在 C 中做到这一点将非常简单:

saved_index=[]
for index in range(start):
    for i,l in enumerate(filelist[start[index]:end[index]]):
        if "blah" in l:
            saved_index.append(i) #this won't work i is index of subset not original list

那么我怎样才能只迭代第 1 到 29 行,然后迭代第 32 到 59 行,获得文件列表的行索引,而不使用子集来更改它呢?

python python-3.x list slice enumerate
1个回答
0
投票

不要切片,只需像在 C 中那样迭代索引即可。

saved_index=[]
for index in range(start):
    for i in range(start[index], end[index]+1):
        if "blah" in filelist[i]:
            saved_index.append(start[index]+i)

但是即使是切片也可以工作,因为你知道偏移量

saved_index=[]
for index in range(start):
    for i,l in enumerate(filelist[start[index]:end[index]]):
        if "blah" in l:
            saved_index.append(i)
© www.soinside.com 2019 - 2024. All rights reserved.