基于指定上限值生成固定大小分块列表的更优Python实现咨询
基于指定上限值生成固定大小分块列表的更优Python实现咨询
我现在需要根据一个上限值生成固定大小的分块列表,现有代码可以实现,但想知道有没有更简洁/高效的写法:
cap = 93 chunkSize = 10 chunks = [] while cap > 0: val = chunkSize if cap / chunkSize >= 1 else cap chunks.append(val) cap -= val for i, q in enumerate(chunks): print(i, q)预期输出是:
0 10 1 10 2 10 3 10 4 10 5 10 6 10 7 10 8 10 9 3我已经有可行的解决方案,只是想找更巧妙的实现方式。
首先,你的现有代码逻辑完全没问题,可读性也很好~不过确实有几种更简洁高效的写法,这里给你推荐两个常用的方案:
方案一:整数除法+取模运算(最简洁高效)
利用Python的整数运算特性,直接计算出完整分块的数量和剩余值,不需要循环迭代,代码非常紧凑,而且在cap数值很大时会比循环快得多:
cap = 93 chunkSize = 10 # 生成所有完整的分块 chunks = [chunkSize] * (cap // chunkSize) # 如果有剩余值,添加到列表末尾 remainder = cap % chunkSize if remainder: chunks.append(remainder)
甚至可以写成一行(可读性稍弱,但足够简洁):
chunks = [chunkSize]*(cap//chunkSize) + ([cap%chunkSize] if cap%chunkSize else [])
方案二:生成器实现(适合超大cap,节省内存)
如果cap特别大(比如百万甚至千万级),不想一次性生成整个列表占用内存,可以用生成器来按需生成每个分块,内存占用更低,也符合Python的迭代器设计习惯:
def generate_chunks(cap, chunk_size): while cap > 0: # 直接取当前cap和chunk_size的最小值,比你的条件判断更简洁 current_chunk = min(chunk_size, cap) yield current_chunk cap -= current_chunk cap = 93 chunkSize = 10 # 按需转换为列表,或者直接遍历生成器 chunks = list(generate_chunks(cap, chunkSize))
验证结果
不管用哪种方案,最终生成的chunks列表都是[10,10,10,10,10,10,10,10,10,3],执行你原来的遍历打印代码,输出和预期完全一致。
方案对比
- 你的原有循环写法:逻辑清晰,易于理解,适合小数值场景;
- 整数除法方案:代码最简洁,运算效率最高,适合大多数场景;
- 生成器方案:内存占用极低,适合处理超大数值的分块需求。
备注:内容来源于stack exchange,提问作者amrita
相关产品推荐
相关产品推荐

