📅  最后修改于: 2023-12-03 14:53:47.995000             🧑  作者: Mango
在编程中,我们经常需要将一个列表拆分成多个等长的子列表。这个过程可以用来做批处理、并行处理等等。Python和TypeScript都提供了非常容易实现的方法。
在Python中,我们可以使用列表切片来实现拆分。假设我们有一个长度为n的列表和一个整数k,我们需要将这个列表分成k个长度相等的子列表。那么可以这样实现:
def chunk_list(lst, k):
"""将lst拆分成k个长度相等的子列表"""
n = len(lst)
chunk_size = (n + k - 1) // k # 每个子列表的长度
return [lst[i:i+chunk_size] for i in range(0, n, chunk_size)]
先计算每个子列表的长度,然后用列表切片来实现拆分。
这里需要注意的是,当n不能被k整除时,最后一个子列表的长度会小于或等于其它子列表的长度。如果希望每个子列表的长度必须相等,则可以将chunk_size改为n//k。
调用这个函数,可以这样做:
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> chunk_list(lst, 3)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> chunk_list(lst, 4)
[[1, 2, 3], [4, 5, 6], [7, 8], [9]]
>>> chunk_list(lst, 5)
[[1, 2], [3, 4], [5, 6], [7, 8], [9]]
在TypeScript中,我们可以使用数组的slice方法来实现拆分。假设我们有一个长度为n的数组和一个整数k,我们需要将这个数组分成k个长度相等的子数组。那么可以这样实现:
function chunkArray<T>(arr: T[], k: number): T[][] {
const n = arr.length;
const chunkSize = Math.ceil(n / k); // 每个子数组的长度
return Array.from({length: k},
(_, i) => arr.slice(i * chunkSize, (i + 1) * chunkSize));
}
先计算每个子数组的长度,然后用slice方法来实现拆分。
同样地,当n不能被k整除时,最后一个子数组的长度会小于或等于其它子数组的长度。如果希望每个子数组的长度必须相等,则可以将chunkSize改为Math.floor(n / k)。
调用这个函数,可以这样做:
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(chunkArray(arr, 3)); // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
console.log(chunkArray(arr, 4)); // [[1, 2, 3], [4, 5, 6], [7, 8], [9]]
console.log(chunkArray(arr, 5)); // [[1, 2], [3, 4], [5, 6], [7, 8], [9]]
无论是Python还是TypeScript,将列表拆分成等长的列表都是一件非常容易的事情。只需要计算出每个子列表/子数组的长度,然后用切片/slice方法来实现拆分即可。这也是我们在编程中常常使用的一种技巧。