Python中根据数值数组将列表分割为指定长度子集的实现问询
实现方案
方法1:指针遍历法(无额外依赖,易理解)
维护一个标记当前切割起始位置的指针,遍历切割长度数组t,每次截取s中从起始位置开始、长度为当前t元素的子列表,之后更新指针位置即可。
s = ['Y', 'U', 'U', 'N', 'U', 'U', 'N', 'N', 'N'] t = [2, 4, 3] st = [] start = 0 for length in t: st.append(s[start:start+length]) start += length print(st) # 输出:[['Y', 'U'], ['U', 'N', 'U', 'U'], ['N', 'N', 'N']]
替换t为[5, 2, 2]运行后,输出为[['Y', 'U', 'U', 'N', 'U'], ['U', 'N'], ['N', 'N']],完全符合预期。
方法2:迭代器推导式(写法更简洁)
借助迭代器取值后自动后移的特性,配合itertools.islice可以不用手动维护指针,实现更简洁的写法:
from itertools import islice s = ['Y', 'U', 'U', 'N', 'U', 'U', 'N', 'N', 'N'] t = [5, 2, 2] iter_s = iter(s) st = [list(islice(iter_s, n)) for n in t] print(st) # 输出:[['Y', 'U', 'U', 'N', 'U'], ['U', 'N'], ['N', 'N']]
两种方法均默认支持sum(t) <= len(s)的场景,若sum(t)大于s的总长度,末尾的子列表会自动截取到s结束为止,不会抛出异常。
内容的提问来源于stack exchange,提问作者Chr_8580
相关产品推荐
相关产品推荐

