Python查找数组所有第n个元素时return终止循环如何解决
问题核心
提取数组中所有间隔为n的元素时,原函数在第一次命中匹配项后就执行return True终止执行,无法遍历完整数组,也无法识别后续所有符合间隔规则的元素。
原实现代码:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] def get_nth(n, array): iterable_found = 0 for i in range(len(array)): print(i) if i == (iterable_found + n): iterable_found += n return True return False # 测试输出仅遍历到索引5就终止 print(get_nth(5, numbers))
测试输出:
0 1 2 3 4 5 True
问题原因
- 匹配分支内的
return True会直接中断函数执行,第一次命中符合条件的索引后,后续循环逻辑不会再运行 - 函数没有持久化记录已处理的位置,直接放入
while True流式读取场景时,每次调用都会从头遍历数组,会重复返回已经匹配过的结果,无法适配CSV持续新增数据的场景
修改方案
1. 全量遍历版本(一次性提取数组内所有第n个元素)
移除分支内的提前返回逻辑,遍历完整数组收集所有匹配项:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] def get_all_nth(n, array): match_items = [] # 步长设为n直接遍历所有符合间隔的索引,无需逐一遍历判断 for idx in range(n-1, len(array), n): print(f"匹配索引:{idx},对应值:{array[idx]}") match_items.append(array[idx]) return match_items # 测试 print(get_all_nth(5, numbers))
运行后会完整遍历数组,返回第5、10、15个元素(对应值5、10、15),不会提前终止。
2. 流式读取适配版本(适配WebSocket写CSV+while True轮询场景)
新增已处理位置标记,每次调用仅遍历上次处理后新增的数组部分,避免重复匹配、漏匹配:
import numpy as np # 记录已处理到的数组索引,初始值为-1代表还未处理任何元素 last_process_idx = -1 def stream_get_nth(n, array): global last_process_idx new_matches = [] current_len = len(array) # 仅遍历上次处理结束位置之后的新增元素 for idx in range(last_process_idx + 1, current_len): # 按自然计数(第1个元素对应索引0)判断是否为第n个元素,可根据实际计数规则调整条件 if (idx + 1) % n == 0: print(f"命中新的第{n}个元素,索引:{idx},值:{array[idx]}") new_matches.append(array[idx]) # 更新已处理位置到当前数组末尾 last_process_idx = current_len - 1 return new_matches # 轮询逻辑 while True: # 实时读取最新CSV内容 array = np.genfromtxt('feed.csv', delimiter = ',') match_res = stream_get_nth(5, array) if match_res: print(f"新增匹配元素:{match_res}")
提示:如果你的匹配规则是取索引为n、2n、3n的元素(而非自然计数的第n个),将判断条件改为
if idx % n == 0 and idx !=0即可。
内容的提问来源于stack exchange,提问作者testerboy22
相关产品推荐
相关产品推荐

