Python3中如何生成列表指定长度的连续升序数字组合
问题根源
itertools.permutations的作用是生成输入序列指定长度的全排列,生成结果既不保留元素在原列表的相邻位置关系,也不会自动做升序校验,因此会出现(1,3,2)这类乱序、元素不连续的结果,和「提取原列表连续三个元素构成升序元组」的需求不匹配。
实现方案
方案1:原生索引遍历(无额外依赖,可读性最高)
直接按索引遍历原列表,每次截取连续3个元素打包为元组即可,逻辑简单不容易出错:
lst = [1,2,3,4,5] res = [] # 循环终止位置设为列表长度减2,避免索引超出范围 for idx in range(len(lst) - 2): res.append((lst[idx], lst[idx+1], lst[idx+2])) print(res)
运行输出:
[(1, 2, 3), (2, 3, 4), (3, 4, 5)]
注意:如果输入列表本身不是升序状态,提前执行lst = sorted(lst)做排序即可保证输出符合升序要求。
方案2:itertools滑动窗口实现(适合大列表/通用窗口场景)
如果要适配任意长度的连续窗口,可以用itertools.islice构造错位迭代器,和原列表zip后自动生成连续元组,内存效率更高,适合处理超长列表:
from itertools import islice lst = [1,2,3,4,5] # 构造3个偏移量分别为0、1、2的迭代器,zip打包后刚好得到连续三元组 res = list(zip(lst, islice(lst, 1, None), islice(lst, 2, None))) print(res)
运行输出和方案1完全一致。如果要生成n个元素的连续组,只需要对应增加对应偏移量的islice迭代器即可,不需要修改循环逻辑。
内容的提问来源于stack exchange,提问作者Hung
相关产品推荐
相关产品推荐

