如何编写Python函数计算适配所有ID的最小8倍数批次大小
问题分析
你需要实现一个Python函数,输入ID列表,返回最小的8的倍数作为批次大小,使得所有ID都能被包含在同一个连续批次区间中(区间从1开始划分,每个区间长度为该8的倍数)。
原代码的逻辑错误在于:它仅以最大ID为基准,寻找大于等于最大ID的最小8的倍数,完全忽略了最小ID的位置——当批次大小小于最大ID时,所有ID仍有可能落在同一个区间内(如示例2),而原代码无法处理这种情况。
正确思路
要解决这个问题,核心是找到最小的8的倍数k,使得最小ID所在的批次区间的结束值大于等于最大ID。具体步骤:
- 先获取ID列表的最小值
min_id和最大值max_id。 - 从最小的8的倍数(即8)开始依次尝试,每次递增8:
- 计算
min_id所在批次的结束值:((min_id - 1) // k + 1) * k(这个公式的作用是找到大于等于min_id的最小k的倍数)。 - 如果该结束值大于等于
max_id,说明所有ID都落在这个区间内,此时的k就是我们要找的最小批次大小。
- 计算
正确代码实现
def smallest_batch_size(ids): min_id = min(ids) max_id = max(ids) k = 8 while True: interval_end = ((min_id - 1) // k + 1) * k if interval_end >= max_id: return k k += 8
测试验证
示例1:输入
[15, 16, 17]min_id=15,max_id=17- 尝试
k=8:区间结束值为(14//8 +1)*8=16,小于17,不满足; - 尝试
k=16:区间结束值为(14//16 +1)*16=16,仍小于17,不满足; - 尝试
k=24:区间结束值为(14//24 +1)*24=24,大于等于17,返回24,符合预期。
示例2:输入
[98, 99, 100, 101]min_id=98,max_id=101- 尝试
k=8:区间结束值为(97//8 +1)*8=104,大于等于101,返回8,符合预期。
内容的提问来源于stack exchange,提问作者Wisdom
相关产品推荐
相关产品推荐

