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

提问人:KyferEz 提问时间:11/2/2023 更新时间:11/2/2023 访问量:54

问:

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

为此,我首先收集了有效起始索引和有效结束索引的列表,确保起始索引和结束索引的数量相同。然后,我必须遍历这些切片,并检查它们之间是否缺少数据,如果有,则丢弃开始和结束索引。问题是由于后期处理,我需要保留行的实际索引,所以我不能轻松使用切片,到目前为止,我还没有发现在枚举的 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 的行索引,而不使用子集更改它呢?

python-3.x 列表 切片 枚举

评论

0赞 JNevill 11/2/2023
save_index.append(start[index]+i)还不错
0赞 Ajay Pun Magar 11/2/2023
在丢弃数据并将其减去索引之前对数据进行计数呢?
0赞 KyferEz 11/2/2023
@JNevill如果这就是我所要做的,不,但还有更多的事情要做;我已经简化了它。同样令人沮丧的是,我什至不得不使用这样的技巧。对我来说,必须这样做不是 Pythonic。
0赞 KyferEz 11/2/2023
@AjayPunMagar丢弃?我从不丢弃数据。还是我误会你了?
0赞 Ajay Pun Magar 11/2/2023
“然后,我必须遍历这些切片,并检查它们之间是否缺少数据,如果有,则丢弃开始和结束索引。我想我误会了。

答:

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)