如何实现数据分块:首块较大剩余块均等,附Python代码修改需求
数据集分块代码修改方案
你原有代码存在以下问题,不符合需求:
- 最终返回值仅包含剩余部分的分块,完全丢失了首个大尺寸块
- 首个块大小被设置为
size//2,反而比后续分块更小,和「首块尺寸更大」的要求相反 - 剩余数据切分的索引起始位置错误,会和首块数据产生重叠
- 剩余数据无法整除分块大小时会丢失尾部数据
- 参数校验抛出的异常类型错误,参数值非法应该抛出
ValueError而非TypeError
修改后可直接使用的代码
def chunk_data(dataset, first_chunk_size=15, rest_chunk_size=10): """ 数据集分块:首个块尺寸更大,剩余数据切分为大小均等的块 :param dataset: 待分块的可索引数据集 :param first_chunk_size: 首个块的大小,需大于rest_chunk_size :param rest_chunk_size: 剩余部分每个块的大小 """ total_len = len(dataset) # 参数合法性校验 if first_chunk_size >= total_len: raise ValueError("first_chunk_size must be less than total length of dataset") if rest_chunk_size <= 0: raise ValueError("rest_chunk_size must be greater than 0") if first_chunk_size <= rest_chunk_size: raise ValueError("first_chunk_size must be larger than rest_chunk_size to meet the requirement") # 切首个大尺寸块 chunks = [dataset[:first_chunk_size]] rest_data = dataset[first_chunk_size:] rest_len = len(rest_data) # 计算剩余部分的分块数量,向上取整避免丢失数据 num_rest_chunks = (rest_len + rest_chunk_size - 1) // rest_chunk_size # 切分剩余部分,起始位置偏移首块长度,避免重叠 for i in range(num_rest_chunks): start = i * rest_chunk_size end = start + rest_chunk_size chunks.append(rest_data[start:end]) return chunks
功能验证示例
# 测试:总长度100的数据集,首块20,剩余每个块10 test_data = list(range(100)) result = chunk_data(test_data, first_chunk_size=20, rest_chunk_size=10) print(len(result)) # 输出9:1个首块 + 8个剩余块 print(len(result[0])) # 输出20:首块符合预期大小 print([len(c) for c in result[1:]]) # 输出全为10:剩余块大小均等
如果你需要剩余块严格大小完全一致(不允许最后一块更小),可以替换剩余分块数量的计算逻辑:
# 严格均等分块,自动调整rest_chunk_size,整除剩余数据长度 num_rest_chunks = 8 # 可自行指定剩余分块数量,或者根据需求计算 rest_chunk_size = rest_len // num_rest_chunks
内容的提问来源于stack exchange,提问作者user4556432
相关产品推荐
相关产品推荐

