一个数组分成10个一组,剩余的单独成组,取切片索引,大体意思如图所示。有什么更好的方法吗?库函数更好

一个数组分成10个一组,剩余的单独成组,取下标,如[0,1,2,3,4,5,6,7,8,9,10,11] 结果为 [0,10] [11,12]

def slice_array(total, per):
    for i in range(0, math.ceil(total / per)):
        yyy = math.ceil(total / per) - 1
        if i == yyy:
            yield [i * per, i * per + (total - yyy * per)]
        else:
            yield [i * per, i * per + per]

for i in slice_array(22,10):
    print(i)

其实我需要lodash的chunk方法的python版本

_.chunk(array, [size=1])
将数组(array)拆分成多个 size 长度的区块,并将这些区块组成一个新数组。 如果array 无法被分割成全部等长的区块,那么最后剩余的元素将组成一个区块。

引入版本
3.0.0

参数
array (Array): 需要处理的数组
[size=1] (number): 每个数组区块的长度
返回
(Array): 返回一个包含拆分区块的新数组(注:相当于一个二维数组)。

例子
_.chunk(['a', 'b', 'c', 'd'], 2);
// => [['a', 'b'], ['c', 'd']]
 
_.chunk(['a', 'b', 'c', 'd'], 3);
// => [['a', 'b', 'c'], ['d']]
阅读 2.4k
2 个回答

参考 peeweebulk_createbatch_size 参数的实现:👇

import itertools

izip_longest = itertools.zip_longest


def chunked(it, n):
    marker = object()
    for group in (list(g) for g in izip_longest(*[iter(it)] * n,
                                                fillvalue=marker)):
        if group[-1] is marker:
            del group[group.index(marker):]
        yield group


print(list(chunked([1, 2, 3, 4, 5, 6, 7], 3)))

输出结果:👇

[[1, 2, 3], [4, 5, 6], [7]]
function slice(arr, count) {
    let length = arr.length
    let start = 0
    let result = []
    while (start < length) {
        let end = Math.min(start + count - 1, length - 1)
        result.push([start, end])
        start = end + 1
    }
    return result
}

console.log(slice([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 3))
console.log(slice([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 4))

是这个意思不
注:以上代码包括测试用例,70%由copilot生成

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进