提问人:KyferEz 提问时间:11/2/2023 更新时间:11/2/2023 访问量:54
Python 遍历 list、enumerate、start 和 end at specific index,但不修改索引
Python loop through list, enumerate, and start and end at specific index, but do not modify the index
问:
我有一个文本文件作为列表,每一行都是列表中的一个项目。此列表包含多个开始标记和结束标记(但其他方面不是结构化的),我必须遍历开始标记和结束标记之间的文件处理数据。由于文件中存在潜在错误,如果缺少开始标记和结束标记之间的某些数据,则必须忽略该部分数据。
为此,我首先收集了有效起始索引和有效结束索引的列表,确保起始索引和结束索引的数量相同。然后,我必须遍历这些切片,并检查它们之间是否缺少数据,如果有,则丢弃开始和结束索引。问题是由于后期处理,我需要保留行的实际索引,所以我不能轻松使用切片,到目前为止,我还没有发现在枚举的 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 行,拥有 filelist 的行索引,而不使用子集更改它呢?
答:
3赞
Malcolm
11/2/2023
#1
不要切片,只需像在 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(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(start[index]+i)
评论
0赞
KyferEz
11/2/2023
我觉得自己很傻......第一个正是我想要的。现在很明显了,哈哈,谢谢!
1赞
Kelly Bundy
11/2/2023
#2
只需告诉从起始索引开始。enumerate
saved_index=[]
for s,e in zip(start, end):
for i,l in enumerate(filelist[s:e], s):
if "blah" in l:
saved_index.append(i)
评论
save_index.append(start[index]+i)
还不错