如何将列表拆分为最小固定大小分块,让最后一块包含全部剩余元素
问题原因
原代码的问题出在循环次数计算逻辑:int(len(lst)/3)会对除法结果向下取整,当列表长度不是分块大小的整数倍时,最后不足分块大小的元素会被直接跳过。同时你现有代码每次切片只取3个元素,即使后续还有剩余元素也不会处理。
修复方案
方案1:按你要求的分块规则(最后一块包含所有剩余元素,共3个分块)
如果你要求最终分块为[[0,1,2], [3,4,5], [6,7,8,9]],即当剩余元素不足2倍分块大小时,全部合并为最后一块,可以用以下代码:
lst = [0,1,2,3,4,5,6,7,8,9] chunk_size = 3 chunks = [] current_idx = 0 total_len = len(lst) while current_idx < total_len: # 剩余元素不足2倍分块大小时,全部作为最后一块 if total_len - current_idx < 2 * chunk_size: chunks.append(lst[current_idx:]) break chunks.append(lst[current_idx:current_idx + chunk_size]) current_idx += chunk_size # 如果需要扁平化的结果列表,直接拼接所有子列表即可 templist = sum(chunks, []) print(chunks) print(templist)
运行输出:
[[0, 1, 2], [3, 4, 5], [6, 7, 8, 9]] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
方案2:通用分块规则(最后一块可小于分块大小)
如果允许最后一块小于3个元素(即最终分块为[[0,1,2], [3,4,5], [6,7,8], [9]]),可以用更简洁的Python切片写法,性能也更高:
lst = [0,1,2,3,4,5,6,7,8,9] chunk_size = 3 # 列表推导式直接生成分块 chunks = [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)] templist = sum(chunks, []) print(chunks) print(templist)
运行输出:
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
内容的提问来源于stack exchange,提问作者Riham ELSAADANY
相关产品推荐
相关产品推荐

